專利名稱:應用于Java操作系統(tǒng)中虛擬機的編譯體系實現(xiàn)方法
技術(shù)領域:
本發(fā)明涉及Java虛擬機設計領域、編譯器設計領域,以及嵌入式設備平臺對Java支持的解決方法。
背景技術(shù):
目前,實現(xiàn)Java平臺主要有三種方式Java虛擬機以虛擬機運行在現(xiàn)有操作系統(tǒng)之上,實現(xiàn)Java程序的運行。這種方式由于其簡易、低代價等特點,是現(xiàn)在最常用的一種。
Java操作系統(tǒng)這種方式又分為兩種1.將Java虛擬機整合進現(xiàn)有的操作系統(tǒng);2開發(fā)一種全新的獨立的基于Java的操作系統(tǒng)。這種方式省去了虛擬機到操作系統(tǒng)那一層的通訊和調(diào)度,因而較之虛擬機的方式有效率的提高。但要開發(fā)一個全新的操作系統(tǒng)并提供相關(guān)的支持(包括驅(qū)動程序支持和應用軟件支持)代價也是非常大的。
Java芯片這種方式將操作系統(tǒng)這一軟件的架構(gòu)整合進了芯片之中,或者打造一個全新的Java專用芯片。由于采用硬件的方式來解決軟件的問題,這種方式的性能比較前兩種都有更大的提升,但缺點也是顯而易見的喪失了Java的跨平臺特性。
可以看出,第一種平臺與第二種平臺都要依賴于Java虛擬機的支持。而Java虛擬機的核心——執(zhí)行引擎其實質(zhì)上就是編譯機制。
傳統(tǒng)的Java虛擬機中執(zhí)行引擎大都采用解釋、即時編譯、自適應優(yōu)化等執(zhí)行策略。其編譯體系采用了普通的一級編譯/解釋,而由執(zhí)行引擎來控制具體執(zhí)行方式,不能充分發(fā)揮編譯體系的作用,并且即時編譯技術(shù)雖然使得java程序速度大為提高,但該技術(shù)仍是一種解釋過程,所以仍慢于編譯型程序的速度。
發(fā)明內(nèi)容
為了獲得更好的代碼編譯性能、代碼執(zhí)行性能,為了提高Java虛擬機的執(zhí)行效率,為了提供一個更優(yōu)異的嵌入式Java支持平臺,本發(fā)明的目的在于提供一種應用于Java操作系統(tǒng)中虛擬機的編譯體系實現(xiàn)方法本發(fā)明解決技術(shù)問題所采用的技術(shù)方案是1、一種應用于Java操作系統(tǒng)中虛擬機的編譯體系實現(xiàn)方法,其特征在于1)四層體系結(jié)構(gòu)與功能
虛處理層C1對外處理編譯解釋任務,對內(nèi)負責代碼預處理;基準編譯層C2對程序首次編譯,作簡單的優(yōu)化,以滿足程序快速執(zhí)行的需要;優(yōu)化編譯層C3生成高度優(yōu)化和快速執(zhí)行的中間代碼,又針對性的選擇編譯,是程序達到本地最優(yōu);匯編層匯編器將中間代碼匯編成本地平臺的目標代碼;層與層之間并不是普通的層層向上負責,而是一個縱橫的關(guān)系,四層體系結(jié)構(gòu)既保證了對現(xiàn)存java程序的兼容性虛處理層、基準編譯層、優(yōu)化編譯層保證了現(xiàn)有java程序的運行環(huán)境;又滿足了程序快速執(zhí)行和針對性優(yōu)化的目的匯編層對中間代碼進行編譯匯編,最終生成本地二進制目標代碼;2)編譯優(yōu)化過程①當程序首次編譯時,實現(xiàn)步驟首次編譯指程序源碼第一次編譯為本地目標代碼的過程;I.程序進入虛處理層C1進行預處理,虛處理層C1為程序中的每一個要被編譯的方法、函數(shù)、變量生成基本信息,寫入信息表,確保執(zhí)行方法提前編譯,從而減少編譯時間的損耗;II.調(diào)用基準編譯層C2,利用信息表中的已經(jīng)生成的程序基本信息,對程序作快速處理,作機器無關(guān)優(yōu)化,為程序分配寄存器,從而實現(xiàn)快速編譯產(chǎn)生程序的中間代碼,最后將優(yōu)化信息和中間代碼寫入信息表;III.信息表中的中間代碼輸出到匯編層匯編器,將中間代碼匯編成目標代碼;②當程序二次編譯時,實現(xiàn)步驟二次編譯指當程序在目標平臺運行時,操作系統(tǒng)動態(tài)跟蹤程序執(zhí)行情況進行統(tǒng)計,根據(jù)優(yōu)化機制,適時調(diào)用編譯器,作再一次的編譯過程;I.操作系統(tǒng)將運行程序的信息提交到虛處理層C1,虛處理層C1將原來編譯器其為程序生成的信息表讀入到內(nèi)存;II.調(diào)用優(yōu)化編譯層C3,優(yōu)化編譯層C3讀取信息表,提取原來的基本信息、優(yōu)化信息以及中間代碼,利用操作系統(tǒng)統(tǒng)計數(shù)據(jù)采取機器相關(guān)優(yōu)化,重新生成程序的中間代碼,最后將優(yōu)化信息和中間代碼寫入信息表;III.信息表中的中間代碼輸出到匯編層匯編器,將中間代碼匯編成目標代碼;在未來的程序執(zhí)行中,編譯器會時常被調(diào)用,重復二次編譯的過程,對運行程序作多次有針對性的優(yōu)化,以達到運行程序的最優(yōu)。
本發(fā)明具有的有益效果是首先,多層編譯體系設計,充分體現(xiàn)了模塊化、安全性、可移植性方面的獨特優(yōu)勢,具有很高的運行安全性以及開發(fā)過程中的高可重用性,大大降低了多平臺開發(fā)成本;其次,多層體系帶來了多種編譯策略的選擇,既考慮了執(zhí)行引擎本身執(zhí)行的效率,又提高了目標代碼執(zhí)行的速度,在整體上提高了Java操作系統(tǒng)的運行速度,特別是在嵌入式平臺這類本身硬件運行速度不是很快的情況下,更具有明顯的效果;再次,本編譯體系采用混合語言來實現(xiàn),前三層的Java和最后匯編層的匯編語言。這種方式突出了Java語言在模塊化、安全性、靈活性方面的優(yōu)勢,同時也利用了匯編語言的強大功能,能在更大程度上優(yōu)化目標代碼,同時也十分有利于平臺移植,方便不同的商業(yè)應用。最后本發(fā)明引入?yún)R編器做底層的編譯器,把編譯的工作提到在本地機安裝時來進行,避開了執(zhí)行時的時間代價,避免了在程序運行時解釋字節(jié)碼的消耗,從而保證了程序的時刻高效,動態(tài)優(yōu)化。
附圖是本發(fā)明的流程圖。
具體實施例方式
本發(fā)明按照上述四層體系來布局,將每一層作為一個功能模塊來實施。下面將就本體系作詳細介紹。
1)四層體系結(jié)構(gòu)與功能①虛處理層C1對外處理編譯解釋任務,對內(nèi)負責代碼預處理。為程序每一個要被編譯的方法生成一個信息表,信息表用于保存程序的基本信息、優(yōu)化信息,中間代碼。它確保每一個方法在執(zhí)行之前都已進行編譯,而避免那些從沒有被調(diào)用過的方法被重復編譯,從而減少編譯時間的損耗。另外,在二次編譯時虛處理層C1也負責讀入程序原信息表,調(diào)用優(yōu)化編譯層C3作進一步的優(yōu)化。因此,虛處理層C1并不進行實際的編譯工作,既不是一個獨立的編譯器。它主要完成一些預處理工作,再判斷選擇底層的其他編譯器來完成具體的編譯過程。
②基準編譯層C2是這個編譯器體系的基礎,負責將Java字節(jié)碼轉(zhuǎn)換成中間代碼并根據(jù)需要調(diào)用匯編層匯編器生成本地執(zhí)行代碼,它的目標是進行快速編譯,做機器無關(guān)優(yōu)化,最終產(chǎn)生合理的快速目標指令代碼。
③優(yōu)化編譯層C3生成高度優(yōu)化和快速執(zhí)行的目標指令代碼,優(yōu)化編譯層C3是一個優(yōu)化編譯器,主要進行與機器相關(guān)的代碼優(yōu)化,它以生成高度優(yōu)化和快速執(zhí)行的目標指令代碼、而不是編譯器執(zhí)行速度,作為自身的目標。
④匯編層匯編器將中間代碼匯編成目標平臺本地代碼,匯編層匯編器在系統(tǒng)中自成一個獨立的部分,它將中間代碼匯編成目標平臺本地代碼。它由基準編譯層C2或者優(yōu)化編譯層C3來調(diào)用執(zhí)行任務。
層與層之間并不是普通的層層向上負責,而是一個縱橫的關(guān)系,四層體系結(jié)構(gòu)既保證了對現(xiàn)存java程序的兼容性虛處理層、基準編譯層、優(yōu)化編譯層保證了現(xiàn)有java程序的運行環(huán)境;又滿足了程序快速執(zhí)行和針對性優(yōu)化的目的匯編層對中間代碼進行編譯匯編,最終生成本地二進制目標代碼;2)編譯優(yōu)化過程①當程序首次編譯時,實現(xiàn)步驟首次編譯指程序源碼第一次編譯為本地目標代碼的過程;I.程序進入虛處理層C1進行預處理,虛處理層C1為程序中的每一個要被編譯的方法、函數(shù)、變量生成一個信息表,確保執(zhí)行方法提前編譯,從而減少編譯時間的損耗;II.調(diào)用基準編譯層C2,利用信息表中的已經(jīng)生成的程序基本信息,對程序的字節(jié)碼作快速處理,減少其在內(nèi)存直接執(zhí)行的操作的數(shù)量(常常為0),但同時增加可用寄存器到32、64或128,降低寄存器分配難度。清除代碼中重復出現(xiàn)的表達式,如果有多個表達式的值相同,保存的第1次的計算值并刪除重復計算,清除程序中不可到達及死代碼,將程序中的高代價代碼替換為低代價代碼,采用常量傳播方法將程序中的恒定變量替換為常量,對循環(huán)進行循環(huán)代碼外提,削減強度,刪除歸納變量等優(yōu)化方法,建立一個虛堆棧來消除大量的堆棧操作。最終形成中間代碼。作機器相關(guān)優(yōu)化,為程序分配寄存器,從而實現(xiàn)快速編譯并產(chǎn)生程序的中間代碼,最后將優(yōu)化信息和中間代碼寫入信息表;III.信息表中的中間代碼輸出到匯編層,將中間代碼匯編成目標平臺本地代碼;②當程序二次編譯時,實現(xiàn)步驟二次編譯指當程序在目標平臺運行時,操作系統(tǒng)動態(tài)跟蹤程序執(zhí)行情況進行統(tǒng)計,根據(jù)優(yōu)化機制,適時調(diào)用編譯器,作再一次的編譯過程;I.操作系統(tǒng)將運行程序的信息提交到虛處理層C1,虛處理層C1根據(jù)執(zhí)行路徑查找程序的信息表,如果存在,就將原來編譯其為程序生成的信息表讀入到內(nèi)存,如果不存在給出提示信息,退出優(yōu)化;II.調(diào)用優(yōu)化編譯層C3,優(yōu)化編譯層C3讀取信息表,取出信息表中的基本信息、優(yōu)化信息、中間代碼,利用操作系統(tǒng)統(tǒng)計數(shù)據(jù)采取相應的優(yōu)化方案,做機器相關(guān)優(yōu)化,為程序分配寄存器,重新生成程序的中間代碼,最后將優(yōu)化信息和中間代碼寫入信息表,優(yōu)化編譯層C3的執(zhí)行過程分為四個步驟1、由虛處理層C1裝入的信息表中獲得基本信息、優(yōu)化信息、中間代碼;2、進行第二遍優(yōu)化,即機器相關(guān)優(yōu)化;3、寄存器重新分配;4、將優(yōu)化信息、以及優(yōu)化后的中間代碼寫回到信息表;第1步虛處理層C1讀入信息表,讀取程序的基本信息、優(yōu)化信息、中間代碼。信息表中的基本信息、優(yōu)化信息、中間代碼是在程序上次編譯時生成的,其中中間代碼已經(jīng)做過一些優(yōu)化,被于程序作相關(guān)保存,以備二次編譯時使用。優(yōu)化編譯層根據(jù)這些信息判斷是否優(yōu)化、重新編譯,或如何優(yōu)化、編譯。
第2步優(yōu)化編譯層C3在原始代碼的基礎上對語句參數(shù)進行優(yōu)化替換并消除死代碼,即從來不會被執(zhí)行的代碼,根據(jù)本機特性作多處理器優(yōu)化、特殊指令優(yōu)化、無用之令消除,根據(jù)操作系統(tǒng)的統(tǒng)計數(shù)據(jù),預測哪條分支最有可能運行、哪個過程經(jīng)常調(diào)用以及哪部分代碼最經(jīng)常執(zhí)行,調(diào)整轉(zhuǎn)移結(jié)構(gòu),循環(huán)和過程代碼來最小化最經(jīng)常執(zhí)行部分的運行時間。
第3步的寄存器分配,根據(jù)統(tǒng)計數(shù)據(jù)把經(jīng)常要計算變量引用次數(shù)并將高引用率的變量放入寄存器,為變量重新分配可獲得的機器寄存器,將利用率較低的變量移入內(nèi)存。最后階段的代碼生成將調(diào)用匯編層匯編器對優(yōu)化后的中間代碼進行解析,從而生成目標執(zhí)行代碼。
第4步將優(yōu)化信息以及優(yōu)化后的中間代碼寫回到信息表,替換原來的優(yōu)化信息和中間代碼,并調(diào)用匯編層。
III.中間代碼輸出到匯編層,將中間代碼再次匯編,從而生成高度優(yōu)化和快速執(zhí)行的目標指令代碼在未來的程序執(zhí)行中,編譯器會時常被調(diào)用,重復二次編譯的過程,對運行程序作多次有針對性的優(yōu)化,以達到運行代碼的最優(yōu)。
本發(fā)明的流程圖如圖1所示,操作系統(tǒng)調(diào)用編譯器,對程序進行編譯。首先啟動虛處理層虛處理層C1對當前程序執(zhí)行虛處理,第一步判斷該程序是首次編譯,還是二次編譯,如果是首次編譯,虛處理層C1為程序生成唯一的一張信息表,保存程序的方法、函數(shù)、常變量的基本信息,否則裝載程序的信息表。其次,信息表生成后,如果是首次編譯,調(diào)用基準編譯層C2,利用信息表中的基本信息,對程序進行與機器無關(guān)優(yōu)化,從而實現(xiàn)快速編譯并最終在信息表中產(chǎn)生程序的中間代碼,將優(yōu)化信息和中間代碼寫回到信息表,如果是二次編譯,調(diào)用優(yōu)化編譯層C3讀入信息表,提取基本信息、優(yōu)化信息、中間代碼,優(yōu)化編譯C3利用統(tǒng)計數(shù)據(jù)采取相應的優(yōu)化方案,進行與機器相關(guān)優(yōu)化,重新生成優(yōu)化信息以及程序的中間代碼,替換信息表中的優(yōu)化信息和原始中間代碼;再次第三步中間代碼輸出到匯編層,將中間代碼匯編成目標平臺本地代碼。在以后的程序執(zhí)行中,本編譯器會時常被調(diào)用,重復二次編譯的過程,對運行程序作多次有針對性的優(yōu)化,以達到運行代碼的最優(yōu)。
實施例現(xiàn)有一個程序源碼A,內(nèi)含變量a,變量b,變量c,函數(shù)a、函數(shù)b,以及方法a,源碼A由操作系統(tǒng)提交給本編譯器,虛處理層C1獲得源碼A后,判斷源碼A為首次編譯,在內(nèi)存中建立信息表T,在表中為變量a,變量b,變量c,函數(shù)a,函數(shù)b,方法a分別建立對應的數(shù)據(jù)結(jié)構(gòu)Tva,Tvb,Tvc,Tfuna,Tmetha,調(diào)用基準編譯層C2,對原碼A作一系列機器無關(guān)代碼優(yōu)化,在信息表T中mva,mvb,mvc,mfuna,mmetha處登記變量a,變量b,變量c,函數(shù)a,函數(shù)b,方法a做的優(yōu)化處理方式以及優(yōu)化指標,即優(yōu)化信息,最后編譯為中間代碼B,把優(yōu)化信息和中間代碼B寫入信息表T,并保存,中間代碼B提交到匯編層匯編器,由匯編層匯編器將中間代碼編譯成最終的目標代碼程序C。
程序C生成后可以直接在操作系統(tǒng)中運行,在程序C運行過程中,操作系統(tǒng)監(jiān)視程序中的“熱區(qū)”,并加以統(tǒng)計,在確定“熱區(qū)”代碼塊可優(yōu)化后之后啟動本編譯器,將統(tǒng)計情況及程序信息交給虛處理層C1,虛處理層C1判斷該程序為二次編譯,裝入對應的信息表T,如果沒有發(fā)現(xiàn)信息表T,退出編譯器。裝入成功后調(diào)用優(yōu)化編譯層C3,優(yōu)化編譯層讀入基本信息、優(yōu)化信息、中間代碼B,根據(jù)統(tǒng)計信息和優(yōu)化方案對中間代碼B進行機器相關(guān)優(yōu)化,在信息表T中中mva,mvb,mvc,mfuna,mmetha處登記變量a,變量b,變量c,函數(shù)a,函數(shù)b,方法a做的優(yōu)化處理方式以及優(yōu)化指標,即優(yōu)化信息,重新編譯為中間代碼B,把優(yōu)化信息和中間代碼B寫入信息表T,并保存,中間代碼提交到匯編層匯編器,由匯編層匯編器將中間代碼編譯成最終優(yōu)化后的目標代碼程序C。
權(quán)利要求
1.一種應用于Java操作系統(tǒng)中虛擬機的編譯體系實現(xiàn)方法,其特征在于1)四層體系結(jié)構(gòu)與功能虛處理層C1對外處理編譯解釋任務,對內(nèi)負責代碼預處理;基準編譯層C2對程序首次編譯,作簡單的優(yōu)化,以滿足程序快速執(zhí)行的需要;優(yōu)化編譯層C3生成高度優(yōu)化和快速執(zhí)行的中間代碼,又針對性的選擇編譯,是程序達到本地最優(yōu);匯編層匯編器將中間代碼匯編成本地平臺的目標代碼;層與層之間并不是普通的層層向上負責,而是一個縱橫的關(guān)系,四層體系結(jié)構(gòu)既保證了對現(xiàn)存java程序的兼容性虛處理層、基準編譯層、優(yōu)化編譯層保證了現(xiàn)有java程序的運行環(huán)境;又滿足了程序快速執(zhí)行和針對性優(yōu)化的目的匯編層對中間代碼進行編譯匯編,最終生成本地二進制目標代碼;2)編譯優(yōu)化過程①當程序首次編譯時,實現(xiàn)步驟首次編譯指程序源碼第一次編譯為本地目標代碼的過程;I.程序進入虛處理層C1進行預處理,虛處理層C1為程序中的每一個要被編譯的方法、函數(shù)、變量生成基本信息,寫入信息表,確保執(zhí)行方法提前編譯,從而減少編譯時間的損耗;II.調(diào)用基準編譯層C2,利用信息表中的已經(jīng)生成的程序基本信息,對程序作快速處理,作機器無關(guān)優(yōu)化,為程序分配寄存器,從而實現(xiàn)快速編譯產(chǎn)生程序的中間代碼,最后將優(yōu)化信息和中間代碼寫入信息表;III.信息表中的中間代碼輸出到匯編層匯編器,將中間代碼匯編成目標代碼;②當程序二次編譯時,實現(xiàn)步驟二次編譯指當程序在目標平臺運行時,操作系統(tǒng)動態(tài)跟蹤程序執(zhí)行情況進行統(tǒng)計,根據(jù)優(yōu)化機制,適時調(diào)用編譯器,作再一次的編譯過程;I.操作系統(tǒng)將運行程序的信息提交到虛處理層C1,虛處理層C1將原來編譯器其為程序生成的信息表讀入到內(nèi)存;II.調(diào)用優(yōu)化編譯層C3,優(yōu)化編譯層C3讀取信息表,提取原來的基本信息、優(yōu)化信息以及中間代碼,利用操作系統(tǒng)統(tǒng)計數(shù)據(jù)采取機器相關(guān)優(yōu)化,重新生成程序的中間代碼,最后將優(yōu)化信息和中間代碼寫入信息表;III.信息表中的中間代碼輸出到匯編層匯編器,將中間代碼匯編成目標代碼;在未來的程序執(zhí)行中,編譯器會時常被調(diào)用,重復二次編譯的過程,對運行程序作多次有針對性的優(yōu)化,以達到運行程序的最優(yōu)。
全文摘要
本發(fā)明公開了一種應用于Java操作系統(tǒng)中虛擬機的編譯體系實現(xiàn)方法。以Java語言為主,匯編語言為輔,采用四層體系架構(gòu)虛處理層、基準編譯層、優(yōu)化編譯層、匯編層匯編器;以操作平臺的目標代碼為最終編譯結(jié)果,有針對性地選擇優(yōu)化編譯,即考慮程序執(zhí)行速度又顧及虛擬機自身效率,在Java操作系統(tǒng)的支持下動態(tài)優(yōu)化,使程序運行達到最優(yōu)。這一方法在突出了Java語言在模塊化、安全性、靈活性方面的優(yōu)勢,同時也利用了匯編語言的強大功能,能在更大程度上優(yōu)化目標代碼,同時也十分有利于平臺移植,方便不同的商業(yè)應用,從整體上提高了Java操作系統(tǒng)的運行速度,特別是在嵌入式平臺這類本身硬件運行速度不是很快時,更具有明顯的效果。
文檔編號G06F9/455GK1790267SQ20051006199
公開日2006年6月21日 申請日期2005年12月14日 優(yōu)先權(quán)日2005年12月14日
發(fā)明者陳天洲, 戴紅軍, 陳國兵, 胡威, 黃域 申請人:浙江大學