專利名稱:在運行時期間優(yōu)化計算機(jī)程序的系統(tǒng)與方法
技術(shù)領(lǐng)域:
本發(fā)明一般地涉及計算機(jī)系統(tǒng),更具體地說,涉及優(yōu)化用于執(zhí)行的程序代碼的程序工具。
背景技術(shù):
計算機(jī)程序常常包括基于變量值的條件求值,例如“如果X=A,則進(jìn)入步驟10000;否則進(jìn)入步驟10010”。取決于變量“X”的當(dāng)前值,條件可以是真或假。例如,當(dāng)程序處于調(diào)試階段時,變量“調(diào)試”被設(shè)置為“真”。存在這樣的計算機(jī)程序,其對變量“調(diào)試”進(jìn)行條件求值以確定是否應(yīng)當(dāng)記錄對于調(diào)試目的有用的某些數(shù)據(jù)。換句話說,調(diào)試變量的狀態(tài)被用在判定步驟中以確定是否記錄數(shù)據(jù)。判定步驟可以是“如果調(diào)試=真,則將XYZ數(shù)據(jù)寫入日志;否則跳到下一步驟”。因此,如果調(diào)試變量被設(shè)置為“真”,則指定數(shù)據(jù)被寫入日志。然而,如果程序沒有處于調(diào)試階段,例如程序已經(jīng)完成了調(diào)試,則不需要將指定數(shù)據(jù)寫入日志。因此,在調(diào)試階段之后,程序開發(fā)者使用公知的程序工具將變量“調(diào)試”設(shè)置為“假”,從而XYZ數(shù)據(jù)將不被寫入日志。并且,程序開發(fā)者將使用該工具來聲明“調(diào)試”變量現(xiàn)在被固定(或不可變)為“假”。在Sun Microsystems Java(tm)編程語言和其它運行時語言中,該聲明將由程序員輸入作為被寫入源代碼中的命令。該命令意味著,一旦在執(zhí)行期間變量第一次被設(shè)置為預(yù)期的固定狀態(tài),它將永不改變。在編譯期間,編譯器記錄該聲明,監(jiān)視該變量,并且如果該變量的值被試圖從其初始值改變,就返回錯誤代碼。
美國專利6,728,952公開了一種用于標(biāo)識總是為真或總是為假(即,“空”)的斷言的計算機(jī)系統(tǒng),并且指明如果IF語句所依賴的表達(dá)式被標(biāo)識為空斷言,則用于該IF語句的代碼可以被優(yōu)化。這是因為IF語句所依賴的表達(dá)式將總是為真或者將總是為假。該專利還指明已經(jīng)存在專用計算機(jī)系統(tǒng),其能夠確定斷言是否為空。
Auslander等人的名為“Fast,Effective Dynamic Compilation”的出版物,SIGPLAN Notices,vol.31,no.5,第149-159頁,1996年5月,公開了多種運行時優(yōu)化技術(shù)。例如,運行時常量可以成為指令立即數(shù)(instruction immediate)而非存儲器負(fù)載,可以對它們應(yīng)用常量傳導(dǎo)與合并,基于它們的條件分支可以被消除,并且它們控制的循環(huán)可以被完全打開。
Calder等人的名為“Value Profiling”的出版物,Proceedings of 13thAnnual IEEE/ACM International Symposium on Micro architecture,第259-269頁,1997年,公開了在編譯時將變量標(biāo)識為不變量或常量,這允許編譯器執(zhí)行包括常量合并、代碼專用和部分求值的優(yōu)化。
本發(fā)明的目的是進(jìn)一步優(yōu)化對程序的執(zhí)行。
發(fā)明內(nèi)容
本發(fā)明蘊含于用于在運行時期間優(yōu)化計算機(jī)程序的系統(tǒng)、方法和程序產(chǎn)品中。在運行時期間,確定計算機(jī)程序是否調(diào)用包括對固定變量的條件求值的方法,并且除了返回執(zhí)行計算機(jī)程序外對固定變量的求值不產(chǎn)生任何成果。如果是,則為計算機(jī)程序的后續(xù)迭代從計算機(jī)程序刪除對包括條件求值的方法的調(diào)用。從而,計算機(jī)程序的后續(xù)執(zhí)行將產(chǎn)生如同條件求值已被執(zhí)行的相同結(jié)果。如果對固定變量的求值產(chǎn)生某些成果,則不從計算機(jī)程序的后續(xù)執(zhí)行中刪除對包括條件求值的方法的調(diào)用。
根據(jù)本發(fā)明的特征,對第一所述方法的調(diào)用被包含在計算機(jī)程序內(nèi)的第二方法中,并且對固定變量的求值導(dǎo)致直接返回到第二方法。對固定變量的條件求值不產(chǎn)生對計算機(jī)程序之外的另一方法的調(diào)用或者計算機(jī)程序所需的任何計算或其它求值。在計算機(jī)程序的第一次迭代期間,變量值被設(shè)置為固定值,并且與該變量相關(guān)聯(lián)的參量被計算。
圖1是結(jié)合了本發(fā)明的計算機(jī)的框圖。
圖2是根據(jù)本發(fā)明的計算機(jī)程序工具的流程圖。
具體實施例方式
現(xiàn)在將參考附圖詳細(xì)說明本發(fā)明。圖1圖示出結(jié)合并執(zhí)行了本發(fā)明的計算機(jī)10。計算機(jī)10包括公知的CPU 12、操作系統(tǒng)14、運行時解釋器XX 15、RAM 16、硬盤17、ROM 18、存儲設(shè)備讀取器20和網(wǎng)絡(luò)適配器卡22。讀取器20可以是存儲媒體23的CD ROM讀取器、DVD讀取器、軟盤讀取器或其它讀取器,在存儲媒體23上,包含本發(fā)明的計算機(jī)程序產(chǎn)品可以被輸入到計算機(jī)10。替代性地,網(wǎng)絡(luò)適配器卡20可以從計算機(jī)可讀網(wǎng)絡(luò)24(例如因特網(wǎng)或LAN)讀取包含本發(fā)明的計算機(jī)程序。網(wǎng)絡(luò)24還包括傳播媒體,用以將計算機(jī)程序輸送到計算機(jī)10以被讀取到計算機(jī)10中。一旦被輸入到計算機(jī)10,則包含本發(fā)明的計算機(jī)程序工具30被存儲在RAM 16或硬盤17中,用于在CPU 12上執(zhí)行。圖1還圖示出根據(jù)本發(fā)明由CPU 12執(zhí)行并由計算機(jī)程序工具30優(yōu)化的另一計算機(jī)程序32。計算機(jī)程序32的功能或性質(zhì)對本發(fā)明來說不重要,編寫計算機(jī)程序32的計算機(jī)語言也不重要。計算機(jī)程序32已被編譯器(未示出)編譯為運行時/目標(biāo)代碼格式,以在計算機(jī)10中執(zhí)行。作為示例,計算機(jī)程序32可以用Sun Microsystems JAVA(tm)編程語言編寫。
圖2圖示出根據(jù)本發(fā)明由程序工具30執(zhí)行的處理。在步驟100中,程序工具30獲取要被優(yōu)化并執(zhí)行的程序32的“下一個”指令。在步驟100的第一次迭代期間,這應(yīng)當(dāng)是程序32的第一個指令,并且判定102通向判定104。(在程序32最后的指令被執(zhí)行之后,則判定102將通向步驟106,步驟106是程序32和程序工具30的執(zhí)行的結(jié)束。)在判定102之后,在肯定分支處,程序工具30確定程序32的指令是否是調(diào)用/調(diào)入(call/invoke)諸如“方法”的函數(shù)的命令(判定104)?!胺椒ā笔敲嫦?qū)ο笮问降暮瘮?shù),所述函數(shù)例如是記錄數(shù)據(jù)、計算值、寫入數(shù)據(jù)庫、通過網(wǎng)絡(luò)通信或鏈接數(shù)據(jù)串。如果指令不是調(diào)入函數(shù)的命令(判定104,否定分支),則程序工具30將程序32的指令傳送至運行時解釋器XX 15用以執(zhí)行(步驟110)。然而,如果指令是調(diào)入方法的命令(判定104,肯定分支),則程序工具30調(diào)入該方法,即調(diào)用該方法開始執(zhí)行(步驟112)。然后,被調(diào)用的方法開始執(zhí)行。這可以包括被調(diào)用的方法準(zhǔn)備隨后將用于其自身執(zhí)行或調(diào)用另一方法而需要的任何參量(步驟116)。作為示例,參量可以包括程序32的使用者的身份、計算系數(shù)、用于數(shù)據(jù)庫的數(shù)據(jù)、網(wǎng)絡(luò)端點地址或數(shù)據(jù)串。當(dāng)存在這樣的參量時,參量的準(zhǔn)備可以包括計算、字符串的連接、數(shù)據(jù)的獲取等。在準(zhǔn)備參量之后,所調(diào)用的函數(shù)執(zhí)行其操作指令或語句,例如對變量進(jìn)行條件求值、計算結(jié)果、寫入數(shù)據(jù)庫、連接到端點或鏈接數(shù)據(jù)串(步驟120)。在被調(diào)用方法的每個指令或語句被傳送到運行時解釋器XX 15用于執(zhí)行時,程序工具30監(jiān)視程序指令或語句的性質(zhì)(步驟122)。在該監(jiān)視期間,程序工具30確定被調(diào)用方法的當(dāng)前程序指令或語句是否將對變量進(jìn)行條件求值并且按照變量值行動,所述變量被預(yù)先聲明為固定的(判定130)。在該程序步驟中進(jìn)行條件求值的所有值都是固定的。當(dāng)程序32是以源代碼編寫的時候,這些聲明將通過使用另一程序工具而出現(xiàn),并且這些變量為固定的指示將已被編譯到程序32的目標(biāo)代碼中。這在圖1中由程序32中的參考數(shù)據(jù)象征性示出,即變量“X是固定的并且A是固定的”。下面是這種條件求值的示例“如果X=A,則跳到步驟10000;否則跳到步驟10010C”、“如果X=真且A=假,則跳到步驟10000,否則跳到步驟10010C”、“當(dāng)X>A時,則跳到步驟10000;否則跳到步驟10010C”。因此,通過尋找任何這些類型的條件求值,執(zhí)行對判定130的確定。該確定是基于源代碼中用于變量的修正關(guān)鍵字而做出的,所述修正關(guān)鍵字被編譯在目標(biāo)代碼中。這種條件求值的形式列表被存儲在存儲器中。如果被調(diào)用方法的任何程序指令或語句都沒有對固定的變量進(jìn)行條件求值(判定130,否定分支),則程序工具30循環(huán)回步驟100以取得并處理程序32中的下一個程序指令或語句。然而,如果被調(diào)用方法的任何程序指令或語句將要對固定變量進(jìn)行條件求值(判定130,肯定分支),則程序工具30確定固定變量的條件求值是否總是導(dǎo)致立即/直接返回到被調(diào)用方法的調(diào)入者,而不存在得自該方法的任何成果,例如沒有對另一方法的調(diào)用、沒有有用的計算、沒有表達(dá)式求值、以及沒有語句求值(判定132)。程序工具30通過檢查前述條件求值的最終指令來做出該確定,以確定是否是返回到調(diào)入者。如果出現(xiàn)了某些成果(例如最終指令不是返回指令),則程序工具30進(jìn)入步驟100以獲取并處理程序32的下一個指令或語句。然而,如果沒有從固定變量的條件求值中獲得任何成果(除了返回到調(diào)用者)(判定132,肯定分支),則在步驟134中,程序工具30將刪除調(diào)入方法中對被調(diào)入方法的調(diào)用(并從而避免執(zhí)行條件求值)以及調(diào)入方法中計算用于對被調(diào)入方法的調(diào)用的參量所需的程序指令。步驟134中的刪除優(yōu)化了程序32的后續(xù)執(zhí)行,因為現(xiàn)在在程序32的后續(xù)執(zhí)行期間將只處理更少的指令。程序30通過重寫目標(biāo)代碼來執(zhí)行實際的指令刪除。運行時環(huán)境XX 15包含用于修改(刪除)當(dāng)前運行的目標(biāo)代碼的工具。在上述步驟中由程序30標(biāo)識出每個要被刪除的語句。然后,程序30從方法調(diào)入返回,即,將程序計數(shù)器設(shè)置為等于得自條件求值的程序指令(步驟148)。然后,程序30前進(jìn)到步驟100以獲取并處理程序32的這個指令。
盡管由程序32調(diào)用的方法或者由該方法調(diào)用的任何方法所執(zhí)行的操作對本發(fā)明來說不重要,但是下面是一個示例。在該示例中,程序32定義了含有兩個函數(shù)方法的類C。下面是類C的偽代碼類C的偽代碼ClassBodyClassBodyDeclarationsFieldDeclarationPCI Field XConstructorDeclarationSimpleTypeNameFormalParameterList
EmptyConstructorBodyAssignment X=TrueMethodDeclarationMethod AMethodDeclarationMethod B類C的前述定義在主體的前三行中指示出變量“X”是固定的或構(gòu)造后不可變的(“PCI”)。類C的前述定義在主體的中間六行中指示出不存在用于類C的構(gòu)造函數(shù)的參數(shù),并且變量“X”的值為“真”。類C的前述定義在主體的最后四行中指示出方法A和方法B被包含在類C中。
在該示例中,下面是方法A的偽代碼方法A的偽代碼Method AMethodHeaderMethodModifiers(opt)ResultType MethodDeclarator Throws(opt)ResultTypeVoidMethodDeclaratorFormal ParameterListEmptyMethodBodyBlockMethodInvocation(Method B)FormalParameterListExpressionString1+String2+String3
方法A的前述定義在方法頭部段中指示出該方法沒有返回值并且沒有接受參量。方法A的前述定義在方法主體段中指示出方法A包含調(diào)入方法B的調(diào)用。方法A的前述定義在方法主體段中指示出調(diào)入方法B的調(diào)用需要通過連接字符串(定義程序32的使用者)而形成的參量,即,連接String1+String2+String3。在調(diào)用方法B之前,方法A在調(diào)入方法B之前連接前述的字符串。
在該示例中,下面是方法B的偽代碼方法B的偽代碼Method BMethodHeaderMethodModifiers(opt)ResultType MethodDeclarator Throws(opt)ResultTypeVoidMethodDeclaratorFormal ParameterListString1MethodBodyBlockIfThenElseStatementIf(X not equal True)ThenExpression involving String1ElseReturn方法B的前述定義在方法頭部段中指示出方法B沒有返回值,并且接受了被標(biāo)為“String1”的串類型的一個參量。方法B的前述定義在方法主體段中指示出方法B執(zhí)行對變量“X”的條件求值。即,“如果X不為真,則執(zhí)行涉及String1的操作”。如果X為真,則立即/直接返回到調(diào)入者”(不發(fā)生任何成果,例如,不調(diào)入另一方法、不執(zhí)行有用的計算、沒有表達(dá)式求值以及沒有語句求值)。
在程序32的執(zhí)行期間,運行時解釋器XX產(chǎn)生類C的新實例。在創(chuàng)建類C的該實例期間,運行時解釋器XX記錄變量“X”是固定的(如編譯器所指出的那樣),并且向程序32提供用于方法A的尋址信息。當(dāng)程序32隨后被調(diào)入并執(zhí)行時,它調(diào)入方法A,方法A在步驟112中開始執(zhí)行。作為響應(yīng),方法A首先在步驟116中通過連接String1+String2+String3來計算用于調(diào)用方法B的參量。在計算參量之后,方法A在步驟120中調(diào)入方法B。在方法A和方法B被執(zhí)行的同時,程序30在步驟122中監(jiān)視方法A和方法B的指令語句。在該監(jiān)視期間,程序30注意到,在方法B中,變量“X”是固定的并且正與另一固定變量或固定值進(jìn)行比較,并且結(jié)果是立即/直接返回到調(diào)入者(方法A)而不產(chǎn)生任何成果(判定130,肯定分支)。從而,通過從程序32的方法A中去除對方法B的調(diào)用以及相關(guān)聯(lián)的計算用于對方法B的調(diào)用的參量的指令,程序30優(yōu)化程序32。在程序30優(yōu)化方法A之后,在步驟134中,包括在方括號[]中的下述步驟被從方法A中去除方法A的優(yōu)化偽代碼Method AMethodHeaderMethodModifiers(opt)ResultType MethodDeclarator Throws(opt)ResultTypeVoidMethodDeclaratorFormal ParameterListEmptyMethodBodyBlock[MethodInvocation(Method B)] [X][Expression][String1+String2+String3]這樣,在程序32的下一次迭代期間,當(dāng)程序32調(diào)用方法A時,方括號[]中包括的前述步驟不會被執(zhí)行。這減少了程序32的處理時間。
基于前述內(nèi)容,已公開了一種在運行時期間優(yōu)化計算機(jī)程序的系統(tǒng)、方法與程序產(chǎn)品。然而,在不脫離本發(fā)明的范圍的條件下,可以做出多種修改和替換形式。因此,本發(fā)明是以示例性而非限制性的方式被公開的,并且應(yīng)該參考以下權(quán)利要求來確定本發(fā)明的范圍。
權(quán)利要求
1.一種用于在運行時期間優(yōu)化計算機(jī)程序的方法,所述進(jìn)程包括下述步驟在運行時期間,確定所述計算機(jī)程序是否調(diào)用包括對固定變量的條件求值的方法,并且對所述固定變量的求值沒有產(chǎn)生除返回執(zhí)行所述計算機(jī)程序之外的任何成果,以及如果是,則為所述計算機(jī)程序的后續(xù)迭代從所述計算機(jī)程序中刪除對包括所述條件求值的所述方法的調(diào)用,其中所述計算機(jī)程序的所述后續(xù)執(zhí)行將產(chǎn)生如同所述條件求值已被執(zhí)行的相同結(jié)果,以及如果不是,則不從所述計算機(jī)程序的所述后續(xù)執(zhí)行中刪除對包括所述條件求值的所述方法的所述調(diào)用。
2.如權(quán)利要求1所述的方法,其中對第一所述方法的調(diào)用被包括在所述計算機(jī)程序內(nèi)的第二方法中,并且對所述固定變量的求值導(dǎo)致直接返回到所述第二方法。
3.如權(quán)利要求1所述的方法,其中對所述固定變量的所述條件求值沒有導(dǎo)致對所述計算機(jī)程序之外的另一方法的調(diào)用或者所述計算機(jī)程序所需的任何計算或其它求值。
4.如權(quán)利要求1所述的方法,其中在所述計算機(jī)程序的第一次迭代期間,所述變量的值被設(shè)置為固定值,并且與所述變量相關(guān)聯(lián)的參量被計算。
5.如權(quán)利要求1所述的方法,其中所述計算機(jī)程序包括對固定變量的條件求值,并且對所述固定變量的求值沒有產(chǎn)生任何成果,并且還包括下述步驟如果所述變量具有除了所述固定值之外的值,則從所述計算機(jī)程序中刪除用于計算繼續(xù)進(jìn)行所需的參量的指令。
6.一種用于在運行時期間優(yōu)化計算機(jī)程序的系統(tǒng),所述系統(tǒng)包括用于在運行時期間確定所述計算機(jī)程序是否調(diào)用包括對固定變量的條件求值的方法的裝置,并且對所述固定變量的求值沒有產(chǎn)生除返回執(zhí)行所述計算機(jī)程序之外的任何成果,以及如果是則用于為所述計算機(jī)程序的后續(xù)迭代從所述計算機(jī)程序中刪除對包括所述條件求值的所述方法的調(diào)用的裝置,其中所述計算機(jī)程序的所述后續(xù)執(zhí)行將產(chǎn)生如同所述條件求值已被執(zhí)行的相同結(jié)果,并且如果不是,則該裝置在所述計算機(jī)程序的所述后續(xù)執(zhí)行中保留對包括所述條件求值的所述方法的所述調(diào)用。
7.如權(quán)利要求6所述的系統(tǒng),其中對第一所述方法的調(diào)用被包括在所述計算機(jī)程序內(nèi)的第二方法中,并且對所述固定變量的求值導(dǎo)致直接返回到所述第二方法。
8.如權(quán)利要求6所述的系統(tǒng),其中對所述固定變量的所述條件求值沒有導(dǎo)致對所述計算機(jī)程序之外的另一方法的調(diào)用或者所述計算機(jī)程序所需的任何計算或其它求值。
9.如權(quán)利要求6所述的系統(tǒng),其中在所述計算機(jī)程序的第一次迭代期間,所述變量的值被設(shè)置為固定值,并且與所述變量相關(guān)聯(lián)的參量被計算。
10.如權(quán)利要求6所述的系統(tǒng),其中所述計算機(jī)程序包括對固定變量的條件求值,并且對所述固定變量的求值沒有產(chǎn)生任何成果,并且還包括用于如果所述變量具有除了所述固定值之外的值則從所述計算機(jī)程序中刪除用于計算繼續(xù)進(jìn)行所需的參量的指令的裝置。
11.一種用于在運行時期間優(yōu)化計算機(jī)程序的計算機(jī)程序產(chǎn)品,所述計算機(jī)程序產(chǎn)品包括計算機(jī)可讀媒體;用于實現(xiàn)前述方法權(quán)利要求中的任何一種方法的程序指令。
12.一種用于在運行時期間優(yōu)化計算機(jī)程序的方法,所述計算機(jī)程序包括對第一方法的調(diào)用,所述第一方法包括對第二方法的調(diào)用,所述進(jìn)程包括下述步驟在運行時期間,確定所述第二方法是否包括對固定變量的條件求值,使得所述第二方法的執(zhí)行沒有產(chǎn)生除返回到所述第一方法之外的任何成果,以及如果是,則在所述第一方法中刪除對所述第二方法的所述調(diào)用,以及如果不是,則不在所述第一方法中刪除對所述第二方法的所述調(diào)用。
13.如權(quán)利要求12所述的方法,其中所述第一方法還包括用于計算對所述第二方法的所述調(diào)用所需的參量的指令,并且所述第二方法包括對固定變量的條件求值,使得所述第二方法的執(zhí)行不產(chǎn)生除返回到所述第一方法之外的任何成果,并且還包括下述步驟從所述第一方法中刪除用于計算對所述第二方法的所述調(diào)用所需的所述參量的所述指令。
全文摘要
用于在運行時期間優(yōu)化計算機(jī)程序的系統(tǒng)、方法與程序產(chǎn)品。在運行時期間,確定計算機(jī)程序是否調(diào)用包括對固定變量的條件求值的方法,并且對固定變量的求值沒有產(chǎn)生除返回執(zhí)行計算機(jī)程序之外的任何成果。如果是,則為計算機(jī)程序的后續(xù)迭代而從計算機(jī)程序中刪除對包括所述條件求值的方法的調(diào)用。從而,計算機(jī)程序的后續(xù)執(zhí)行將產(chǎn)生如同所述條件求值已被執(zhí)行的相同結(jié)果。如果對固定變量的求值產(chǎn)生了某些成果,則不從計算機(jī)程序的后續(xù)執(zhí)行中刪除對包括所述條件求值的方法的調(diào)用。
文檔編號G06F9/44GK1834907SQ20061005738
公開日2006年9月20日 申請日期2006年3月14日 優(yōu)先權(quán)日2005年3月15日
發(fā)明者B·M·奧康奈爾, R·E·內(nèi)斯比特, K·E·沃甘 申請人:國際商業(yè)機(jī)器公司