專利名稱:用于在多平臺環(huán)境的指令選擇的裝置和方法
技術(shù)領(lǐng)域:
本發(fā)明一般地涉及計算機(jī)系統(tǒng)。更具體地,涉及用于在多平臺計算環(huán)境中選擇可執(zhí)行指令的方法和裝置。
軟件平臺和硬件體系結(jié)構(gòu)的連續(xù)增加確保了計算機(jī)用戶和計算機(jī)程序開發(fā)員將要在他們的職業(yè)生涯中考慮許多不同的計算機(jī)環(huán)境。應(yīng)注意的是,在本論述的上下文中,術(shù)語“環(huán)境”指在與移植(ported)軟件交互的計算機(jī)系統(tǒng)中的元件的完整范圍。這些元件典型地包括一個處理器和一個操作系統(tǒng)以及I/O設(shè)備,程序庫,網(wǎng)絡(luò),或,在一些情況中的較大的人或物理系統(tǒng)。甚至在數(shù)準(zhǔn)-標(biāo)準(zhǔn)平臺(例如,IBM-PC,UNIX)已經(jīng)廣泛使用了,但仍然不是通用的計算機(jī)環(huán)境。為了維持和擴(kuò)展它們的生存能力,因此,多數(shù)軟件程序?qū)⒆罱K面對被移植的要求,使得基于現(xiàn)有版本軟件的可執(zhí)行版本的軟件程序在一個新的計算環(huán)境中產(chǎn)生。因此,可移植性,或一個軟件程序被移植到一個給定環(huán)境(即,目標(biāo))的能力正在被普遍認(rèn)識為一個對于多數(shù)軟件程序而言的所希望的屬性。因此,軟件程序在不同計算平臺之間的可移植性通過延長了它的生命周期和擴(kuò)展了它所期望應(yīng)用的的安裝范圍而明顯增強(qiáng)了軟件程序的價值。如在本領(lǐng)域所公知的,一個軟件程序可以包括一個應(yīng)用程序,一個系統(tǒng)程序,或一個程序的組件,相反一個軟件系統(tǒng)是軟件程序的集合。
如果一個軟件系統(tǒng)的移植費用是和在某種程度上小于在新目標(biāo)環(huán)境中重新編寫程序的費用,則該軟件程序是可移植的。如果一個軟件程序可以零成本來移植,則它的可移植性是極佳的,當(dāng)然這在現(xiàn)實中是不可能的。實際上,這由兩種基本可移植性協(xié)議,第一種是二元可移植性(即,移植軟件程序的可執(zhí)行形式)和第二種為源可移植性(即,移植表示軟件程序的源代碼)。雖然,二元可移植性協(xié)議典型地提供了幾個優(yōu)點(主要與移植的容易度有關(guān)),但它只能用于將軟件程序移植到非常相似的環(huán)境中,從而嚴(yán)重限制了它的可用性。相反,因為源可移植性協(xié)議采取了源代碼的可用性,它們典型地提供了使一個特殊軟件程序適用于更寬范圍的計算環(huán)境的更大能力。
不幸地,多數(shù)移植過程仍然在使用ad hoc方法,這導(dǎo)致了低效率的技術(shù),這實質(zhì)上添加到了將一個軟程序從一個平臺移植到另一個平臺上的成本。舉例來說,一個編譯器將一個計算機(jī)程序由一個語言翻譯為另一個,在翻譯過程中捕捉語法上的任何錯誤。最普通地,一個編譯器將一些諸如C++或COBOL的高級語言翻譯為機(jī)器語言,使得計算機(jī)可以無需任何解釋地理解。為了完全移植一個編譯器,我們必須完成幾個任務(wù)以使所移植的編譯器可以成功地,和以一個高度可靠的方式,執(zhí)行它所設(shè)計的功能,同時在一個和最初為它所構(gòu)思的平臺完全不同的平臺上運(yùn)行。
所要求完成以完全移植一個編譯器的幾個任務(wù)包括正確指令選擇,因為通常許多不同的指令類型可以匹配相同的機(jī)器獨立語義(machineindependent semantic)。一個簡單的例子是定義為將一個“1”的常數(shù)加到一個數(shù)值上的操作,其中“1”的值可以表示為一個8比特或32比特精確整數(shù)。在另一個例子中,對于一個在Pentium和PentiumII的微處理器系列中發(fā)現(xiàn)的X86處理器中,浮點單元(FPU)具有3個精確模式,其中它可以執(zhí)行不同的操作,諸如加法和減法。在其中語義要求,例如,以24比特的精度來舍入,和一個FPU控制字已將FPU精度設(shè)為,例如,53比特的情況中,對于X86編譯器,選擇在體系結(jié)構(gòu)描述中定義的,產(chǎn)生一個53比特的精度而不引入附加舍入的指令是低效率和不正確的。
另外的例子包括多硬件平臺,諸如生成為V8或V9處理器的SPARC微處理器。當(dāng)生成為V8系統(tǒng)時,只有V8類型指令可被執(zhí)行,然而,當(dāng)生成為V9系統(tǒng)時,V8和V9類型的指令都可被執(zhí)行。因此,基本上,在其中V8系統(tǒng)運(yùn)行的情況中,只能選擇V8類型的指令,因為V9指令不能在V8系統(tǒng)中執(zhí)行。
我們還希望不僅選擇那些將在一個特殊平臺上正確執(zhí)行的指令,而且選擇那些通過減少執(zhí)行“成本”而改善處理器總性能的指令。例如,將諸如減法的一個特殊操作的結(jié)果保存在一個存儲位置通常比將相同結(jié)果保存在一個數(shù)據(jù)寄存器中更加要求計算機(jī)資源(即,成本更高)。因此,成本最有效的方式,可能的話,是選擇其成本在可選擇的所有指令中最低的指令。使用上面的例子,我們由成本有效的觀點可以體會到應(yīng)選擇與那些將它們各自結(jié)果保存在存儲器中一個位置的指令相反的將其結(jié)果保存在一個寄存器中的指令。
因此,所希望的是定義一個選擇協(xié)議的能力,從而不僅選擇了正確的指令用以在多平臺計算環(huán)境中執(zhí)行,而且執(zhí)行所選擇的這些指令的成本最低。
廣泛而言,本發(fā)明涉及一個用于生成一個具有在多平臺環(huán)境中的指令選擇器的編譯器的改進(jìn)方法,裝置和計算機(jī)系統(tǒng)。本發(fā)明可以多種方式實現(xiàn),包括一個方法,一個計算機(jī)系統(tǒng)和一個裝置。下面將討論本發(fā)明的幾個實施例。
根據(jù)本發(fā)明的一個方面,我們希望有一個用于編譯一個具有內(nèi)嵌指令選擇器的平臺特定編譯器的裝置。該裝置包括一組用戶定義的依賴平臺的編譯器體系結(jié)構(gòu)描述符和指令選擇所使用的指令判定(instructionpredicates),該描述符描述了一個特殊硬件平臺的相應(yīng)的體系結(jié)構(gòu)特征。一個體系結(jié)構(gòu)描述符編譯器將用戶定義的依賴平臺的編譯器體系結(jié)構(gòu)描述符轉(zhuǎn)換為一個依賴平臺的編譯器源代碼和被一個主編譯器轉(zhuǎn)換為依賴平臺的目標(biāo)碼與指令選擇器目標(biāo)碼的指令選擇器源。該編譯器由獨立于平臺的編譯器目標(biāo)碼和依賴平臺的編譯器目標(biāo)碼結(jié)合指令選擇器目標(biāo)碼來組成。
如用于生成一個平臺特定編譯器的方法,它提供了一組用于描述一個依賴特定硬件平臺的編譯器的相應(yīng)體系結(jié)構(gòu)特征的用戶定義的依賴平臺的編譯器體系結(jié)構(gòu)描述符和指令判定。該描述符和指令判定被一個體系結(jié)構(gòu)描述符編譯器轉(zhuǎn)換為依賴平臺的編譯器源代碼和指令選擇器源代碼。該依賴平臺的編譯器源代碼和指令選擇器源代碼被編譯為依賴平臺的目標(biāo)碼和指令選擇器目標(biāo)碼。具有內(nèi)嵌的指令選擇器的平臺特定編譯器由依賴于平臺的目標(biāo)碼,指令選擇器代碼和獨立于平臺的編譯器目標(biāo)碼構(gòu)成。
在另一個實施例中,公開了一個平臺特定編譯器。該編譯器包括一個具有內(nèi)嵌的指令選擇器目標(biāo)碼和適于在特殊硬件平臺上執(zhí)行的獨立于平臺的編譯器目標(biāo)碼的依賴于平臺的編譯器目標(biāo)碼。一個部分嵌入該獨立于平臺的代碼和部分嵌入依賴于平臺的目標(biāo)碼的接口在平臺特定編譯器運(yùn)行期間作為在獨立于平臺的編譯器代碼和依賴于平臺的編譯器代碼之間的媒介。
本發(fā)明的這些和其他優(yōu)點將在閱讀了下面的詳細(xì)描述和對各個附圖進(jìn)行研究之后變得明顯。
本發(fā)明以及其進(jìn)一步的優(yōu)點可以參照下面的描述結(jié)合附圖得到最好的理解。
圖1是根據(jù)本發(fā)明的一個實施例的多平臺編譯器系統(tǒng)的表示性框圖;圖2顯示了圖1中多平臺編譯器的特定實例;圖3顯示了圖2所示的編譯器的另一實例;圖4詳細(xì)顯示了根據(jù)本發(fā)明一個實施例的編譯器生成過程的流程圖;圖5顯示了具有根據(jù)本發(fā)明一個實施例的平臺特定編譯器的Java虛擬機(jī)(JVM);圖6A顯示了一個根據(jù)本發(fā)明一個實施例的AD文件組織結(jié)構(gòu);圖6B顯示了在包括在圖6A所示AD文件中的各種數(shù)據(jù)域之間的特殊關(guān)系;圖7顯示了一個根據(jù)本發(fā)明一個實施例,連接依賴于平臺的源代碼和獨立于平臺的源代碼的示例性接口;圖8是一個根據(jù)本發(fā)明的由編譯引擎進(jìn)行的運(yùn)行過程的示例性表示;圖9是一個獨立于機(jī)器的指令的表示;圖10是一個詳細(xì)描述根據(jù)本發(fā)明一個實施例的指令選擇過程的流程圖;圖11顯示了一個用于實施本發(fā)明的計算機(jī)系統(tǒng)。
在下面的描述中,將描述在多平臺計算環(huán)境中選擇指令的構(gòu)架和方法。本發(fā)明最初以駐留在Java虛擬機(jī)中的多平臺編譯器的形式進(jìn)行描述。一般地,為了生成一個具有內(nèi)嵌的指令選擇代碼,公開了一組以一個體系結(jié)構(gòu)描述語言(ADL)文件形式的用戶定義的平臺特定體系結(jié)構(gòu)描述符和一組用戶定義的指令判定。應(yīng)注意地是,ADL可以采取對于本領(lǐng)域技術(shù)人員公知的許多形式,諸如C++,屬性文法,習(xí)慣描述語言等,或這些形式的一些組合。在所述實施例中,該指令判定采取與嵌入平臺特定編譯器的指令選擇代碼性結(jié)合布林(boolean)表達(dá)式的形式,使得只有這些指令將被執(zhí)行。在本發(fā)明的一個實施例中,對布林表達(dá)式值的確定只能在指令選擇過程進(jìn)行。
AD文件包括用戶定義的指令判定,這構(gòu)成到包括一個體系結(jié)構(gòu)設(shè)計語言編譯器(ADLC)的多平臺編譯器的輸入。在一個實施例中,ADLC用于產(chǎn)生用于生成目標(biāo)特定編譯器的依賴于特殊目標(biāo)平臺的編譯器源代碼。ADLC還產(chǎn)生目標(biāo)平臺指令選擇源代碼和目標(biāo)平臺指令判定源代碼。具有內(nèi)嵌指令選擇器的平臺特定編譯器是使用由ADLC提供的依賴于平臺的編譯器源代碼,指令選擇源代碼和指令判定源代碼結(jié)合另外提供的獨立于平臺的編譯器目標(biāo)碼來生成。
以此方式,平臺特定編譯器不僅選擇那些由用戶確信適合于在目標(biāo)平臺上執(zhí)行的指令,還選擇那些通過減少指令執(zhí)行成本而改善處理器性能的指令。以此方式,在多平臺環(huán)境中處理器的可靠性和性能都明顯改善。
圖1是根據(jù)本發(fā)明的一個實施例的多平臺編譯器系統(tǒng)100的表示性框圖。該多平臺編譯器系統(tǒng)100可以生成,或編譯一個可以選擇適合于目標(biāo)平臺的指令的平臺特定編譯器。另外,編譯器還可以選擇那些那些通過減少指令執(zhí)行成本而改善處理器性能的指令。
在所述實施例中,平臺特定編譯器是通過編譯表示平臺特定編譯器與任何特殊平臺無關(guān)的那些部分的獨立于平臺源代碼和表示編譯器平臺特定的那些特征的依賴于平臺源代碼來生成的。在其中提供用戶定義(顯式地)的指令判定,或其中它確定特殊指令要求判定而不管它們是否由用戶提供(隱式地)的情況中,編譯器是使用提供具有上述選擇能力的平臺特定編譯器的指令判定源代碼來生成的。
更具體地,在所述實施例中,多平臺編譯器系統(tǒng)100包括一個被配置用于使用平臺特定體系結(jié)構(gòu)描述符和指令判定來生成依賴于平臺的編譯器的編譯器生成器102。在所述實施例中,平臺特定體系結(jié)構(gòu)描述符采取用于表示目標(biāo)平臺編譯器依賴于平臺的那些部分的體系結(jié)構(gòu)描述符語言(ADL)的形式,同時指令判定采取布林表達(dá)式的形式。應(yīng)注意的是,ADL可以采取許多對于本領(lǐng)域技術(shù)人員公知的形式,諸如C++,Java源代碼,Pascal等。典型地,它可以是由多平臺編譯器系統(tǒng)100的用戶編碼的AD文件,然而在一些情況中,AD文件在被稱為“轉(zhuǎn)鍵(turn key)”系統(tǒng)的情況中是由原始設(shè)備制造商提供。在這些情況中,終端用戶已選擇了被確信是有用的目標(biāo)平臺而提供商已提供了必需的譯碼努力。
在許多情形中,AD文件位于,例如,在編譯器生成器102的存儲器系統(tǒng)中,諸如AD文件104和AD文件106。應(yīng)注意地是,雖然可以提供任何數(shù)量的AD文件,每一個特定于一個特殊平臺,然而,在一個時間只有一個AD文件被編譯器生成器102處理。以此方式,一個平臺類型1被提供,當(dāng)特定于,例如,平臺類型1的依賴于平臺的源代碼被提供時,定制的編譯器生成器102可以將源代碼編譯為平臺類型1的目標(biāo)碼。例如,文件104可以包括具有被編譯器生成器102用于生成可以擇優(yōu)地選擇那些由用戶定義的指令判定使能的指令的X86編譯器的指令判定的ADL代碼。如在本領(lǐng)域公知的,X86目標(biāo)碼是那些由一個X86微處理器可執(zhí)行的指令,X86微處理器是由Santa Clara,Ca的Intel公司所制造的。
沿相同脈絡(luò),AD文件106可以包括具有被編譯器生成器102用于生成可以擇優(yōu)地選擇那些由用戶定義的指令判定使能的指令的SPARC編譯器的指令判定的ADL代碼。
在兩種情況中,處理器總的性能可以得到改善,這是因為一個成本分析還可以與選擇同時進(jìn)行。以此方式,編譯器生成器102可以自動提供與AD文件和可用的用戶定義指令判定同樣多的具有適當(dāng)指令選擇代碼的平臺所特定編譯器。
現(xiàn)在參照顯示了圖1所示多平臺編譯器生成器102的特殊實例的圖2。在所示實施例中,編譯器生成器102包括一個連接到一個具有用戶定義的指令判定文件201的AD文件204的體系結(jié)構(gòu)描述符語言編譯器202(ADLC)。該ADLC202被配置來分別將包含在AD文件204中的平臺所特定ADL代碼和包含在文件201中的指令判定編譯為依賴于平臺的編譯器源代碼,指令選擇器源代碼和指令判定源代碼。另外,ADLC 202可以產(chǎn)生不是顯式寫入AD文件204中的指令判定以確保一個正確或有效的指令選擇,在這里被稱為隱式指令判定。
依賴于平臺的編譯器源代碼,指令選擇器源代碼和指令判定源代碼被依次提供給一個連接到ADLC 202的主編譯器203。在所述實施例中,主編譯器203是一個本領(lǐng)域公知的C++編譯器。然而,任何適于將源代碼編譯到目標(biāo)特定編譯器目標(biāo)碼的編譯器都可以使用。
在編譯過程中,連接到ADLC 202的主編譯器203將依賴于平臺的源代碼結(jié)合依賴于平臺的指令判定源代碼和指令選擇器源代碼編譯以形成具有內(nèi)嵌的指令選擇目標(biāo)碼的依賴于平臺的編譯器目標(biāo)碼。在所述實施例中,依賴于平臺的編譯器目標(biāo)碼由包括內(nèi)嵌的指令選擇器目標(biāo)碼的代碼塊206來表示,該指令選擇器目標(biāo)碼由包含在連接于主編譯器203的編譯器單元208中的代碼塊216來表示。內(nèi)嵌的指令選擇目標(biāo)碼提供選擇那些被用戶確信為適當(dāng)?shù)闹噶畹哪芰o習(xí)慣編譯器單元208。另外,通過執(zhí)行一個成本分析,那些減少指令執(zhí)行成本的指令可以被擇優(yōu)地選擇,從而通過減少指令執(zhí)行的總成本來改善處理器性能。
在一些情況中,獨立于平臺的編譯器目標(biāo)碼可由主編譯器203所編譯的獨立于平臺的編譯器源代碼得到。在其他情況中,諸如所述的實施例,獨立于平臺的編譯器目標(biāo)碼已被提供。在所述實施例中,獨立于平臺的目標(biāo)碼由一個在一個實施例中被包含在連接于一個獨立于平臺接口的編譯器引擎212中的代碼塊210來表示。在一個特殊實例中,在所謂運(yùn)行時間的過程中,接口214作為將在依賴于平臺的目標(biāo)碼和指令選擇目標(biāo)碼之間信息傳送到編譯引擎的媒介。
舉例來說,當(dāng)要求一個X86微處理器時,對于該例子,用戶提供一個在此已保存了對于X86平臺所特定的適當(dāng)ADL代碼的AD文件204和具有適當(dāng)指令判定的文件201。通過編譯器生成器102的引導(dǎo),X86特定的ADL代碼和指令判定都被提供給ADLC 202。然后,ADLC 202將ADL代碼編譯為X86所特定的編譯器源代碼和將指令判定編譯為相應(yīng)的平臺所特定的指令判定源代碼和指令選擇器源代碼。應(yīng)注意的是,ADLC 202是一個可以將任何合適結(jié)構(gòu)AD文件轉(zhuǎn)換為相應(yīng)平臺所特定的編譯器源代碼,和如果要求,轉(zhuǎn)換為依賴于平臺的指令判定源代碼的通用編譯器。以此方式,基本上消除了用戶譯碼,或以任何方式修改ADLC 202或它的任何部分的任何要求。因此,對用戶的唯一譯碼要求是要求提供一個合適結(jié)構(gòu)和驗證過的可以包括,如果需要,指令判定的AD文件。
一旦ADLC 202已將X86所特定的ADL代碼編譯為X86編譯器源代碼和將指令判定編譯為指令選擇器源代碼,它們被編譯為使用主編譯器的目標(biāo)碼和分別由塊206和216來表示。
在一些例子中,如圖3所示,依賴于多平臺的編譯器源代碼文件對于編譯器單元300是可用的。編譯器單元300是圖2所示的編譯器單元208的一個實例,因此自然只能被認(rèn)為是示例性的。在所述實施例中,各種依賴于平臺的AD文件被保存在文件棧301中。文件棧301對于編譯器單元300可以在本地的,或在一些情況中,可以位于,例如,數(shù)據(jù)基址,遠(yuǎn)端服務(wù)器等的遠(yuǎn)端。這種配置特別適于包括在諸如Internet(互聯(lián)網(wǎng)),局域網(wǎng)(LAN)等類似的計算機(jī)網(wǎng)絡(luò)上傳輸數(shù)據(jù)的應(yīng)用中。多AD文件的使用特別有利,這是因為它提供了如相應(yīng)AD文件表示的任何平臺所特定的編譯器所需要的操作能力。舉例來說,文件棧301包括一個AD文件302代表,例如,SPARC特定描述符隨著它們相應(yīng)的指令判定的平臺,該指令判定被轉(zhuǎn)換為對應(yīng)的依賴于平臺的源代碼304和指令選擇器306。通過此安排,任何具有其對應(yīng)的包含在文件棧301中的AD文件的平臺可以被選擇來定制該編譯器單元300。雖然未示出,一個選擇器典型地被用于選擇被輸入到ADLC202的AD文件。
如上所討論的,編譯器生成器102生成了一個具有指令選擇器的特殊編譯器,在一個實施例中使用如圖4中流程圖所詳細(xì)描述的過程400。該過程400通過提供以ADL代碼形式保存在,例如,一個AD文件中的平臺所特定的體系結(jié)構(gòu)描述符而在402處開始。在404處,它確定該AD文件是否包括用戶所定義的指令判定(顯式的)或是否要求隱式的指令判定。當(dāng),例如,對于正確的指令執(zhí)行而言特定的數(shù)據(jù)基本上在特定的位置時,則將要求隱式的指令判定。這一情況是隨著具有一個特定操作數(shù)的多次出現(xiàn)的那些指令而發(fā)生的,其中每一操作數(shù)必須是相同的,否則可能出現(xiàn)一個操作錯誤。因為錯誤的風(fēng)險可能隨著不同平臺而變化(即,在一個2地址平臺上執(zhí)行一個3地址指令相對于在一個3地址平臺上執(zhí)行一個2地址指令),依賴用戶去理解這一事實是危險的。另外,一個指令判定可能要求編譯器單元的實現(xiàn)細(xì)節(jié)的使用,該細(xì)節(jié)可以對于AD文件的作者是不可用的。因此,隱式指令判定是指令選擇過程的一部分,其中那些要求特殊考慮的特殊指令由ADLC提供了適當(dāng)?shù)闹噶钆卸ā?br>
當(dāng)要求顯式和/或隱式指令判定時,ADLC在406提供指令選擇器源代碼。ADLC基本與406同步地,在408處基于AD文件輸入提供平臺所特定編譯器源代碼,從而,獨立于平臺的編譯器源代碼在410被提供。然后,主編譯器通過在412同時編譯獨立于平臺的源代碼,依賴于平臺的編譯器源代碼和依賴于平臺的指令判定源代碼來生成具有指令選擇和執(zhí)行成本分析能力的平臺所特定的編譯器。
一旦在414已生成了平臺所特定的編譯器,則平臺所特定的編譯器在運(yùn)行期間對于選擇那些被編譯為所需的平臺所特定目標(biāo)碼的成本有效指令而言是可用的。在一個特定實施例中,在運(yùn)行期間,獨立于平臺的接口是作為在編譯引擎和依賴于平臺的編譯器源代碼和指令判定源代碼之間的信息流的媒介。
更近地,Java編程語言,一個面向?qū)ο笳Z言,已引入可以編譯可以在配置由Java虛擬機(jī)(或字節(jié)碼解釋器)的任何計算機(jī)系統(tǒng)平臺上運(yùn)行的輸出(稱為字節(jié)碼)的能力。Java虛擬機(jī)被設(shè)計來將字節(jié)碼解釋為可以由實際的硬件處理器執(zhí)行的指令。字節(jié)碼利用這種虛擬機(jī),而非一次被解釋一個指令,可以在每一特定平臺上由,在一些情況中,實時(just-in-time)編譯器重編譯。
圖5顯示了一個包括一個Java虛擬機(jī)(JVM)500的裝置,該虛擬機(jī)包含在根據(jù)本發(fā)明一個實施例的編譯器單元208中。在所述配置中,連接到ADLC202的平臺所特定的AD文件棧502包括一組AD文件,其中每一個AD文件代表依賴于特定平臺的編譯器特征。在所述實施例中,AD文件棧502包括分別代表X86和SPARC體系結(jié)構(gòu)的AD文件104和AD文件106。在其中一些不同AD文件包含在AD文件棧502的情形中,選擇器單元502(未示出)典型地被用于由相應(yīng)于所需操作平臺的AD文件棧502來選擇一個特定AD文件。當(dāng)選擇了一個適當(dāng)?shù)腁D文件時,ADLC 202將包含所余選AD文件中的ADL代碼轉(zhuǎn)換為如上所述的依賴于適當(dāng)平臺的編譯器源代碼。
在Java編程語言和環(huán)境中,一個實時(JIT)編譯器是將Java字節(jié)碼變換為可以直接發(fā)送給處理器的指令的程序。在已編寫了一個Java程序后,Java編譯器將Java源程序語句編譯為Java字節(jié)碼,而非編譯為包含匹配一個特定硬件平臺處理器(例如,一個Intel Pentium微處理器或IBM系統(tǒng)/390處理器)的指令的代碼。該Java字節(jié)碼是可以發(fā)送給任何平臺和在該平臺上運(yùn)行的獨立于平臺的代碼。
更具體地,當(dāng)字節(jié)碼被提供給由編譯器單元208所提供的JIT編譯器時,包含在字節(jié)碼504中程序的編譯被延遲直至該程序?qū)⒁\(yùn)行。當(dāng)字節(jié)碼504被提供給一個解釋器506時,字節(jié)碼504被每次一個字節(jié)碼地讀入解釋器506中。然后,解釋器506在每一字節(jié)碼被讀入解釋器506時,執(zhí)行由每一字節(jié)碼所定義的操作。也即,解釋器506“解釋”字節(jié)碼504,這是本領(lǐng)域技術(shù)人員所公知的。通常,解釋器506處理字節(jié)碼504并基本連續(xù)地執(zhí)行與字節(jié)碼504有關(guān)的操作。
當(dāng)一個程序被編譯時,編譯器單元208產(chǎn)生由一個指令選擇器508所選擇的機(jī)器指令。然后,編譯器單元208由所選擇的字節(jié)碼504來產(chǎn)生機(jī)器指令,而所得到的機(jī)器語言指令可以直接由目標(biāo)平臺操作系統(tǒng)510來執(zhí)行。通常,當(dāng)虛擬機(jī)500終止時,機(jī)器語言指令被丟棄。
現(xiàn)在參照圖6,它顯示了根據(jù)本發(fā)明一個實施例的AD文件600的組織結(jié)構(gòu)。應(yīng)注意的是,所示組織結(jié)構(gòu)是AD文件104可以采取的許多可能的結(jié)構(gòu)中的一個。在所示實施例中,AD文件600是分層構(gòu)造的一組不同平臺體系結(jié)構(gòu)描述符數(shù)據(jù)域。舉例來說,一個寄存器定義數(shù)據(jù)域602被ADLC用于描述單個寄存器和具有目標(biāo)體系結(jié)構(gòu)的各類寄存器。一個編碼塊數(shù)據(jù)域604將由目標(biāo)編譯器所使用的編碼類指定為輸出字節(jié)流。一個幀管理塊數(shù)據(jù)域606包括定義幀結(jié)構(gòu)和管理協(xié)議的信息。這種信息包括,例如,幀棧增加的方向,由監(jiān)視器進(jìn)入操作所消耗的棧片數(shù)目,棧的對準(zhǔn)要求,為“棧頂”保留的棧片數(shù)目,和其他。
一個操作數(shù)數(shù)據(jù)域608提供必須在指令定義之前用于在編譯中正確編譯的操作數(shù)定義,這是因為操作數(shù)構(gòu)成用于指令定義中的用戶定義的類型。一個管線(pipeline)規(guī)則數(shù)據(jù)域610被提供用于定義目標(biāo)體系結(jié)構(gòu)管線的行為。一個指令定義數(shù)據(jù)域612提供用于目標(biāo)體系結(jié)構(gòu)的指令格式以及相應(yīng)的指令判定。一個窺孔(peephole)數(shù)據(jù)域614提供由ADLC所使用的目標(biāo)體系結(jié)構(gòu)所特定的優(yōu)化規(guī)則。
AD文件600的分層結(jié)構(gòu)強(qiáng)調(diào)在各種AD文件數(shù)據(jù)域直接的相互關(guān)系。圖6B以曲線顯示了這樣一個關(guān)系,具體地,是在包含于指令定義數(shù)據(jù)域612中的各個操作數(shù)之間的關(guān)系。通過執(zhí)行一個由使用作為根域的指令定義數(shù)據(jù)域612進(jìn)行的后向遍歷(back traversal),對于各個操作數(shù)而言要求輸入到AD輸入數(shù)據(jù)域中的相關(guān)性可以被確定。例如,通過執(zhí)行一個起始于作為根部的指令定義數(shù)據(jù)域612并沿各個分支延伸的正向遍歷,管線規(guī)則數(shù)據(jù)域610和操作數(shù)定義數(shù)據(jù)域608被遭遇。執(zhí)行一個起始于管線規(guī)則數(shù)據(jù)域612的正向遍歷是遭遇寄存器定義數(shù)據(jù)域602,同時,當(dāng)執(zhí)行一個起始于操作數(shù)定義數(shù)據(jù)域608的正向遍歷時,將遭遇寄存器定義數(shù)據(jù)域602和編碼類數(shù)據(jù)域608。以此方式,為完全定義一個特定指令定義的各個操作數(shù)被提供。
圖7示出了一個根據(jù)本發(fā)明,由依賴于平臺的編譯器使用的示例性接口700。該接口700作為在編譯器引擎212(或獨立于平臺的目標(biāo)碼)與在塊206中的依賴于平臺的目標(biāo)碼之間的媒介。在所示實施例中,ADLC輸出包括用于確定性有限自動機(jī)(DFA)702的代碼,它指定了由理想操作數(shù)到機(jī)器指令的映射。該ADLC輸出還包括定義了一組用于,例如,定義合法注冊表征碼,編碼方法,分支偏移行為等的指令類704的目標(biāo)碼。窺孔規(guī)則oracle760的,用于指定合法的機(jī)器所特定樹以優(yōu)化的目標(biāo)碼和對于那些樹的正確替換也由ADLC輸出。以此方式,平臺所特定的體系結(jié)構(gòu)的特征被自動配置于一個適合于編譯引擎212的格式中以在將源代碼編譯為依賴于平臺的目標(biāo)碼的過程中使用。
接口700的獨立于目標(biāo)的部分被連接到一個匹配器(mathcer)708,該匹配器產(chǎn)生一個將被DFA702處理的輸入樹,該DFA執(zhí)行顛倒重寫規(guī)則系統(tǒng)(BURS)式樣樹模式匹配以選擇用于在中間表示中的理想操作數(shù)的機(jī)器指令。
接口700還包括用作執(zhí)行樹模式匹配以發(fā)現(xiàn)最佳候選者和用最佳的機(jī)器指令樹來替換所匹配的機(jī)器指令樹的目標(biāo)碼配置。一個匹配器708使用匹配器DFA來執(zhí)行指令選擇和生成機(jī)器特定的中間表示。在注冊分配器712選擇一個合法的注冊賦值給在機(jī)器特定表示中的操作數(shù)的同時,一個調(diào)度程序710排列機(jī)器所特定的中間表示。這包括將數(shù)值重新分配給正確位置(諸如,將變元移動到它們由調(diào)用約定所指定的正確位置)所需的任何指令的插入。一個窺孔優(yōu)化器714模式匹配在機(jī)器所特定表示中的小樹并用更優(yōu)化的機(jī)器特定樹來替換它們。一個目標(biāo)碼輸出716使用虛擬調(diào)用來對諸如在緩存中的機(jī)器目標(biāo)碼的機(jī)器所特定表示進(jìn)行編碼,并使緩存對于虛擬機(jī)可用。
圖8是一個在根據(jù)本發(fā)明一個實施例的編譯機(jī)212的運(yùn)行期中執(zhí)行的指令編譯過程的示例性顯示。在運(yùn)行期間,編譯機(jī)212,當(dāng)要求時,產(chǎn)生一個對于來自依賴于平臺的編譯器目標(biāo)碼的特定信息和,如果需要,指令選擇器目標(biāo)碼的信息請求(參考,在一個特殊實施例中,是發(fā)射功能調(diào)用)。舉例來說,當(dāng)編譯機(jī)212要求平臺所特定信息以使用內(nèi)嵌指令選擇器來選擇一個指令,該編譯機(jī)212執(zhí)行一個對信息請求器802的功能調(diào)用。該信息請求器802依次連接到將該功能調(diào)用直接引入連接到具有所要求指令判定的DFA的信息提取器804的接口。在所述實施例中,DFA然后基于相應(yīng)的指令判定選擇指令。該信息提取器804,依次,通過提取所要求信息來響應(yīng)該功能調(diào)用。應(yīng)注意的是,所提取的信息以一種容易被編譯機(jī)212使用的方式來構(gòu)造。
圖9表示根據(jù)本發(fā)明一個實施例的,一個具有一個操作數(shù)多次重現(xiàn)的指令的獨立于機(jī)器的示例性曲線900。該獨立于機(jī)器的曲線900與那些具有相同語義的依賴機(jī)器指令相映射。例如,曲線900的節(jié)點902表示在最基本層次上的可以映射到任何數(shù)目的具有與減法相應(yīng)的相同語義的依賴機(jī)器減法操作(subA,subB,subC)的減法操作。然而,如上所述,不是所有可能的映射都是所希望的,這是因為一些映射實際上可能導(dǎo)致錯誤。這可能,例如,產(chǎn)生在那些其中目標(biāo)平臺為2址處理器(諸如X86),和減法操作的結(jié)果被要求保存在一個與輸入不同的位置(正如在SPARC體系結(jié)構(gòu)中3址指令所做的)的情況中。典型的,一個顛倒匹配過程用于將表示機(jī)器指令的二元樹擊穿為目標(biāo)平臺可以理解和執(zhí)行的語義。在該例子中,該樹的每一節(jié)點被映射到由指令判定使用ADLC所產(chǎn)生的指令選擇代碼來選擇的依賴平臺的指令。
根指令節(jié)點902指示該指令900為一個具有作為節(jié)點904和906輸入結(jié)果的整數(shù)減法操作。該減法操作的結(jié)果在908處被保存在一個寄存器中。在此例中,指令選擇器選擇成本最有效的指令或所有匹配將要執(zhí)行的指令的指令輸出序列。
圖10是一個詳細(xì)描述根據(jù)本發(fā)明一個實施例的指令選擇過程1000的流程圖。過程1000通過在1002查找一個在獨立于機(jī)器的指令表示二元樹中的節(jié)點來開始。在1004處,相應(yīng)于所定位的節(jié)點的指令選擇代碼被獲取和執(zhí)行。然后,在1006檢查可能匹配所定位節(jié)點的下一個潛在用戶所定義的指令。該匹配是基于在節(jié)點的獨立于機(jī)器的表示和該節(jié)點的目標(biāo)平臺表示之間的語義的匹配比較的。在1008,判定用戶定義指令的輸入位置是否匹配所定位的節(jié)點的輸入位置。如果確定它們是匹配的,則在1010處判定該指定判定是否滿足。如果該指令不匹配或該指令判定不滿足,則控制返回1006,在此選擇匹配該節(jié)點的下一個用戶定義指令。
回到1010,如果指令判定滿足,則在1012對用戶所定義的指令進(jìn)行執(zhí)行成本的估計。在1014處判定該估計成本是否小于前一估計成本。如果成本估計為小,則在1016處刷新成本估計變量并在1018處刷新該最佳指令,其后在1020處判定是否具有更多的用戶定義的匹配指令。如果沒有匹配指令,則過程停止,然而,如果這有更多的匹配指令,則控制返回1006。
回到1014,如果判定成本估計不小于前一成本估計,則如果這有另外的匹配指令,則控制返回1006,否則過程停止。
圖11顯示了一個用于實現(xiàn)本發(fā)明的計算機(jī)系統(tǒng)1100。該計算機(jī)系統(tǒng)1100或,更具體的,CPU1102可以被配置用以支持虛擬機(jī),這是本領(lǐng)域技術(shù)人員所公知的。如本領(lǐng)域所公知的,ROM用作將數(shù)據(jù)和指令單向地傳輸?shù)紺PU1102,同時RAM典型地用作以雙向方式傳輸數(shù)據(jù)。CPU1102通??梢园ㄈ魏螖?shù)目的處理器。主存儲設(shè)備1104,1106都可以包括任何合適的計算機(jī)可讀媒介。次存儲設(shè)備媒介1108,它通常為一個海量存儲器,也雙向連接到CPU1102和提供附加的數(shù)據(jù)存儲能力。該海量存儲器1108是一個可用于保存包括計算機(jī)代碼,數(shù)據(jù)等的計算機(jī)可讀媒介。典型地,海量存儲設(shè)備1108是一個諸如硬盤或磁帶的通常比主存儲設(shè)備慢的存儲媒介。海量存儲設(shè)備1108可以采取磁的或讀紙帶機(jī)或其他公知的形式。我們希望保存在海量存儲設(shè)備1108中的信息可以,在適當(dāng)例子中,被作為RAM 1106的一部分的虛擬存儲器包含在標(biāo)準(zhǔn)式樣中。一個諸如CD-ROM的特定主存儲設(shè)備1104還可以將數(shù)據(jù)單向傳到CPU 1102。
CPU 1102還連接到一個或多個輸入/輸出設(shè)備1110,該設(shè)備可以包括,但不限于,諸如視頻監(jiān)視器,軌跡球,滑鼠,鍵盤,麥克風(fēng),觸摸式顯示器,傳感器讀卡器,磁或紙帶讀帶機(jī),寫字板,輸入筆,聲音或手寫識別器,或其他公知的輸入設(shè)備,諸如當(dāng)然包括其他計算機(jī)。最后,CPU 1102,可選地,可以使用一個通常如1112所示的網(wǎng)絡(luò)連接連接到一個計算機(jī)或通信網(wǎng)絡(luò)上,例如一個互聯(lián)(Internet)網(wǎng)絡(luò)或一個企業(yè)內(nèi)部(intranet)網(wǎng)絡(luò)。通過這種網(wǎng)絡(luò)連接,我們可以預(yù)期CPU 1102在執(zhí)行上述方法步驟過程中可以由該網(wǎng)絡(luò)接收信息,或?qū)⑿畔⑤敵龅皆摼W(wǎng)絡(luò)。這種信息,經(jīng)常被表示為一序列將使用CPU來執(zhí)行的指令,可以,例如以嵌入到載波中的計算機(jī)數(shù)據(jù)信號的形式由網(wǎng)絡(luò)提取或輸出到網(wǎng)絡(luò)。上述設(shè)備和材料對于在計算機(jī)硬件和軟件領(lǐng)域的技術(shù)人員而言是熟知的。
雖然只公開了本發(fā)明很少的幾個實施例,但應(yīng)理解,本發(fā)明可以許多其他形式來實現(xiàn)而不背離本發(fā)明的范圍。舉例來說,多平臺編譯器可以用于任何計算系統(tǒng)。
雖然根據(jù)本發(fā)明的,將編譯器由一個操作系統(tǒng)移植到另一個,不同操作系統(tǒng)的方法特別適合于對應(yīng)于基于JavaTM的環(huán)境來實現(xiàn),但這些方法通??梢赃m用于任何合適的基于對象的環(huán)境。特殊的是,這些方法適合于在獨立于平臺的基于對象的環(huán)境中使用。應(yīng)理解的是,該方法還可以在一些分布式面向?qū)ο蟮南到y(tǒng)中實現(xiàn)。
在使用一個分布式基于對象的計算機(jī)系統(tǒng)來描述本發(fā)明的同時,應(yīng)理解的是,本發(fā)明一般可以在具有編譯器的任何合適的計算系統(tǒng)中實現(xiàn)。因此,前面的描述應(yīng)被人為是示例性的和非限制性的,而本發(fā)明不限于這里所給出的細(xì)節(jié),可以在權(quán)利要求的范圍內(nèi)修改而具有完全等效的范圍。
權(quán)利要求
1.一種用于產(chǎn)生具有內(nèi)嵌指令選擇器的平臺所特定編譯器的裝置,包括一組用戶定義的依賴于平臺的編譯器的體系結(jié)構(gòu)描述符,它用于描述一個依賴特殊硬件平臺的編譯器的體系結(jié)構(gòu)特征;一組用于識別由指令選擇器所選的平臺所特定指令的指令判定;一個用于將用戶定義的依賴平臺編譯器體系結(jié)構(gòu)描述符轉(zhuǎn)換為依賴于平臺源代碼和用于將該組指令判定轉(zhuǎn)換為平臺所特定指令選擇器源代碼的體系結(jié)構(gòu)描述符編譯器;一個用于將依賴于平臺的編譯器源代碼編譯為依賴于平臺編譯器目標(biāo)碼和用于將平臺所特定指令選擇器源代碼編譯為內(nèi)嵌的指令選擇器目標(biāo)碼的主編譯器;獨立于平臺的編譯器目標(biāo)碼;和一個在平臺所特定編譯器運(yùn)作期間用作在依賴平臺編譯器目標(biāo)碼和獨立于平臺編譯器目標(biāo)碼之間信息流的媒介的接口,其中在平臺所特定編譯器運(yùn)作期間,內(nèi)嵌指令選擇器根據(jù)所選指令的執(zhí)行成本來選擇將要執(zhí)行的指令,而其中內(nèi)嵌的指令選擇器提供隱式指令判定來由平臺所特定編譯器使用以編譯所選擇的指令。
2.權(quán)利要求1的裝置,其中,平臺所特定編譯器包括獨立于平臺編譯器目標(biāo)碼和適合于在特殊硬件平臺上執(zhí)行的依賴于平臺編譯器目標(biāo)碼。
3.權(quán)利要求2的裝置,其中,在平臺所特定編譯器運(yùn)行期間,獨立于平臺的編譯器目標(biāo)碼通過提供一個信息請求給接口來請求一個依賴于特定平臺的目標(biāo)碼信息,該接口將該信息請求直接引入依賴于預(yù)定平臺的編譯器目標(biāo)碼信息提取器。
4.權(quán)利要求3的裝置,其中,依賴于平臺的編譯器目標(biāo)碼信息提取器通過提取滿足該信息請求的依賴于特定平臺的編譯器目標(biāo)碼來響應(yīng)該信息請求。
5.權(quán)利要求4的裝置,其中,所提取的信息被提供給該接口,該接口依次將該信息引入信息請求器。
6.權(quán)利要求1的裝置,其中,所述裝置包括多組用戶定義的依賴于平臺的體系結(jié)構(gòu)描述符,其中,每組描述符相應(yīng)于不同的硬件平臺。
7.一種用于生成具有內(nèi)嵌指令選擇器的平臺所特定編譯器的方法,包括提供一組用戶定義的依賴于平臺的編譯器的體系結(jié)構(gòu)描述符,它用于描述一個依賴特殊硬件平臺的編譯器的體系結(jié)構(gòu)特征;提供一組用于由內(nèi)嵌指令選擇器使用來選擇那些將在運(yùn)行期間被平臺所特定編譯器編譯的指令的用戶定義的指令判定;由一個體系結(jié)構(gòu)描述符編譯器來將該組用戶定義的依賴平臺的編譯器體系結(jié)構(gòu)描述符轉(zhuǎn)換為依賴于平臺的編譯器源代碼;由一個體系結(jié)構(gòu)描述符編譯器將該組用戶定義的指令判定轉(zhuǎn)換為平臺所特定指令選擇器源代碼;由一個連接到體系結(jié)構(gòu)描述符編譯器的主編譯器將依賴于平臺的編譯器源代碼編譯為依賴于平臺編譯器目標(biāo)碼;由一個連接到體系結(jié)構(gòu)描述符編譯器的主編譯器將指令選擇器源代碼編譯為指令選擇器目標(biāo)碼;提供一個獨立于平臺的編譯器目標(biāo)碼,其中,獨立于平臺的編譯器目標(biāo)碼和依賴于獨立于平臺的編譯器目標(biāo)碼適合于在特定硬件平臺上執(zhí)行;由依賴平臺編譯器目標(biāo)碼,指令選擇器目標(biāo)碼和獨立于平臺的編譯器目標(biāo)碼來形成內(nèi)嵌的指令選擇器。
8.權(quán)利要求7的方法,還包括在平臺所特定編譯器運(yùn)行期間,由獨立于平臺的目標(biāo)碼由獨立于平臺的編譯器目標(biāo)碼請求一個依賴于特定平臺的目標(biāo)碼信息;提供一個信息請求給該接口;由該接口將該信息請求直接引入依賴于預(yù)定平臺的編譯器目標(biāo)碼信息提取器。
9.權(quán)利要求8的方法,還包括為響應(yīng)該信息請求,提取滿足該信息請求的依賴于特定平臺的編譯器目標(biāo)碼。
10.權(quán)利要求9的方法,還包括由該接口將所提取的信息引入該信息信息請求器。
11.權(quán)利要求10的方法,還包括由該接口將所提取的信息引入該信息信息請求器。
12.一個具有內(nèi)嵌指令選擇器的平臺所特定的編譯器,包括一個依賴于平臺的編譯器目標(biāo)碼;一個獨立于平臺的編譯器目標(biāo)碼,其中獨立于平臺的編譯器目標(biāo)碼和依賴于平臺的編譯器目標(biāo)碼適合于在一個特殊硬件平臺上執(zhí)行;一個嵌入依賴于平臺編譯器目標(biāo)碼中的依賴于平臺的指令選擇器目標(biāo)碼;一個部分嵌入獨立于平臺代碼和部分嵌入依賴于平臺目標(biāo)碼中的接口,其中,在平臺所特定編譯器運(yùn)行期間,接口作為在獨立于平臺編譯器代碼和依賴于平臺編譯器代碼之間信息流的媒介。
13.權(quán)利要求12的編譯器,其中,在平臺所特定編譯器運(yùn)行期間,獨立于平臺的編譯器目標(biāo)碼通過提供一個信息請求給接口來請求一個依賴于特定平臺的目標(biāo)碼信息,該接口將該信息請求直接引入依賴于預(yù)定平臺的編譯器目標(biāo)碼信息提取器。
14.權(quán)利要求13的編譯器,其中,依賴于平臺的編譯器目標(biāo)碼信息提取器通過提取滿足該信息請求的依賴于特定平臺的編譯器目標(biāo)碼來響應(yīng)該信息請求。
15.權(quán)利要求14的編譯器,其中,所提取的信息被提供給該接口,該接口依次將該信息引入信息請求器。
16.權(quán)利要求12的編譯器,其中,所述裝置包括多組用戶定義的依賴于平臺的體系結(jié)構(gòu)描述符,其中,每組描述符相應(yīng)于不同的硬件平臺。
全文摘要
一種用于生成具有內(nèi)嵌指令選擇器的平臺所特定編譯器的系統(tǒng)和方法。一組用于描述一個依賴特殊硬件平臺的編譯器的體系結(jié)構(gòu)特征的用戶定義的依賴于平臺的編譯器的體系結(jié)構(gòu)描述符和一組用于識別由指令選擇器所選的平臺所特定指令的指令判定被分別轉(zhuǎn)換為依賴于平臺的編譯器目標(biāo)碼和指令選擇器目標(biāo)碼。具有內(nèi)嵌指令選擇器的平臺所特定編譯器由依賴平臺編譯器目標(biāo)碼,指令選擇器目標(biāo)碼和獨立于平臺的編譯器目標(biāo)碼來形成。
文檔編號G06F9/45GK1271891SQ0010702
公開日2000年11月1日 申請日期2000年4月24日 優(yōu)先權(quán)日1999年4月23日
發(fā)明者小C·N·克利克, C·A·維克, M·H·帕萊茨尼 申請人:太陽微系統(tǒng)有限公司