未改變對象管理的制作方法
【專利摘要】一種方法包括:使用針對代碼執(zhí)行的靜態(tài)分析,分析該代碼以判定未改變對象的集合,及修改該代碼以針對未改變對象的該集合的一個或多個成員實行單例模式技術(shù)。該方法也包括輸出該經(jīng)修改代碼。還公開了裝置及程序產(chǎn)品。另一種方法包括訪問來自一客戶端的代碼;及響應(yīng)于該代碼中的任何代碼為源代碼,將該源代碼編譯為目標(biāo)碼,直至來自該客戶端的所有該代碼都包括目標(biāo)碼為止。該方法進(jìn)一步包括:使用針對該目標(biāo)碼執(zhí)行的靜態(tài)分析,分析該目標(biāo)碼以判定未改變對象的集合,及修改該目標(biāo)碼以針對未改變對象的該集合的一個或多個成員實行單例模式技術(shù)。該方法另外包括將該經(jīng)修改目標(biāo)碼返回至該客戶端。
【專利說明】未改變對象管理
【技術(shù)領(lǐng)域】
[0001]本發(fā)明大體而言涉及對諸如目標(biāo)碼、字節(jié)碼、可執(zhí)行碼及庫的代碼的分析,且更具體而言,本發(fā)明涉及對代碼的靜態(tài)分析。
現(xiàn)有技術(shù)
[0002]面向?qū)ο?00)程序設(shè)計具有許多益處。舉例而言,通過00程序設(shè)計,程序員可定義單一對象且然后在程序執(zhí)行期間實例化該對象多次。另外,對象也可自其他對象繼承特性。這允許在不同程序中簡單地重用對象。
[0003]雖然00程序設(shè)計具有許多益處,但也可對此類型的程序設(shè)計進(jìn)行改良。
【發(fā)明內(nèi)容】
[0004]在本發(fā)明的一方面中,一種方法包括:使用針對代碼執(zhí)行的靜態(tài)分析;分析該代碼以判定未改變對象的一集合;及修改該代碼以針對未改變對象的該集合的一個或多個成員實行一單例模式(singleton-pattern)技術(shù)。該方法也包括輸出該經(jīng)修改代碼。還公開了裝置及程序產(chǎn)品。
[0005]在本發(fā)明的另一例示性方面中,公開了一種方法,其包括:訪問來自客戶端的代碼;及響應(yīng)于該代碼中的任何代碼為源代碼,將該源代碼編譯為目標(biāo)碼直至來自該客戶端的所有該代碼都包含目標(biāo)碼為止。該方法進(jìn)一步包括:使用針對該目標(biāo)碼執(zhí)行的靜態(tài)分析;分析該目標(biāo)碼以判定未改變對象的一集合;及修改該目標(biāo)碼以針對未改變對象的該集合的一個或多個成員實行一單例模式技術(shù)。該方法另外包括將該經(jīng)修改目標(biāo)碼返回至該客戶端。
【專利附圖】
【附圖說明】
[0006]圖1為用于未改變對象管理的例示性方法的流程圖;
[0007]圖2為用于分析代碼以判定目標(biāo)未改變對象的集合的例示性方法的流程圖;
[0008]圖3為根據(jù)例示性實施例的用于未改變對象管理的系統(tǒng)的方塊圖;
[0009]圖4為用于判定未改變對象的例示性方法的流程圖;
[0010]圖5為用于判定未改變對象的另一例示性方法的流程圖;
[0011]圖6為用于修改代碼以使得目標(biāo)未改變對象的集合的成員的所有使用都實行單例模式技術(shù)的例示性方法的流程圖;及
[0012]圖7為用于判定不可變對象的例示性方法的流程圖。
【具體實施方式】
[0013]如先前所描述,面向?qū)ο?00)程序設(shè)計具有許多益處。然而,00系統(tǒng)允許創(chuàng)建多個對象,即使在這些對象邏輯上表示同一實體時仍如此。存在與此方法相關(guān)聯(lián)的至少三個問題:[0014]1.在00系統(tǒng)中,對象必須實現(xiàn)兩個方法:equals (等于)及hashCode (哈希碼)。“equals”方法將另一對象作為一參數(shù):如果a及b邏輯上表示同一實體,則a.equals (b)返回真。必須仔細(xì)實現(xiàn)“equals”方法。通常,開發(fā)者測試兩個對象的內(nèi)部字段的相等性,此暗示遞歸地調(diào)用“equals”方法直至在原始(primitive)類型或串的字段上測試到相等性為止?!癶ashCode”方法基于在其上調(diào)用該方法的對象而產(chǎn)生在固定范圍內(nèi)的一數(shù)字。此方法對于何時將對象插入至hashSet (哈希集)中而言非常重要。當(dāng)將一對象插入至hashSet中時,首先計算其hashCode,且接著將該對象插入至hashSet中對應(yīng)于該對象的hashCode的桶(bucket)中。在插入對象之前,該桶經(jīng)掃描以驗證先前未插入另一相等的對象。以此方式,遵照“集合”的數(shù)學(xué)定義,該集合將不具有重復(fù)項。然而,如果沒有一貫地實現(xiàn)“hashCode”及“equals”,則錯誤(稱為“缺陷(bug)”)可能發(fā)生。舉例而言,如果兩個相等對象可最后具有不同hashCode,則它們將被插入于同一 hashSet的不同桶中,從而引起集合中的重復(fù)項。此類型的缺陷的后果可非常嚴(yán)重。
[0015]2.此設(shè)計的另一限制為該設(shè)計可占用大量存儲器。邏輯上等效的對象可在同一系統(tǒng)中實例化多次的事實可引起不必要的存儲器消耗。理想地,如果已實例化了邏輯上等效的對象(“equals”方法返回真),則不應(yīng)再實例化對象。
[0016]3.最后,此方法的另一限制為在每次執(zhí)行“equals”方法時所消耗的時間。如以上所提及的,“equals”方法必須被實現(xiàn)以測試對象的所有內(nèi)部字段的相等性,且此過程觸發(fā)一級聯(lián)(cascading)測試,在該級聯(lián)測試中,針對相等性遞歸地測試該等字段中的所有字段。如果有可能每當(dāng)邏輯上等效于原始對象的另一對象已存在于存儲器中時防止建立對象,則將不必要執(zhí)行這種昂貴的相等性測試,且測試指針相等性(例如,使用==運算符)將是足夠的。
[0017]針對這些問題的解決方案是特設(shè)的(ad-hoc)。開發(fā)者必須實現(xiàn)一高速緩存機制,檢查高速緩存中的現(xiàn)有對象且只要有可能即返回這些對象而非建立新對象。此外,這些解決方案無法應(yīng)用于庫代碼,其中已實現(xiàn)了類而沒有這種高速緩存機制,且類的原代碼甚至可能不可用。
[0018]本文中提出了用以解決至少以上所描述的三個問題的例示性技術(shù)。靜態(tài)分析可靜態(tài)地(亦即,不執(zhí)行代碼)檢測代碼中的對象的相等性。如果將兩個對象視為相等的,則靜態(tài)分析可指示該兩個對象實際上應(yīng)為同一對象。另外,靜態(tài)分析可指導(dǎo)字節(jié)碼重寫器(bytecode rewriter)的工作以修改源代碼不再可用的鏈接庫代碼。
[0019]在一例示性實施例中,由靜態(tài)分析所推薦的修改如下,其中所述修改修改代碼以使得目標(biāo)未修改對象的集合的成員的所有使用都實行單例模式技術(shù):
[0020]1.每個類具有一相關(guān)聯(lián)的高速緩存。
[0021]2.每當(dāng)調(diào)用類的構(gòu)造器時,則咨詢對應(yīng)的高速緩存。
[0022]3.如果具有在構(gòu)造器調(diào)用中所指定的特性的對象已存在于高速緩存中,則不創(chuàng)建該對象。相反,返回來自高速緩存的該對象。
[0023]4.如果具有在構(gòu)造器調(diào)用中所指定的特性的對象尚未存在于高速緩存中,則創(chuàng)建該對象、將該對象添加至高速緩存并返回該對象。
[0024]作為進(jìn)一步的優(yōu)化,可僅在靜態(tài)地檢測到兩個或兩個以上相等對象時應(yīng)用以上修改。進(jìn)一步的修改包括對于已為其創(chuàng)建了高速緩存的類而言,可以用==運算符(即,具有在一列中的兩個等號的運算符)來替換對“equals”方法的調(diào)用。另一優(yōu)化包括“equals”為一單例相關(guān)運算符(singleton-relevant-operator)的場景,其中”==“為其單例相關(guān)運算符等效物。
[0025]本發(fā)明的一例示性實施例并不限于客戶端代碼,而是也可應(yīng)用于庫代碼。關(guān)于庫代碼,典型缺點為源代碼可能不可用?;谧止?jié)碼重新寫入來提出一例示性解決方案,其修改庫的字節(jié)碼。相等性原理(a=b)==>(a.equals(b)==true)保證了以上所列出的修改不修改程序語義(例如,只要靜態(tài)分析為完好的)。
[0026]應(yīng)進(jìn)一步注意,也可將本文中所公開的方法提供為一服務(wù)。舉例而言,在一例示性實施例中,服務(wù)提供商將來到客戶端的站點,提供一高速緩存服務(wù)(例如,數(shù)據(jù)庫),針對客戶端的所有目標(biāo)碼執(zhí)行以上方法以便修改目標(biāo)碼,且接著執(zhí)行經(jīng)修改的目標(biāo)碼。作為另一示例,客戶端可將代碼(例如,源代碼、目標(biāo)碼、可執(zhí)行碼)發(fā)送至服務(wù)器,且服務(wù)器將針對客戶端的所有代碼執(zhí)行本文中所描述的方法以修改代碼,且接著將經(jīng)修改的代碼發(fā)送至客戶端。客戶端也可通過允許對具有客戶端代碼的內(nèi)部系統(tǒng)的服務(wù)器訪問而允許服務(wù)器訪問客戶端的代碼。這些例示性技術(shù)允許客戶端接收以上發(fā)明的操作益處,而不必實際上執(zhí)行本文中所描述的技術(shù)。
[0027]現(xiàn)轉(zhuǎn)向例示性實施例,圖1為用于未改變對象管理的例示性方法100的流程圖。當(dāng)訪問代碼110的系統(tǒng)105時,方法100在區(qū)塊IA中開始。代碼110包括源代碼115 (例如,客戶端源代碼115-1)或目標(biāo)碼120(例如,庫代碼120-1及/或客戶端目標(biāo)碼120-2)中的一個或多個。典型系統(tǒng)將包括(例如)客戶端源代碼115-1及庫目標(biāo)碼120-1。這允許編譯客戶端源代碼HF1 (區(qū)塊1E)且由此創(chuàng)建一“完整的”程序,例如,目標(biāo)碼120的系統(tǒng)121。然而,其他示例可能的。舉例而言,方法100可僅針對庫目標(biāo)碼120-1操作或僅針對源代碼115操作(例如,在區(qū)塊IE中的編譯以創(chuàng)建目標(biāo)碼120之后)。在后一種情況下(其中僅針對源代碼115操作),編譯將不是必要的。
[0028]訪問代碼110的系統(tǒng)105的示例包括接收來自客戶端的代碼110(區(qū)塊1B)、訪問來自存儲器的代碼(區(qū)塊1C),或訪問客戶端的設(shè)施(facility)中的代碼(區(qū)塊1D)?!翱蛻舳恕卑▋?nèi)部客戶(例如,實體的一個部分,其中該實體的另一部分執(zhí)行本文中所描述的技術(shù))或外部客戶(例如,實體的一個部分針對來自另一實體的代碼執(zhí)行本文中所描述的技術(shù))。可通過經(jīng)由例如網(wǎng)絡(luò)接口接收代碼110來執(zhí)行區(qū)塊1B。應(yīng)注意,區(qū)塊IB可能需要將所接收到的代碼放置到存儲器中且在一稍后時間時訪問該存儲器(區(qū)塊1C)。
[0029]使用靜態(tài)分析,靜態(tài)地執(zhí)行區(qū)塊1F、1G及(可選地)1J。亦即,靜態(tài)分析不執(zhí)行目標(biāo)碼120 (或目標(biāo)碼120的系統(tǒng)121),且在不執(zhí)行目標(biāo)碼120的情況下在目標(biāo)碼120上操作。在區(qū)塊IF中,分析目標(biāo)碼120的系統(tǒng)121以判定“目標(biāo)”未改變對象的集合125。作為一例示性實施例,參看圖2詳細(xì)描述目標(biāo)未改變對象的分析及判定。簡言之,目標(biāo)未改變對象是針對單例模式技術(shù)的度量符合特定閾值的未改變對象。未改變對象是在后續(xù)運行時(例如,執(zhí)行)期間不改變的對象。如果對象的值(或其任何實例變量的值)改變,則對象改變。舉例而言,給定復(fù)雜類型的對象(諸如,Employee (雇員)),如果實例employee_123的任一實例變量改變,例如,employee_123.1astname 自 “Doe”改變至“Smith”,則實例 employee_123將改變。靜態(tài)分析可判定對象在后續(xù)運行時期間是否將改變。
[0030]在區(qū)塊IG中,修改目標(biāo)碼120以使得目標(biāo)未改變對象的集合125的成員的所有使用都實行單例模式技術(shù)。亦即,目標(biāo)未改變對象的集合125的所有成員將類的實例化限制為單個對象。在區(qū)塊IH中提供了區(qū)塊IG的一示例,其中判定將單例相關(guān)運算符應(yīng)用于單例的所有實例,且其中在每一實例中以給定單例相關(guān)運算符的單例相關(guān)運算符等效物來替換給定單例相關(guān)運算符。區(qū)塊IG的另一實例示出于區(qū)塊IP中,其中對于目標(biāo)未改變對象的集合125的所有成員,以相關(guān)運算符的單例模式等效物來替換相關(guān)運算符的調(diào)用(例如,以==運算符的使用來替換“equals”方法)。一示例可為hashCode O方法,其可由于Java.lang.0bject (Java中的所有對象的超類)實現(xiàn)hashCode O的事實針對每一 Java對象被調(diào)用。如果特定類型的對象遵循單例模式,則這意味著沒有兩個不同對象可以真來響應(yīng)equalsO。這也簡化了 hashCode O的實現(xiàn),因為,與必須基于每一對象的內(nèi)部表示來計算昂貴的哈希相反,哈希指向?qū)ο蟮闹羔樉妥銐蛄恕?br>
[0031]在區(qū)塊IJ中,返回(例如,輸出)經(jīng)修改目標(biāo)碼140的經(jīng)修改系統(tǒng)130。該輸出可簡單地為輸出至存儲器(例如,數(shù)據(jù)庫)。區(qū)塊IJ的示例包括通過將經(jīng)修改目標(biāo)碼140傳輸至客戶端(區(qū)塊1K)而將經(jīng)修改目標(biāo)碼140返回至客戶端,將經(jīng)修改目標(biāo)碼140返回至存儲器(區(qū)塊1L),或通過將經(jīng)修改目標(biāo)碼140放置于客戶端的設(shè)施中的適當(dāng)位置處(區(qū)塊1M)而將該代碼返回至客戶端。舉例而言,對于后者而言,可自數(shù)據(jù)庫訪問源代碼115(區(qū)塊
1D)且可將經(jīng)修改代碼140放置回數(shù)據(jù)庫中(區(qū)塊1M)。
[0032]在區(qū)塊IN中,例如由一運行時環(huán)境來執(zhí)行經(jīng)修改目標(biāo)碼140的經(jīng)修改系統(tǒng)130。應(yīng)注意,諸如如果方法100用以僅僅針對庫目標(biāo)碼120-1操作,或者僅僅針對客戶端目標(biāo)碼120-2操作且客戶端目標(biāo)碼120-2需要庫目標(biāo)碼120-1以操作而代碼120-1不可用,則可能不執(zhí)行區(qū)塊IN。
[0033]現(xiàn)參看圖2,示出了用于分析代碼且判定目標(biāo)未改變對象的集合125的例示性方法200的流程圖。方法200為可如何執(zhí)行圖1的區(qū)塊IF的示例。
[0034]在本發(fā)明的上下文中存在兩個成本維度:存儲器使用及運行時負(fù)載。如以上所描述的,關(guān)于具有一對象的幾個實例且每一實例都具有相同值的一個缺點是計算機存儲器被浪費。如果一 Java String對象存在三個實例,每一實例都具有例如值“No”(否),則存儲器的(至少)6個字節(jié)被使用,每一字符一個字節(jié)。如果這三個對象從不改變值,則實際上僅需要具有“No”的值的一個String對象實例,從而僅需要2個字節(jié)。另外(也如以上所描述的),Object (對象)方法,例如equals O及hashCode O ,添加至在給定運行時上放置的負(fù)載。舉例而言,為了針對值=“No”的兩個String對象執(zhí)行equalsO方法,運行時首先必須獲取并比較第一字符“N”,且接著獲取并比較第二字符“O”。作為替代,如果僅使用單個被高速緩存的值,則運行時僅需要執(zhí)行實例的一個數(shù)值比較(==)。另一方面,高速緩存單例具有一初始成本。實際上,每當(dāng)構(gòu)造實現(xiàn)單例模式的類的新對象時,高速緩存邏輯必須觀察高速緩存以了解是否已構(gòu)造并高速緩存了具有等同特性的對象(例如,對于String對象而言,為具有字符的相同序列的String)。如果程序試圖構(gòu)造同一對象的多個實例,則該初始成本被克服。如果僅構(gòu)造具有特定特性的一個實例,則不需要高速緩存且初始成本可得以節(jié)省。在區(qū)塊2A中,獲得單例模式技術(shù)的每一次執(zhí)行的成本。在區(qū)塊2B中,獲得可接受的最小替換成本閾值。
[0035]區(qū)塊2C涉及識別所有不可變對象且將每一不可變對象添加到unchangedObjects (未改變對象)集合210。不可變對象為在后續(xù)運行時執(zhí)行期間不可改變的對象。不可變對象擁有比未改變對象更強的屬性。未改變對象在特定程序的執(zhí)行期間不改變。不可變對象也不改變,但此屬性不依賴于特定程序;它們不改變是因為它們不可變。在構(gòu)造器已完成執(zhí)行之后,不可變對象的狀態(tài)在其整個生命期中保持相同。本質(zhì)上,不可變對象也未改變,但相反說法未必為真。
[0036]如以上所提及的,不可變對象不可改變。而這是由這些對象所屬于的類所強加的屬性,且因此,有可能在不必分析整個程序的情況下判定不可變對象。一種用于計算不可變對象的分析以如下方式進(jìn)行(參見圖7)。對于代碼(例如,軟件程序)的每個類而言(區(qū)塊7A),該分析驗證:在類的構(gòu)造器已完成其執(zhí)行之后,自該類的任何對象的字段可到達(dá)的任何字段都不經(jīng)由直接訪問(例如,a.f=x經(jīng)由直接訪問改變字段f)或經(jīng)由間接訪問(a.setF(x)為經(jīng)由方法setF來修改字段f的間接方式)而被改變(區(qū)塊7B)。此分析需要考慮可通過調(diào)用該類的任何方法而執(zhí)行的所有可能動作(區(qū)塊7C)。如果尚未考慮完所有可能動作(區(qū)塊7C =否),則方法700在區(qū)塊7B中繼續(xù);否則(區(qū)塊7C =是),方法700在區(qū)塊7D中繼續(xù)。如果尚未檢查完所有類(區(qū)塊7D =否),則方法700在區(qū)塊7A中繼續(xù);否則(區(qū)塊7D =是),方法700在區(qū)塊7E中結(jié)束。
[0037]返回圖2,在區(qū)塊2D中,識別從未改變的所有對象,且將這些對象中的每一個添加至unchangedObjects集合210。這些對象可以如下方式來識別(參見圖4)。首先,構(gòu)建所分析的程序的調(diào)用圖及指向圖(points-to graph)(圖4的方法的區(qū)塊4A)。調(diào)用圖393為其中每一節(jié)點表示一方法且每一條邊表示一方法調(diào)用的圖。指向圖394為其中節(jié)點表示實例抑或指針的偶圖。自實例至指針的邊表示該實例具有由該指針?biāo)硎镜淖侄蔚氖聦?。自指針至實例的邊表示該指針可在程序?zhí)行期間指向該實例的事實。為了檢測特定類型的未改變對象,該分析首先查找該類型的構(gòu)造器節(jié)點(區(qū)塊4B)。構(gòu)造器節(jié)點為表示對構(gòu)造器的調(diào)用的那些節(jié)點,在這些構(gòu)造器中對象被實例化。
[0038]存在可實現(xiàn)的若干對象抽象(區(qū)塊4C)。一例示性對象抽象包括基于對象的分配點(allocation site)來抽象化對象。換言之,如果兩個對象共享同一分配點,則將該兩個對象視為等效的(且因此,將該兩個對象抽象化到同一靜態(tài)表示)。更細(xì)粒度的抽象是可能的,由此(例如)如果兩個對象不僅共享同一分配點,而且共享分配點所在的方法的調(diào)用者,則可將該兩個對象視為等效的。較粗粒度的抽象也是可能的,由此(例如)如果兩個對象具有同一類型,則將該兩個對象視為等效的。
[0039]該分析包括接著考慮對象抽象且查找指向圖中由該抽象可傳遞地到達(dá)的所有指針(區(qū)塊4D),判定在構(gòu)建已完成之后是否存在修改由該指針?biāo)赶虻闹档娜魏握{(diào)用圖節(jié)點(區(qū)塊4E)。如果調(diào)用圖節(jié)點存在(區(qū)塊4F=是),則將對應(yīng)于該調(diào)用圖節(jié)點的對象添加至未改變對象的集合(區(qū)塊4G),諸如unchangedObjects。如果不是這樣(區(qū)塊4F =否),則方法400在區(qū)塊4D中繼續(xù)。如果尚未檢查完所有對象(區(qū)塊4H=否),則方法400也在區(qū)塊4D中繼續(xù)。如果已檢查了所有方法(區(qū)塊4H=是),則判定是否已檢查了所有抽象(區(qū)塊41)。如果不是這樣,則該方法在區(qū)塊4C中繼續(xù);如果是這樣,則該方法在區(qū)塊41中結(jié)束。此時(在區(qū)塊2D之后),unchangedObjects集合210應(yīng)包含在目標(biāo)碼120的系統(tǒng)121的后續(xù)運行時執(zhí)行期間不改變的所有對象。
[0040]另外,為了識別從未改變的所有對象,對于特定類型的未改變對象的特定類型的組合,可判定一未改變對象由該組合而產(chǎn)生。舉例而言,兩個串(該兩者都是未改變對象)的串接產(chǎn)生一未改變對象。此方法示出于圖5中。應(yīng)注意,此方法可與其他方法(諸如,圖4中所示出的方法)組合。
[0041]返回圖2,區(qū)塊2E至21將unchangedObjects集合210中的對象自所有未改變對象減少至目標(biāo)未改變對象的集合125。目標(biāo)未改變對象的集合125是其中針對單例模式技術(shù)的度量符合特定閾值的那些未改變對象。這防止了單例模式技術(shù)在目標(biāo)碼120的系統(tǒng)121上強加比節(jié)省大(例如,由閾值判定的)某一預(yù)定量的成本。
[0042]對于unchangedObjects中的每一對象(區(qū)塊2E),判定單例模式技術(shù)針對一選定對象所產(chǎn)生的節(jié)省(區(qū)塊2F)。區(qū)塊2F可通過判定每隔多久使用該對象而完成。作為另一示例,區(qū)塊2F可通過判定將equals方法或hashCodeO方法或該兩者應(yīng)用于此對象的次數(shù)而完成,其中可以==運算符來替換該“equals”方法。如果自在區(qū)塊2F中所判定的節(jié)省減去在區(qū)塊2A中所判定的成本的差大于在區(qū)塊2B中所判定的閾值(區(qū)塊2G =是),則方法200在區(qū)塊21中繼續(xù)。否則(區(qū)塊2G =否),方法200在區(qū)塊2H中繼續(xù),其中自unchangedObjects集合210刪除該未改變對象。方法200在區(qū)塊21中繼續(xù)。
[0043]在區(qū)塊21中,判定unchangedObjects集合210中是否無更多對象。如果在unchangedObjects集合210中存在更多對象(區(qū)塊21 =否),則方法200在區(qū)塊2E中繼續(xù),其中選擇另一未改變對象。如果是這樣(區(qū)塊21 =是),則方法200在區(qū)塊2J中結(jié)束。
[0044]參看圖3,示出根據(jù)一例示性實施例的用于未改變對象管理的系統(tǒng)300的方塊圖。系統(tǒng)300包括計算機系統(tǒng)305,該計算機系統(tǒng)305包含一個或多個存儲器310、一個或多個處理器320、及一個或多個網(wǎng)絡(luò)接口 330。該一個或多個存儲器310、一個或多個處理器320及一個或多個網(wǎng)絡(luò)接口 330系經(jīng)由一個或多個總線307互連。應(yīng)注意,該一個或多個總線307也可為諸如無限頻帶(Infiniband)通信鏈路的通信鏈路。該一個或多個網(wǎng)絡(luò)接口 330可為有線或無線網(wǎng)絡(luò)接口。
[0045]該一個或多個存儲器310包括代碼350、未改變對象355、經(jīng)修改代碼365、指向圖393及調(diào)用圖394。代碼350可包括源代碼115、目標(biāo)碼120或任何其他代碼。未改變對象355可包括unchangedObjects集合210中的未改變對象。亦即,未改變對象355可包括所有未改變對象(例如,在圖2的區(qū)塊2D之后所發(fā)現(xiàn)的未改變對象),及在已執(zhí)行了區(qū)塊2E至21之后未改變對象的通??s減的集合。在一例示性實施例中,未改變對象355為unchangedObjects集合210。經(jīng)修改代碼365為在已針對代碼350執(zhí)行方法100及200之后出現(xiàn)的經(jīng)修改代碼。
[0046]指令370為計算機可讀程序代碼,當(dāng)由一個或多個處理器320執(zhí)行時,該計算機可讀代碼使得計算機系統(tǒng)305執(zhí)行本文中所描述的動作中的一個或多個。指令370包括靜態(tài)分析引擎375,其包括一未改變對象識別器380及一代碼修改器385。指令370進(jìn)一步包括一編譯器390及一運行時環(huán)境395。
[0047]靜態(tài)分析引擎375創(chuàng)建指向圖393及調(diào)用圖394。未改變對象識別器380執(zhí)行(例如)區(qū)塊IF及圖2 (包括圖4及圖5)的方法200且使用一靜態(tài)分析來識別未改變對象355。應(yīng)注意,方法200的分析僅僅需要使用區(qū)塊2C及2D來判定未改變對象,且將不執(zhí)行其他區(qū)塊2A、2B、2E至21。在此例示性實施例中,將不判定目標(biāo)未改變對象,且未改變對象355將包括所有發(fā)現(xiàn)的未改變對象。
[0048]代碼修改器385執(zhí)行如以上參考區(qū)塊1G、1H、1P及IJ描述的代碼修改。應(yīng)注意,此結(jié)構(gòu)僅僅為例示性的。例如,未改變對象識別器380及代碼修改器385可形成為單個程序,或可進(jìn)一步細(xì)分。
[0049]編譯器390用于將源代碼115編譯為目標(biāo)碼120。編譯器390執(zhí)行圖1的區(qū)塊1E。運行時環(huán)境395用于執(zhí)行經(jīng)修改目標(biāo)碼140的經(jīng)修改系統(tǒng)130 (例如,圖1的區(qū)塊IN)。
[0050]在一實例中,代碼350是經(jīng)由一個或多個網(wǎng)絡(luò)接口 330作為客戶端代碼335接收的,該客戶端代碼335可為客戶端源代碼115-1、客戶端目標(biāo)碼120-2,或該兩者。在圖1中所描述的分析及經(jīng)修改代碼365的判定之后,經(jīng)由一個或多個網(wǎng)絡(luò)接口將經(jīng)修改代碼365作為經(jīng)修改的客戶端代碼340而傳送至客戶端。
[0051]已描述了修改代碼以使得目標(biāo)未改變對象的集合的成員的所有使用都實行單例模式技術(shù)的幾個示例,現(xiàn)參看圖6更具體地描述另一技術(shù)。圖6的許多組件先前已在上文進(jìn)行了簡要描述。在一例不性實施例中,方法600在將每一類與一高速緩存610相關(guān)聯(lián)時開始(區(qū)塊6A)。每當(dāng)調(diào)用一類的構(gòu)造器時,咨詢對應(yīng)的高速緩存610 (區(qū)塊6B)。如果具有在構(gòu)造器調(diào)用中所指定的特性的對象已存在于高速緩存中(區(qū)塊6C =是),則不創(chuàng)建該對象(區(qū)塊6G)。相反,返回來自高速緩存的對象(區(qū)塊6H)。
[0052]如果具有在構(gòu)造器調(diào)用中所指定的特性的對象尚未存在于高速緩存中(區(qū)塊6C=否),則創(chuàng)建該對象(區(qū)塊6D)、將其添加至高速緩存(區(qū)塊6E)并返回(區(qū)塊6F)。在區(qū)塊61中,判定是否已檢查了所有代碼。如果不是這樣(區(qū)塊61 =否),則方法600在區(qū)塊6B中繼續(xù)。如果是這樣(區(qū)塊61 =是),則方法600在區(qū)塊6J中結(jié)束。
[0053]所屬【技術(shù)領(lǐng)域】的技術(shù)人員知道,本發(fā)明可以實現(xiàn)為系統(tǒng)、方法或計算機程序產(chǎn)品。因此,本公開可以具體實現(xiàn)為以下形式,即:可以是完全的硬件、也可以是完全的軟件(包括固件、駐留軟件、微代碼等),還可以是硬件和軟件結(jié)合的形式,本文一般稱為“電路”、“模塊”或“系統(tǒng)”。此外,在一些實施例中,本發(fā)明還可以實現(xiàn)為在一個或多個計算機可讀介質(zhì)中的計算機程序產(chǎn)品的形式,該計算機可讀介質(zhì)中包含計算機可讀的程序代碼。
[0054]可以采用一個或多個計算機可讀的介質(zhì)的任意組合。計算機可讀介質(zhì)可以是計算機可讀信號介質(zhì)或者計算機可讀存儲介質(zhì)。計算機可讀存儲介質(zhì)例如可以是一但不限于——電、磁、光、電磁、紅外線、或半導(dǎo)體的系統(tǒng)、裝置或器件,或者任意以上的組合。計算機可讀存儲介質(zhì)的更具體的例子(非窮舉的列表)包括:具有一個或多個導(dǎo)線的電連接、便攜式計算機磁盤、硬盤、隨機存取存儲器(RAM)、只讀存儲器(ROM)、可擦式可編程只讀存儲器(EPR0M或閃存)、光纖、便攜式緊湊磁盤只讀存儲器(CD-ROM)、光存儲器件、磁存儲器件、或者上述的任意合適的組合。在本文件中,計算機可讀存儲介質(zhì)可以是任何包含或存儲程序的有形介質(zhì),該程序可以被指令執(zhí)行系統(tǒng)、裝置或者器件使用或者與其結(jié)合使用。
[0055]計算機可讀的信號介質(zhì)可以包括在基帶中或者作為載波一部分傳播的數(shù)據(jù)信號,其中承載了計算機可讀的程序代碼。這種傳播的數(shù)據(jù)信號可以采用多種形式,包括——但不限于——電磁信號、光信號或上述的任意合適的組合。計算機可讀的信號介質(zhì)還可以是計算機可讀存儲介質(zhì)以外的任何計算機可讀介質(zhì),該計算機可讀介質(zhì)可以發(fā)送、傳播或者傳輸用于由指令執(zhí)行系統(tǒng)、裝置或者器件使用或者與其結(jié)合使用的程序。
[0056]計算機可讀介質(zhì)上包含的程序代碼可以用任何適當(dāng)?shù)慕橘|(zhì)傳輸,包括一但不限于一無線、電線、光纜、RF等等,或者上述的任意合適的組合。
[0057]可以以一種或多種程序設(shè)計語言或其組合來編寫用于執(zhí)行本發(fā)明操作的計算機程序代碼,所述程序設(shè)計語言包括面向?qū)ο蟮某绦蛟O(shè)計語言一諸如Java、Smalltalk、C++,還包括常規(guī)的過程式程序設(shè)計語言一諸如”C”語言或類似的程序設(shè)計語言。程序代碼可以完全地在用戶計算機上執(zhí)行、部分地在用戶計算機上執(zhí)行、作為一個獨立的軟件包執(zhí)行、部分在用戶計算機上部分在遠(yuǎn)程計算機上執(zhí)行、或者完全在遠(yuǎn)程計算機或服務(wù)器上執(zhí)行。在涉及遠(yuǎn)程計算機的情形中,遠(yuǎn)程計算機可以通過任意種類的網(wǎng)絡(luò)一包括局域網(wǎng)(LAN)或廣域網(wǎng)(WAN)—連接到用戶計算機,或者,可以連接到外部計算機(例如利用因特網(wǎng)服務(wù)提供商來通過因特網(wǎng)連接)。
[0058]下面將參照本發(fā)明實施例的方法、裝置(系統(tǒng))和計算機程序產(chǎn)品的流程圖和/或框圖描述本發(fā)明。應(yīng)當(dāng)理解,流程圖和/或框圖的每個方框以及流程圖和/或框圖中各方框的組合,都可以由計算機程序指令實現(xiàn)。這些計算機程序指令可以提供給通用計算機、專用計算機或其它可編程數(shù)據(jù)處理裝置的處理器,從而生產(chǎn)出一種機器,這些計算機程序指令通過計算機或其它可編程數(shù)據(jù)處理裝置執(zhí)行,產(chǎn)生了實現(xiàn)流程圖和/或框圖中的方框中規(guī)定的功能/操作的裝置。
[0059]也可以把這些計算機程序指令存儲在能使得計算機或其它可編程數(shù)據(jù)處理裝置以特定方式工作的計算機可讀介質(zhì)中,這樣,存儲在計算機可讀介質(zhì)中的指令就產(chǎn)生出一個包括實現(xiàn)流程圖和/或框圖中的方框中規(guī)定的功能/操作的指令裝置(instructionmeans)的制造品(article of manufacture)0
[0060]也可以把計算機程序指令加載到計算機、其它可編程數(shù)據(jù)處理裝置、或其它設(shè)備上,使得在計算機、其它可編程數(shù)據(jù)處理裝置或其它設(shè)備上執(zhí)行一系列操作步驟,以產(chǎn)生計算機實現(xiàn)的過程,從而使得在計算機或其它可編程裝置上執(zhí)行的指令能夠提供實現(xiàn)流程圖和/或框圖中的方框中規(guī)定的功能/操作的過程。
[0061]本文中所使用的術(shù)語僅出于描述特定實施例的目的且并不意欲限制本發(fā)明。如在本文中所使用,除非上下文另外清楚地指示,否則單數(shù)形式“一”及“該”意欲也包括復(fù)數(shù)形式。應(yīng)進(jìn)一步理解,術(shù)語“包含”和/或“包括”在用于本說明書中時指定所陳述的特征、整體、步驟、操作、組件及/或組件的存在,但不排除一個或多個其他特征、整體、步驟、操作、組件、組件及/或以上各者的群組的存在或添加。
[0062]以下權(quán)利要求中的所有裝置或步驟加功能組件的對應(yīng)結(jié)構(gòu)、材料、動作及等效物意欲包括用于結(jié)合如具體主張的其他所主張組件執(zhí)行該功能的任何結(jié)構(gòu)、材料或動作。已出于說明及描述目的呈現(xiàn)了本發(fā)明的描述,但該描述并不意欲為詳盡的或?qū)⒈景l(fā)明限于所公開的形式。在不脫離本發(fā)明的范疇及精神的情況下,本領(lǐng)域的技術(shù)人員將顯而易見許多修改及變化。選擇并描述了實施例以便最佳地解釋本發(fā)明的原理及實際應(yīng)用,且使本領(lǐng)域的其他技術(shù)人員能夠針對具有適合于所涵蓋的特定用途的各種修改的各種實施例來理解本發(fā)明。
【權(quán)利要求】
1.一種方法,包括: 使用針對代碼執(zhí)行的靜態(tài)分析,分析該代碼以判定未改變對象的集合,及修改該代碼以針對未改變對象的該集合的一個或多個成員實行單例模式技術(shù);以及 輸出該經(jīng)修改代碼。
2.如權(quán)利要求1的方法,進(jìn)一步包括執(zhí)行該經(jīng)修改代碼。
3.如權(quán)利要求1的方法,其中該代碼包括庫目標(biāo)碼,分析進(jìn)一步包括分析該庫目標(biāo)碼以判定未改變對象的集合,修改進(jìn)一步包括修改該庫目標(biāo)碼以針對未改變對象的該集合的一個或多個成員實行單例模式技術(shù),且輸出進(jìn)一步包括輸出該經(jīng)修改的庫目標(biāo)碼。
4.如權(quán)利要求1的方法,其中該代碼包括源代碼,且該方法進(jìn)一步包括在分析之前將該源代碼編譯為目標(biāo)碼,且分析該代碼進(jìn)一步包括分析該目標(biāo)碼以判定未改變對象的集合,及修改該目標(biāo)碼以針對未改變對象的該集合的一個或多個成員實行單例模式技術(shù)。
5.如權(quán)利要求1的方法,其中修改進(jìn)一步包括: 判定其中將單例相關(guān)運算符應(yīng)用于單例的所有實例,及以該單例相關(guān)運算符的單例相關(guān)運算符等效物來替換每一實例中的該單例相關(guān)運算符。
6.如權(quán)利要求5的方 法,其中“equals”為一單例相關(guān)運算符,其中“==”為其單例相關(guān)運算符等效物。
7.如權(quán)利要求1的方法,其中分析進(jìn)一步包括針對未改變對象的該集合中的每一未改變對象: 計算通過將該單例模式技術(shù)用于該未改變對象而獲得的節(jié)省超過應(yīng)用該單例模式技術(shù)的成本的量是否達(dá)到閾值,及 響應(yīng)于計算通過將該單例模式技術(shù)用于該未改變對象而獲得的所述節(jié)省超過應(yīng)用該單例模式技術(shù)的該成本的量未達(dá)到該閾值,自未改變對象的該集合移除該未改變對象。
8.如權(quán)利要求7的方法,進(jìn)一步包括通過判定每隔多久使用該對象來計算所述節(jié)省。
9.如權(quán)利要求7的方法,進(jìn)一步包括通過判定每隔多久針對該對象使用“equals”方法及” hashCode”方法來計算所述節(jié)省。
10.如權(quán)利要求1的方法,其中分析進(jìn)一步包括針對特定類型的未改變對象的特定類型的組合,判定一未改變對象產(chǎn)生自該組合。
11.如權(quán)利要求9的方法,其中串接為該特定類型的組合,且串為該特定類型的未改變對象,由此都是未改變對象的兩個串的串接導(dǎo)致一未改變對象。
12.—種計算機程序產(chǎn)品,包括: 其中體現(xiàn)有計算機可讀程序代碼的計算機可讀存儲介質(zhì),該計算機可讀程序代碼包括: 用于使用針對代碼執(zhí)行的靜態(tài)分析,分析該代碼以判定未改變對象的集合,及修改該代碼以針對未改變對象的該集合的一個或多個成員實行單例模式技術(shù)的計算機可讀程序代碼;以及 用于輸出該經(jīng)修改代碼的計算機可讀程序代碼。
13.如權(quán)利要求12的計算機程序產(chǎn)品,進(jìn)一步包括用于執(zhí)行該經(jīng)修改代碼的計算機可讀程序代碼。
14.如權(quán)利要求12的計算機程序產(chǎn)品,其中該代碼包括庫目標(biāo)碼,分析進(jìn)一步包括分析該庫目標(biāo)碼以判定未改變對象的集合,修改進(jìn)一步包括修改該庫目標(biāo)碼以針對未改變對象的該集合的一個或多個成員實行單例模式技術(shù),且輸出進(jìn)一步包括輸出該經(jīng)修改的庫目標(biāo)碼。
15.如權(quán)利要求12的計算機程序產(chǎn)品,其中該代碼包括源代碼,且該計算機可讀程序代碼進(jìn)一步包括在分析之前將該源代碼編譯為目標(biāo)碼,且分析該代碼進(jìn)一步包括分析該目標(biāo)碼以判定未改變對象的集合,及修改該目標(biāo)碼以針對未改變對象的該集合的一個或多個成員實行單例模式技術(shù)。
16.如權(quán)利要求12的計算機程序產(chǎn)品,其中修改進(jìn)一步包括: 判定其中將單例相關(guān)運算符應(yīng)用于單例的所有實例,及以該單例相關(guān)運算符的單例相關(guān)運算符等效物來替換每一實例中的該單例相關(guān)運算符。
17.如權(quán)利要求12的計算機程序產(chǎn)品,其中分析進(jìn)一步包括針對未改變對象的該集合中的每一未改變對象: 計算通過將該單例模式技術(shù)用于該未改變對象而獲得的節(jié)省超過應(yīng)用該單例模式技術(shù)的成本的是否超過了閾值,及 響應(yīng)于計算通過將該單例模式技術(shù)用于該未改變對象而獲得的所述節(jié)省超過應(yīng)用該單例模式技術(shù)的該成本的量未達(dá)到該閾值,自未改變對象的該集合移除該未改變對象。
18.如權(quán)利要求12的計算機程序產(chǎn)品,其中分析進(jìn)一步包括針對特定類型的未改變對象的特定類型的組合,判定一未改變對象產(chǎn)生自該組合。
19.一種裝置,包括: 包括計算機代碼的至 少一個存儲器;及 至少一個處理器, 該計算機代碼控制該至少一個處理器以執(zhí)行至少如下操作: 使用針對代碼執(zhí)行的靜態(tài)分析,分析該代碼以判定未改變對象的集合,及修改該代碼以針對未改變對象的該集合的一個或多個成員實行單例模式技術(shù);以及 輸出該經(jīng)修改代碼。
20.如權(quán)利要求19的裝置,其中修改進(jìn)一步包括: 判定其中將單例相關(guān)運算符應(yīng)用于單例的所有實例,及以該單例相關(guān)運算符的單例相關(guān)運算符等效物來替換每一實例中的該單例相關(guān)運算符。
21.如權(quán)利要求19的裝置,其中分析進(jìn)一步包括針對未改變對象的該集合中的每一未改變對象: 計算通過將該單例模式技術(shù)用于該未改變對象而獲得的節(jié)省超過應(yīng)用該單例模式技術(shù)的成本的量是否達(dá)到了閾值,及 響應(yīng)于計算通過將該單例模式技術(shù)用于該未改變對象而獲得的所述節(jié)省超過應(yīng)用該單例模式技術(shù)的該成本的量未達(dá)到該閾值,自未改變對象的該集合移除該未改變對象。
22.如權(quán)利要求19的裝置,其中,分析進(jìn)一步包括針對特定類型的未改變對象的特定類型的組合,判定一未改變對象產(chǎn)生自該組合。
23.—種方法,包括: 訪問來自客戶端的代碼; 響應(yīng)于該代碼中的任何代碼為源代碼,將該源代碼編譯為目標(biāo)碼,直至來自該客戶端的所有代碼都包括目標(biāo)碼為止; 使用針對該目標(biāo)碼執(zhí)行的靜態(tài)分析,分析該目標(biāo)碼以判定未改變對象的集合,及修改該目標(biāo)碼以針對未改變對象的該集合的一個或多個成員實行單例模式技術(shù);及將該經(jīng)修改目標(biāo)碼返回至該客戶端。
24.如權(quán)利要求23的方法,其中該方法在一客戶端設(shè)施處執(zhí)行。
25.如權(quán)利要求23的方法,其中來自該客戶端的該代碼是經(jīng)由一個或多個網(wǎng)絡(luò)接口接收的,且其中該經(jīng) 修改目標(biāo)碼經(jīng)由該一個或多個網(wǎng)絡(luò)接口而返回至該客戶端。
【文檔編號】G06F9/44GK103443761SQ201180048429
【公開日】2013年12月11日 申請日期:2011年10月11日 優(yōu)先權(quán)日:2010年10月8日
【發(fā)明者】P·森通澤, P·K·馬爾金, M·皮斯托亞 申請人:國際商業(yè)機器公司