專利名稱:在存在動(dòng)態(tài)鏈接和加載的情況下動(dòng)態(tài)發(fā)送的調(diào)用的靜態(tài)聯(lián)編的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及軟件的運(yùn)行期編譯。更具體來(lái)說(shuō),本發(fā)明涉及在存在動(dòng)態(tài)鏈接和加載的情況下動(dòng)態(tài)發(fā)送的調(diào)用的靜態(tài)聯(lián)編技術(shù)。
面向?qū)ο蟮恼Z(yǔ)言背后的根本思想是將數(shù)據(jù)和對(duì)該數(shù)據(jù)操作的過(guò)程(或函數(shù))這二者結(jié)合成一個(gè)單一的單元,這個(gè)單元稱作對(duì)象。對(duì)象的函數(shù)一般提供存取由該對(duì)象封裝的數(shù)據(jù)的唯一途徑。存取數(shù)據(jù)的方法是向該對(duì)象發(fā)送一個(gè)消息,指示該對(duì)象去調(diào)用該消息規(guī)定的過(guò)程。
在面向?qū)ο蟮恼Z(yǔ)言中,高效率的消息發(fā)送是最重要的。這是因?yàn)橄l(fā)送是面向?qū)ο蟮某绦蛑幸环N非常頻繁進(jìn)行的操作,而且是在運(yùn)行期進(jìn)行的,因此應(yīng)當(dāng)盡可能地快。然而消息發(fā)送決不是一種無(wú)足輕重的操作。面向?qū)ο蟮恼Z(yǔ)言與能夠在運(yùn)行前判定一個(gè)函數(shù)的地址的過(guò)程性程序設(shè)計(jì)語(yǔ)言(例如C語(yǔ)言)不同的是,必須在運(yùn)行期動(dòng)態(tài)地判定對(duì)已經(jīng)向一個(gè)接收者對(duì)象發(fā)送的消息進(jìn)行處理的過(guò)程,這會(huì)牽涉到很大的檢索量。
為了更好地理解消息發(fā)送的復(fù)雜性,下面將說(shuō)明一種類層次的例子。
圖1表示一個(gè)包含各類的過(guò)程的類層次。類層次1在根部含有一個(gè)父類A3,它定義兩個(gè)虛擬函數(shù)foo()和bar()。虛擬函數(shù)是可以在父類中定義并在關(guān)聯(lián)的子類中重新定義的函數(shù)。類B5和類C7繼承性地包含父類A3的數(shù)據(jù)和過(guò)程。如圖所示,類B5對(duì)虛擬函數(shù)foo()和bar()的哪一個(gè)都不重新定義。然而,類C7重新定義虛擬函數(shù)foo()。當(dāng)類C7的對(duì)象被請(qǐng)求去調(diào)用過(guò)程foo()時(shí),被調(diào)用的過(guò)程將是由類C7而不是父類A3所定義的過(guò)程。類D9和E11也重新定義過(guò)程foo()。
由于一般不可能靜態(tài)地判定出某對(duì)象的類,所以對(duì)與該對(duì)象關(guān)聯(lián)的過(guò)程的準(zhǔn)確搜索是在運(yùn)行期執(zhí)行期間進(jìn)行的,更具體來(lái)說(shuō),是在消息發(fā)送期間進(jìn)行的。例如,假定某過(guò)程的內(nèi)容如下<pre listing-type="program-listing"><![CDATA[test(){…x.foo()…}]]></pre>如果所有的類A~E都在運(yùn)行期執(zhí)行時(shí)加載,要判定應(yīng)該調(diào)用哪個(gè)函數(shù)foo(),取決于哪個(gè)類x是個(gè)實(shí)例。
此外,測(cè)試函數(shù)可以在運(yùn)行期編譯,以提高效能。在運(yùn)行期編譯時(shí),可能只有類A3和B5已經(jīng)加載。于是,從對(duì)已加載類的檢查看來(lái),人們會(huì)推測(cè)消息x.foo()將只調(diào)用A∷foo()。當(dāng)然,如果在運(yùn)行期執(zhí)行期間類C7已經(jīng)加載,這種推測(cè)就錯(cuò)了。
總之,本發(fā)明的實(shí)施例提供在有動(dòng)態(tài)鏈接和加載的情況下對(duì)所發(fā)送的調(diào)用進(jìn)行靜態(tài)聯(lián)編的革新性技術(shù)。本發(fā)明的一個(gè)方面是,一種用于提高函數(shù)在運(yùn)行時(shí)的執(zhí)行性能的方法,包括編譯該函數(shù)-該函數(shù)要么是解釋性的,要么是以前編譯過(guò)的-并標(biāo)識(shí)函數(shù)內(nèi)部對(duì)過(guò)程的調(diào)用。該方法還包括向函數(shù)增加相關(guān)信息。相關(guān)信息被處理成指示函數(shù)的狀態(tài),它含有有關(guān)與該過(guò)程關(guān)聯(lián)的類、名稱和標(biāo)識(shí)的信息。
本發(fā)明的另一個(gè)方面是,一種計(jì)算機(jī)實(shí)現(xiàn)的、用于在運(yùn)行期間分析與系統(tǒng)的一個(gè)類層次關(guān)聯(lián)的一個(gè)第一類的方法,包括標(biāo)記第一類并標(biāo)記作為第一類的超類的一個(gè)第二類以指明這兩個(gè)類之間的關(guān)聯(lián)。然后檢查一個(gè)與該系統(tǒng)關(guān)聯(lián)的編譯函數(shù)。該編譯函數(shù)含有被處理成指示該編譯函數(shù)的有效狀態(tài)以及該編譯函數(shù)的優(yōu)化狀態(tài)的相關(guān)信息。對(duì)編譯函數(shù)的檢查,包括判定何時(shí)在相關(guān)信息中標(biāo)識(shí)第一類和第二類中的至少一個(gè)。當(dāng)判定結(jié)果是第一類或第一類與第二類都在相關(guān)信息中被標(biāo)識(shí)時(shí),就要對(duì)編譯函數(shù)是否無(wú)效進(jìn)行判定。在一個(gè)實(shí)施例中,該方法包括在判定編譯函數(shù)無(wú)效時(shí)對(duì)編譯函數(shù)進(jìn)行反編譯。反編譯該編譯函數(shù)將函數(shù)還原到解釋狀態(tài)。
通過(guò)以下結(jié)合各附圖的詳細(xì)說(shuō)明,本發(fā)明的其它特點(diǎn)和優(yōu)點(diǎn)將變得顯而易見(jiàn)。
參考以下結(jié)合個(gè)附圖的說(shuō)明,可以明白以具體實(shí)施例體現(xiàn)的本發(fā)明。附圖簡(jiǎn)介圖1表示面向?qū)ο蟮沫h(huán)境中包含虛擬函數(shù)的類的一個(gè)類層次。
圖2表示一例可用來(lái)執(zhí)行本發(fā)明實(shí)施例軟件的計(jì)算機(jī)系統(tǒng)。
圖3表示圖1計(jì)算機(jī)系統(tǒng)的系統(tǒng)框圖。
圖4是按照本發(fā)明實(shí)施例的虛擬機(jī)的圖示。
圖5表示在運(yùn)行時(shí)編譯一個(gè)過(guò)程的本發(fā)明實(shí)施例的流程圖。
圖6表示包含相關(guān)信息的一個(gè)已編譯過(guò)程的實(shí)施例。
圖7表示按照本發(fā)明的實(shí)施例在運(yùn)行期執(zhí)行期間類加載的過(guò)程流圖。
圖8表示按照本發(fā)明的實(shí)施例,類層次在內(nèi)存中的表示。
定義機(jī)器指令(或指令)-指示計(jì)算設(shè)備執(zhí)行一個(gè)由操作碼(OP碼)和可選的一個(gè)或多個(gè)操作數(shù)規(guī)定的操作的指令。
虛擬機(jī)指令-軟件仿真的微處理器或計(jì)算機(jī)體系用的指令(也稱虛擬代碼)。
本機(jī)機(jī)器指令-為特定微處理器或計(jì)算機(jī)體系設(shè)計(jì)的指令(也稱本機(jī)代碼)。
過(guò)程(method)-軟件例程(也稱函數(shù)、子例程、過(guò)程、成員函數(shù))運(yùn)行期編譯-在運(yùn)行時(shí)進(jìn)行的對(duì)代碼的編譯。
運(yùn)行期執(zhí)行-運(yùn)行時(shí)刻進(jìn)行的對(duì)代碼的執(zhí)行。
在以下說(shuō)明中,將結(jié)合用JAVA虛擬機(jī)指令(或字節(jié)代碼)靜態(tài)聯(lián)編動(dòng)態(tài)發(fā)送的調(diào)用的優(yōu)選實(shí)施例來(lái)描述本發(fā)明。不過(guò)本發(fā)明并不局限于任何特定語(yǔ)言、計(jì)算機(jī)體系結(jié)構(gòu)或?qū)iT設(shè)備。因此以下對(duì)實(shí)施例的描述的目的是示例性的而不是限制性的。
JavaTM程序設(shè)計(jì)語(yǔ)言是SUN Microsystems公司開發(fā)的一種面向?qū)ο蟮母呒?jí)程序設(shè)計(jì)語(yǔ)言,設(shè)計(jì)得很靈便,能在從小型設(shè)備(例如尋呼機(jī)(pagers)、蜂窩電話和智能卡)到超級(jí)計(jì)算機(jī)的范圍很寬的計(jì)算機(jī)上執(zhí)行。用Java(和其它語(yǔ)言)編寫的計(jì)算機(jī)程序可以被編譯成虛擬機(jī)指令,由Java虛擬機(jī)來(lái)執(zhí)行。總之,Java虛擬機(jī)是一種解碼并執(zhí)行虛擬機(jī)指令的解釋器。
適合Java虛擬機(jī)的虛擬機(jī)指令是字節(jié)代碼,即指令包含一個(gè)或多個(gè)字節(jié)。字節(jié)代碼是按照一種特定的文件格式存儲(chǔ)的,這種文件格式叫作“類文件”。類文件包含類的過(guò)程的字節(jié)代碼。類文件除了包含類的過(guò)程的字節(jié)代碼之外,還包含一個(gè)符號(hào)表以及其它附屬信息。
以一個(gè)或多個(gè)類文件中Java字節(jié)代碼體現(xiàn)的計(jì)算機(jī)程序是獨(dú)立于平臺(tái)的。這種計(jì)算機(jī)程序不加修改就可以在任何能運(yùn)行Java虛擬機(jī)實(shí)現(xiàn)的計(jì)算機(jī)上執(zhí)行。Java虛擬機(jī)是一種對(duì)“通用”計(jì)算機(jī)的軟件仿真程序,這是使得Java虛擬機(jī)的計(jì)算機(jī)程序能獨(dú)立于平臺(tái)的一個(gè)主要因素。
Java虛擬機(jī)可以實(shí)現(xiàn)為軟件解釋器。常規(guī)解釋器在執(zhí)行期間解碼并執(zhí)行所解釋的程序,每次一條指令,這與編譯器不同,后者在源代碼執(zhí)行之前將其解碼成本機(jī)機(jī)器指令,這樣,就不在執(zhí)行期間進(jìn)行解碼。為了能運(yùn)行時(shí)編譯,Java虛擬機(jī)可以既包含解釋器又包含編譯器。一般來(lái)說(shuō),Java虛擬機(jī)是用Java程序設(shè)計(jì)語(yǔ)言以外的其它程序設(shè)計(jì)語(yǔ)言(例如C++程序設(shè)計(jì)語(yǔ)言)編寫的。
圖2表示一例可用于執(zhí)行本發(fā)明實(shí)施例的軟件的計(jì)算機(jī)系統(tǒng)。圖2中的計(jì)算機(jī)系統(tǒng)301包括顯示器303、屏幕305、機(jī)箱307、鍵盤309和鼠標(biāo)311。鼠標(biāo)311可以有一個(gè)或多個(gè)能與圖形用戶界面交互作用的按鈕。機(jī)箱307上安裝了CD-ROM驅(qū)動(dòng)器313、系統(tǒng)內(nèi)存和硬驅(qū)(見(jiàn)圖3),它們可用來(lái)存儲(chǔ)、提取包含實(shí)現(xiàn)本發(fā)明的計(jì)算機(jī)代碼的軟件程序、本發(fā)明所用數(shù)據(jù)等等。盡管圖中是用CD-ROM315來(lái)代表計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)的,但是也可以采用其它計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),包括軟盤、磁帶、快速存儲(chǔ)器、系統(tǒng)內(nèi)存和硬盤。此外,以(例如包括因特網(wǎng)在內(nèi)的網(wǎng)絡(luò)中的)載波實(shí)現(xiàn)的數(shù)據(jù)信號(hào)也可算作是計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)。
圖3表示用于執(zhí)行本發(fā)明實(shí)施例的軟件的計(jì)算機(jī)系統(tǒng)301的系統(tǒng)框圖。如圖2一樣,計(jì)算機(jī)系統(tǒng)301包括監(jiān)視器3033和鍵盤309以及鼠標(biāo)311。計(jì)算機(jī)系統(tǒng)301還包括一些子系統(tǒng),諸如中央處理器351、系統(tǒng)內(nèi)存353,固定存儲(chǔ)器(例如硬驅(qū))355、可卸式存儲(chǔ)器(例如CD-ROM驅(qū)動(dòng)器)357、顯示適配器359、聲卡361、音箱363和網(wǎng)絡(luò)接口365。其它適于本發(fā)明使用的計(jì)算機(jī)系統(tǒng)包含的子系統(tǒng)或多一點(diǎn),或少一點(diǎn)。例如,另一個(gè)計(jì)算機(jī)系統(tǒng)可以有一個(gè)以上的處理器351(例如多處理器系統(tǒng)),或者有高速緩沖存儲(chǔ)器。
計(jì)算機(jī)系統(tǒng)301的總線結(jié)構(gòu)由箭頭367表示。不過(guò)這些箭頭是示意性的,表示能連接各子系統(tǒng)的任何互連方案。例如,可用本地總線將中央處理器連接到系統(tǒng)內(nèi)存和顯示適配器。圖3所示的計(jì)算機(jī)系統(tǒng)301只是適合本發(fā)明的計(jì)算機(jī)系統(tǒng)的一個(gè)例子。其它具有不同子系統(tǒng)配置的計(jì)算機(jī)結(jié)構(gòu)也是可以采用的。
一般來(lái)說(shuō),用Java程序設(shè)計(jì)語(yǔ)言編寫的計(jì)算機(jī)程序,先要編譯成字節(jié)代碼或Java虛擬機(jī)指令,然后再由Java虛擬機(jī)執(zhí)行。字節(jié)代碼先存儲(chǔ)到類文件,再輸入到Java虛擬機(jī)去解釋。虛擬機(jī)可在諸如前面討論圖2和3時(shí)所述計(jì)算機(jī)系統(tǒng)的計(jì)算機(jī)系統(tǒng)上執(zhí)行。圖4是一個(gè)由圖2和3的計(jì)算機(jī)301系統(tǒng)支持的、適于實(shí)現(xiàn)本發(fā)明的虛擬機(jī)圖示。當(dāng)計(jì)算機(jī)程序-例如以JavaTM程序設(shè)計(jì)語(yǔ)言編寫的計(jì)算機(jī)程序-被執(zhí)行時(shí),源代碼410被提供給編譯時(shí)環(huán)境405內(nèi)的編譯器420。編譯器420將源代碼410翻譯成字節(jié)代碼430。總之,當(dāng)源代碼410被軟件開發(fā)者創(chuàng)建時(shí),源代碼410被翻譯成字節(jié)代碼430。
字節(jié)代碼430一般來(lái)說(shuō)可以復(fù)制、下載或以其它方式通過(guò)例如圖3中網(wǎng)絡(luò)接口365的網(wǎng)絡(luò)傳播,或者在諸如圖3中存儲(chǔ)器355的存儲(chǔ)器上存儲(chǔ)。在所述實(shí)施例中,字節(jié)代碼430是獨(dú)立于平臺(tái)的。就是說(shuō),字節(jié)代碼430可以在幾乎任何運(yùn)行在適當(dāng)虛擬機(jī)440的計(jì)算機(jī)系統(tǒng)上執(zhí)行。
字節(jié)代碼430被提供給含有虛擬機(jī)440的運(yùn)行時(shí)環(huán)境435。在一個(gè)實(shí)施例中,虛擬機(jī)可以是JavaTM虛擬機(jī)。運(yùn)行時(shí)環(huán)境435一般可采用諸如圖3中處理器351的一個(gè)或多個(gè)處理器來(lái)執(zhí)行。虛擬機(jī)440包括編譯器442、解釋器444和運(yùn)行時(shí)系統(tǒng)446。字節(jié)代碼430可提供給編譯器442或解釋器444。
如果將字節(jié)代碼430提供給編譯器442,則字節(jié)代碼430中包含的過(guò)程就被編譯成機(jī)器指令。在一個(gè)實(shí)施例中,編譯器442是一個(gè)適時(shí)的編譯器,它能將對(duì)字節(jié)代碼430所含過(guò)程的編譯,推遲到該過(guò)程馬上要被執(zhí)行時(shí)才進(jìn)行。如果將字節(jié)代碼430提供給解釋器444,則字節(jié)代碼430以每次一條字節(jié)代碼的方式被讀入解釋器444。每當(dāng)一條字節(jié)代碼被讀入解釋器444,解釋器444就執(zhí)行該字節(jié)代碼所定義的操作。就是說(shuō),解釋器444“解釋”字節(jié)代碼430,這一點(diǎn)本領(lǐng)域的熟練人員都明白。一般來(lái)說(shuō),解釋器444幾乎是連續(xù)地處理字節(jié)代碼430和執(zhí)行字節(jié)代碼430所關(guān)聯(lián)的操作。
當(dāng)一個(gè)過(guò)程被另一個(gè)過(guò)程調(diào)用,或被運(yùn)行時(shí)環(huán)境435調(diào)用時(shí),如果該過(guò)程是個(gè)解釋過(guò)程,則運(yùn)行時(shí)系統(tǒng)446可以從運(yùn)行時(shí)環(huán)境435以一個(gè)字節(jié)代碼430序列的形式獲取該過(guò)程,該過(guò)程可被解釋器444直接執(zhí)行。另一方面,如果被調(diào)用的過(guò)程是個(gè)尚未編譯的編譯過(guò)程,則運(yùn)行時(shí)系統(tǒng)446也是從運(yùn)行時(shí)環(huán)境435以一個(gè)字節(jié)代碼430序列的形式獲取該過(guò)程,然后在下一步去啟動(dòng)編譯器442。編譯器442于是由字節(jié)代碼430生成機(jī)器指令,所生成的機(jī)器語(yǔ)言指令可由圖3的處理器351直接執(zhí)行。一般來(lái)說(shuō),當(dāng)虛擬機(jī)440中止時(shí),機(jī)器語(yǔ)言指令即被拋棄。
Java類(和接口)是動(dòng)態(tài)加載、鏈接和初始化的。加載是系統(tǒng)尋找類的二進(jìn)制形式(例如類文件)并由該二進(jìn)制形式構(gòu)造一個(gè)類對(duì)象來(lái)代表該類的過(guò)程。類類(Class class)是一種用于存儲(chǔ)或表示類的結(jié)構(gòu)的類。鏈接是采用類的二進(jìn)制形式、將其聯(lián)合到系統(tǒng)的運(yùn)行時(shí)狀態(tài)從而使其可以執(zhí)行的過(guò)程,類的初始化包括執(zhí)行類的靜態(tài)初始化程序和類中所聲明靜態(tài)域的初始化程序。
每個(gè)Java類都有一個(gè)與其關(guān)聯(lián)的常量池。常量池存儲(chǔ)在Java類文件中,起著與符號(hào)表相類似的功能。一般來(lái)說(shuō),常量池中的每一項(xiàng)都由一個(gè)數(shù)字作索引,數(shù)字的范圍是1到常量池中項(xiàng)的數(shù)目。類的過(guò)程通過(guò)索引來(lái)訪問(wèn)常量池中的項(xiàng)。一個(gè)類的過(guò)程不能訪問(wèn)另一個(gè)類的常量池。
除了存儲(chǔ)直接量常量的常量池外,常量池還以符號(hào)形式來(lái)存儲(chǔ)類、過(guò)程、域、接口。用符號(hào)來(lái)存儲(chǔ)這些項(xiàng),意思是存儲(chǔ)標(biāo)志該項(xiàng)的名稱而不是物理地址。換言之,如果類A有個(gè)域F,則A和F的兩個(gè)名稱(連同一個(gè)F的類標(biāo)識(shí))都會(huì)在常量池存儲(chǔ)。由于存儲(chǔ)名稱而不是地址,Java運(yùn)行時(shí)系統(tǒng)在運(yùn)行期動(dòng)態(tài)地解決對(duì)物理地址的符號(hào)引用。
圖5表示在運(yùn)行時(shí)編譯一個(gè)過(guò)程的本發(fā)明實(shí)施例的流程圖。在步驟501,系統(tǒng)判斷編譯一個(gè)過(guò)程是否有益。一般來(lái)說(shuō),編譯一個(gè)過(guò)程能提高該過(guò)程的執(zhí)行性能。然而,許多情況下過(guò)程是不編譯的。舉例來(lái)說(shuō),編譯的過(guò)程比不編譯的過(guò)程需要更多的存儲(chǔ)空間。不管如何,一旦判定某特定過(guò)程應(yīng)當(dāng)編譯,則該過(guò)程在步驟503被編譯。
在步驟505,系統(tǒng)標(biāo)識(shí)一個(gè)對(duì)正在編譯的過(guò)程中的一個(gè)虛擬函數(shù)的調(diào)用。如上所述,對(duì)虛擬函數(shù)的解析是在運(yùn)行時(shí)動(dòng)態(tài)完成的。在Java虛擬機(jī)指令中,這個(gè)調(diào)用是一條invokevirtual指令。
在步驟507,系統(tǒng)在運(yùn)行期編譯時(shí)分析類層次。類層次可能會(huì)指示,當(dāng)前某加載類中只有一個(gè)函數(shù)是虛擬函數(shù)調(diào)用的接收者。如果當(dāng)前加載類中只有一個(gè)函數(shù)是虛擬函數(shù)調(diào)用的接收者,系統(tǒng)就在編譯的過(guò)程中放置一條直接調(diào)用該函數(shù)的指令。此外,系統(tǒng)可將整個(gè)函數(shù)直接插入編譯的過(guò)程。直接插入函數(shù)要求編譯的過(guò)程占用更多的存儲(chǔ)空間,但導(dǎo)致性能更快。
在有些情況下,有一個(gè)以上所加載類的函數(shù)都可能是虛擬函數(shù)調(diào)用的接收者。如果出現(xiàn)這種情況,系統(tǒng)會(huì)直接插入一個(gè)包括直接調(diào)用該函數(shù)和/或直接插入函數(shù)的決策樹或散列表。就是說(shuō),針對(duì)步驟505討論的對(duì)虛擬函數(shù)的調(diào)用可以在步驟509被優(yōu)化。美國(guó)專利申請(qǐng)?zhí)?8/944,332(1997年10月6日提交)中描述了進(jìn)行虛擬函數(shù)調(diào)用的技術(shù),特此引為參考。
在步驟511,系統(tǒng)將相關(guān)信息增加到編譯的過(guò)程。相關(guān)信息可以包含已經(jīng)在步驟509被優(yōu)化的各虛擬函數(shù)的類、函數(shù)名稱和標(biāo)識(shí)(例如參數(shù)類型)。這樣,當(dāng)類在運(yùn)行期執(zhí)行被加載時(shí),就可以檢查某編譯的過(guò)程的相關(guān)信息,以判斷該編譯過(guò)程是否依然有效,是否應(yīng)當(dāng)解優(yōu)化,或者是否應(yīng)當(dāng)再優(yōu)化。后文將結(jié)合圖7說(shuō)明這個(gè)過(guò)程。
圖6表示具有相關(guān)信息的一個(gè)編譯過(guò)程的實(shí)施例。編譯過(guò)程609包括首部603和編譯代碼605。首部603包括相關(guān)信息607等內(nèi)容。在所述實(shí)施例中,相關(guān)信息607是編譯過(guò)程609所有優(yōu)化了的虛擬函數(shù)調(diào)用的類、名稱和標(biāo)識(shí)的一個(gè)列表。盡管這種信息可以按簡(jiǎn)單列表來(lái)存儲(chǔ),但也可以采用各種其它技術(shù)。
圖7表示在運(yùn)行期執(zhí)行期間類加載的過(guò)程流圖。在步驟701,系統(tǒng)接收一個(gè)要在運(yùn)行時(shí)加載的類。系統(tǒng)然后在步驟703標(biāo)記該類及其所有的超類。標(biāo)記類的方法是在類層次結(jié)構(gòu)中設(shè)置一個(gè)布爾域。
在步驟705檢查所有編譯的過(guò)程,以判斷在它們的相關(guān)信息中是否包括任何作了標(biāo)記的類。如上所述,相關(guān)信息可以存儲(chǔ)在編譯過(guò)程的首部中。如果某編譯過(guò)程的相關(guān)信息中含有任何作了標(biāo)記的類,系統(tǒng)就在步驟707判斷是否有匹配的函數(shù)名稱和標(biāo)識(shí)。
通過(guò)判斷是否有匹配的函數(shù)名稱和標(biāo)識(shí),系統(tǒng)要確定類的加載類是否會(huì)導(dǎo)致編譯過(guò)程有效地被無(wú)效掉。換言之,判斷是否有匹配的函數(shù)名稱和標(biāo)識(shí)決定了類的加載是否生成新的、以前未發(fā)現(xiàn)的已經(jīng)優(yōu)化了的虛擬函數(shù)調(diào)用的接收者。
例如再次參見(jiàn)圖1,如果在運(yùn)行期編譯時(shí)只加載了類A3和B5,系統(tǒng)就會(huì)在編譯過(guò)程中放置一個(gè)對(duì)A∷foo()的直接調(diào)用(甚至直接插入整個(gè)函數(shù)),這是因?yàn)橹挥幸粋€(gè)函數(shù)可能是該虛擬函數(shù)調(diào)用的接收者。然而如果在運(yùn)行期執(zhí)行期間,類C7被加載了,那么就可能有該虛擬函數(shù)調(diào)用的另一個(gè)接收者(即C∷foo())。這樣,編譯過(guò)程應(yīng)當(dāng)要么解優(yōu)化,要么再優(yōu)化。美國(guó)專利申請(qǐng)?zhí)?8/944,330(1997年10月6日提交)中描述了對(duì)編譯過(guò)程解編譯的技術(shù),特此引為參考。
如果在步驟707判定編譯過(guò)程有個(gè)匹配,就可以在步驟709對(duì)該編譯過(guò)程解優(yōu)化。對(duì)編譯過(guò)程的解優(yōu)化可以包括將過(guò)程還原或以其它方式“反編譯”到其解釋形式。此外,系統(tǒng)可以再優(yōu)化該編譯過(guò)程,以便將新加載的類考慮進(jìn)去。
圖8表示類層次在內(nèi)存中的一種表示。類801在圖中位于根部,表明它是位于其下的類的超類。如圖所示,類803和805是類801的子類。各個(gè)類的類信息中含有一個(gè)布爾域,用于如圖7中步驟703那樣對(duì)類作標(biāo)記。
此外,各個(gè)類的類信息也可以含有一個(gè)子類指針和一個(gè)兄弟指針。子類指針指向某第一個(gè)子類,本例中是類803。兄弟指針形成一個(gè)由兄弟類組成的鏈接表。如圖所示,類803的兄弟指針指向類805。由于采用子類和兄弟指針,本發(fā)明實(shí)施例的系統(tǒng)就能容易地遍歷類層次。
以上完整地說(shuō)明了本發(fā)明的優(yōu)選實(shí)施例,但還可以采用各種變通、修改與等同方案。很明顯的是,對(duì)上述實(shí)施例作適當(dāng)改進(jìn)后,本發(fā)明也完全適用。例如,盡管以上描述的實(shí)施例是針對(duì)Java虛擬機(jī)指令的,本發(fā)明的原理也完全可以適用于任何其它指令。因此不應(yīng)認(rèn)為以上說(shuō)明限制了本發(fā)明的范圍。
權(quán)利要求
1.一種計(jì)算機(jī)實(shí)現(xiàn)的、用于在運(yùn)行時(shí)提高函數(shù)的執(zhí)行性能的方法,該計(jì)算機(jī)實(shí)現(xiàn)的方法包括編譯該函數(shù);標(biāo)識(shí)對(duì)一個(gè)過(guò)程的調(diào)用,其中對(duì)該過(guò)程的調(diào)用包含在該函數(shù)中;將相關(guān)信息加到該函數(shù),相關(guān)信息被處理成指示該函數(shù)的狀態(tài),它含有有關(guān)與該過(guò)程關(guān)聯(lián)的類、名稱和標(biāo)識(shí)的信息,其中該函數(shù)的狀態(tài)被處理成指示該函數(shù)的有效性和該函數(shù)的編譯狀態(tài)。
2.權(quán)利要求1所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其中的該過(guò)程是個(gè)虛擬過(guò)程,該計(jì)算機(jī)實(shí)現(xiàn)的方法進(jìn)一步包括分析與該函數(shù)相關(guān)聯(lián)的一個(gè)類結(jié)構(gòu),其中對(duì)該類結(jié)構(gòu)的分析包括判斷該虛擬過(guò)程何時(shí)實(shí)際上是該調(diào)用的唯一目標(biāo)。
3.前述任一項(xiàng)權(quán)利要求中所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,該計(jì)算機(jī)實(shí)現(xiàn)的方法進(jìn)一步包括當(dāng)判定該虛擬過(guò)程實(shí)際上是該調(diào)用的唯一目標(biāo)時(shí),向該函數(shù)直接插入該虛擬過(guò)程。
4.權(quán)利要求1、2中任一項(xiàng)權(quán)利要求中所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,該計(jì)算機(jī)實(shí)現(xiàn)的方法進(jìn)一步包括在該函數(shù)中放置一個(gè)對(duì)該虛擬過(guò)程的直接調(diào)用。
5.前述任一項(xiàng)權(quán)利要求中所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,該計(jì)算機(jī)實(shí)現(xiàn)的方法進(jìn)一步包括判斷該函數(shù)何時(shí)適于編譯。
6.前述任一項(xiàng)權(quán)利要求中所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,該計(jì)算機(jī)實(shí)現(xiàn)的方法進(jìn)一步包括加載一個(gè)類,其中該類與該函數(shù)關(guān)聯(lián);判斷該相關(guān)信息何時(shí)指出該函數(shù)有效,該函數(shù)適于解優(yōu)化,以及該函數(shù)適于再優(yōu)化。
7.權(quán)利要求6所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其中該類的加載包括判斷該函數(shù)何時(shí)實(shí)際上不是對(duì)該過(guò)程的唯一調(diào)用者;在判定該函數(shù)實(shí)際上不是該過(guò)程的唯一調(diào)用者時(shí),反編譯該函數(shù)。
8.權(quán)利要求6所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其中該類的加載包括判斷該函數(shù)何時(shí)實(shí)際上不是對(duì)該過(guò)程的唯一調(diào)用者;在判定該函數(shù)實(shí)際上不是該過(guò)程的唯一調(diào)用者時(shí),再編譯該函數(shù)。
9.一種計(jì)算機(jī)實(shí)現(xiàn)的用于在運(yùn)行期間分析與系統(tǒng)的一個(gè)類層次關(guān)聯(lián)的一個(gè)第一類的方法,該計(jì)算機(jī)實(shí)現(xiàn)的方法包括標(biāo)記第一類;標(biāo)記一個(gè)第二類,第二類包含在該類層次中,并且第二類與第一類相關(guān)聯(lián),其中對(duì)第二類的標(biāo)記實(shí)際上是標(biāo)識(shí)第二類與第一類關(guān)聯(lián);檢查一個(gè)與該系統(tǒng)關(guān)聯(lián)的編譯函數(shù),該編譯函數(shù)含有被處理成指示該編譯函數(shù)的有效狀態(tài)以及該編譯函數(shù)的優(yōu)化狀態(tài)的相關(guān)信息,其中對(duì)該編譯函數(shù)的檢查,包括判定何時(shí)在該相關(guān)信息中標(biāo)識(shí)了第一類和第二類中的至少一個(gè);當(dāng)判定第一類與第二類中的至少一個(gè)在相關(guān)信息中被標(biāo)識(shí)時(shí),判斷該編譯函數(shù)是否無(wú)效。
10.權(quán)利要求9所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,進(jìn)一步包括在判定該編譯函數(shù)無(wú)效時(shí)對(duì)該編譯函數(shù)進(jìn)行反編譯,其中反編譯該編譯函數(shù)實(shí)際上將該編譯的函數(shù)還原到解釋形式。
11.權(quán)利要求9所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,進(jìn)一步包括在判定該編譯函數(shù)無(wú)效時(shí)對(duì)該編譯函數(shù)進(jìn)行反編譯,其中反編譯該編譯函數(shù)允許該編譯函數(shù)說(shuō)明第一類。
12.一種適合在運(yùn)行時(shí)提高函數(shù)的執(zhí)行性能的計(jì)算機(jī)系統(tǒng),該計(jì)算機(jī)系統(tǒng)包括一個(gè)處理器;一個(gè)安排為編譯該函數(shù)的編譯器;一個(gè)安排為標(biāo)識(shí)對(duì)一個(gè)過(guò)程的一個(gè)調(diào)用的一個(gè)調(diào)用標(biāo)識(shí)器,對(duì)該過(guò)程的調(diào)用包含在該函數(shù)中;一種適于向該函數(shù)添加相關(guān)信息的機(jī)構(gòu),其中該相關(guān)信息被處理為指示該函數(shù)的狀態(tài),該狀態(tài)被處理為包括該函數(shù)何時(shí)處于有效狀態(tài)。
13.權(quán)利要求12所述的計(jì)算機(jī)系統(tǒng),其中的該過(guò)程是個(gè)虛擬過(guò)程,該計(jì)算機(jī)系統(tǒng)進(jìn)一步包括分析與該函數(shù)相關(guān)聯(lián)的一個(gè)類結(jié)構(gòu)的分析器,其中對(duì)該類結(jié)構(gòu)的分析包括判斷該虛擬過(guò)程何時(shí)實(shí)際上是該調(diào)用的唯一目標(biāo)。
14.權(quán)利要求12和13中任一項(xiàng)所述的計(jì)算機(jī)系統(tǒng),該計(jì)算機(jī)系統(tǒng)進(jìn)一步包括用于當(dāng)判定該虛擬過(guò)程實(shí)際上是該調(diào)用的唯一目標(biāo)時(shí),向該函數(shù)直接插入該虛擬過(guò)程的直接插入器。
15.一種用于在運(yùn)行時(shí)提高函數(shù)的執(zhí)行性能的計(jì)算機(jī)程序產(chǎn)品,該計(jì)算機(jī)程序產(chǎn)品包括編譯該函數(shù)的計(jì)算機(jī)代碼;標(biāo)識(shí)一個(gè)對(duì)一個(gè)過(guò)程的調(diào)用的計(jì)算機(jī)代碼,其中對(duì)該過(guò)程的調(diào)用包含在該函數(shù)中;將相關(guān)信息加到該函數(shù)的計(jì)算機(jī)代碼,該相關(guān)信息被處理成指示該函數(shù)的狀態(tài),該狀態(tài)含有該函數(shù)的一個(gè)有效狀態(tài);存儲(chǔ)該計(jì)算機(jī)代碼的計(jì)算機(jī)可讀介質(zhì)。
16.權(quán)利要求15所述的計(jì)算機(jī)程序產(chǎn)品,其中的該過(guò)程是個(gè)虛擬過(guò)程,該計(jì)算機(jī)程序產(chǎn)品進(jìn)一步包括分析與該函數(shù)相關(guān)聯(lián)的一個(gè)類結(jié)構(gòu)的計(jì)算機(jī)代碼,其中對(duì)該類結(jié)構(gòu)的分析包括判斷該虛擬過(guò)程何時(shí)實(shí)際上是該調(diào)用的唯一目標(biāo)。
17.權(quán)利要求15和16任一項(xiàng)所述的計(jì)算機(jī)程序產(chǎn)品,進(jìn)一步包括當(dāng)判定該虛擬過(guò)程實(shí)際上是該調(diào)用的唯一目標(biāo)時(shí),向該函數(shù)直接插入該虛擬過(guò)程的計(jì)算機(jī)代碼。
18.權(quán)利要求15和16任一項(xiàng)所述的計(jì)算機(jī)程序產(chǎn)品,該計(jì)算機(jī)程序產(chǎn)品進(jìn)一步包括將一個(gè)對(duì)該虛擬過(guò)程的直接調(diào)用放入該函數(shù)的計(jì)算機(jī)代碼。
19.權(quán)利要求15~18任一項(xiàng)所述的計(jì)算機(jī)程序產(chǎn)品,該計(jì)算機(jī)程序產(chǎn)品進(jìn)一步包括判斷該函數(shù)何時(shí)適合于編譯的計(jì)算機(jī)代碼。
20.權(quán)利要求15~19任一項(xiàng)所述的計(jì)算機(jī)程序產(chǎn)品,該計(jì)算機(jī)程序產(chǎn)品進(jìn)一步包括加載一個(gè)類的計(jì)算機(jī)代碼,其中該類與該函數(shù)關(guān)聯(lián);判斷該相關(guān)信息何時(shí)指出該函數(shù)有效、該函數(shù)適于解優(yōu)化、該函數(shù)適于再優(yōu)化的計(jì)算機(jī)代碼。
21.權(quán)利要求15~20任一項(xiàng)所述的計(jì)算機(jī)程序產(chǎn)品,其中的計(jì)算機(jī)可讀介質(zhì)從軟盤、硬盤、磁帶、載波中的數(shù)據(jù)信號(hào)、CD-ROM、系統(tǒng)內(nèi)存和快速存儲(chǔ)器中選擇。
22.一種在計(jì)算環(huán)境中使用的編譯方法結(jié)構(gòu),該編譯方法結(jié)構(gòu)包括一個(gè)編譯代碼部分,該編譯代碼部分被處理為包括一個(gè)優(yōu)化的對(duì)至少一個(gè)虛擬函數(shù)的調(diào)用;一個(gè)首部部分;該首部部分被處理為包括相關(guān)信息,相關(guān)信息包括有關(guān)某個(gè)與至少一個(gè)虛擬函數(shù)相關(guān)聯(lián)的類的信息、有關(guān)至少一個(gè)虛擬函數(shù)的名稱的信息、以及有關(guān)至少一個(gè)虛擬函數(shù)的標(biāo)識(shí)的信息。
全文摘要
本發(fā)明提供在有動(dòng)態(tài)鏈接和加載的情況下對(duì)動(dòng)態(tài)發(fā)送的調(diào)用進(jìn)行靜態(tài)聯(lián)編的技術(shù)。一種用于提高函數(shù)在運(yùn)行時(shí)的執(zhí)行性能的方法,包括編譯該函數(shù)-函數(shù)要么是解釋的,要么是以前編譯過(guò)的-并標(biāo)識(shí)函數(shù)內(nèi)部對(duì)過(guò)程的調(diào)用。該方法還包括向函數(shù)添加相關(guān)信息。相關(guān)信息被處理成指示函數(shù)的狀態(tài),它含有有關(guān)與該過(guò)程關(guān)聯(lián)的類、名稱和標(biāo)識(shí)的信息。
文檔編號(hào)G06F9/44GK1235301SQ9910430
公開日1999年11月17日 申請(qǐng)日期1999年3月24日 優(yōu)先權(quán)日1998年3月24日
發(fā)明者L·巴克, S·米特羅維, U·霍爾茨勒 申請(qǐng)人:太陽(yáng)微系統(tǒng)有限公司