當(dāng)針對軌跡的執(zhí)行次數(shù)等于或大于閾值時,JIT編譯器135將Java字節(jié)碼的軌跡編譯為本機(jī)代碼的軌跡,并且在存儲器模塊120中高速緩存本機(jī)代碼的軌跡。一般來說,循環(huán)中的指令經(jīng)常被執(zhí)行,并且JIT編譯器135將循環(huán)中的指令編譯為本機(jī)代碼,并且高速緩存本機(jī)代碼。
[0025]在圖1的示例中,存儲器空間170被分配作為JIT緩存以緩存經(jīng)編譯的本機(jī)代碼。然后,對于軌跡的其它執(zhí)行,Java虛擬機(jī)執(zhí)行被存儲在存儲器空間170處的被高速緩存的本機(jī)代碼。
[0026]根據(jù)本公開的一方面,JIT編譯器135包括循環(huán)編譯模塊140,該模塊被配置為將循環(huán)編譯為本機(jī)代碼以加速虛擬機(jī)執(zhí)行。在圖1的示例中,Java字節(jié)碼包括循環(huán),例如循環(huán)代碼160等。循環(huán)編譯模塊140使循環(huán)代碼160被轉(zhuǎn)譯為本機(jī)代碼形式的循環(huán)代碼180。循環(huán)代碼180以加快的速度被Java虛擬機(jī)執(zhí)行。
[0027]一般來說,Java字節(jié)碼使用不被鏈接到物理寄存器的虛擬寄存器。因而,Java字節(jié)碼可以由各種Java虛擬機(jī)在各種系統(tǒng)中被執(zhí)行。在系統(tǒng)100執(zhí)行Java字節(jié)碼之時,物理寄存器115被分配給虛擬寄存器,并且基于虛擬寄存器操作的字節(jié)碼指令被轉(zhuǎn)譯為基于物理寄存器115操作的本機(jī)代碼指令。在示例中,字節(jié)碼形式的算術(shù)指令可以被轉(zhuǎn)譯為本機(jī)代碼形式的寄存器分配/加載指令、算術(shù)指令和寄存器卸載指令的組合。
[0028]在實施例中,循環(huán)編譯模塊140被配置為在編譯循環(huán)代碼160中的代碼指令之前導(dǎo)致針對循環(huán)代碼160中的一個或多個特定寄存器的循環(huán)范圍寄存器分配。因而,針對特定寄存器的寄存器分配在循環(huán)代碼160之中是一致的。在示例中,循環(huán)編譯模塊140被配置為在循環(huán)代碼180中的循環(huán)體之前針對特定寄存器中的每個寄存器添加循環(huán)代碼180中的單個分配/加載指令。該單個分配/加載指令在循環(huán)代碼180的執(zhí)行期間被執(zhí)行一次。此外,在示例中,循環(huán)編譯模塊140被配置為在循環(huán)代碼180中的循環(huán)體之后針對特定寄存器中的每個寄存器添加單個卸載指令。因而,在示例中,該卸載指令在循環(huán)代碼180的執(zhí)行期間被執(zhí)行一次。
[0029]具體而言,在圖1的示例中,循環(huán)代碼180具有循環(huán)入口塊182、循環(huán)體塊184、循環(huán)控制塊186和循環(huán)出口塊188。循環(huán)入口塊182在循環(huán)代碼180的開始處。在示例中,循環(huán)編譯模塊140使得針對循環(huán)代碼180的一個或多個寄存器分配/加載指令被置于循環(huán)入口塊182中。
[0030]循環(huán)出口塊188在循環(huán)代碼180的末尾處。在示例中,循環(huán)編譯模塊140使得針對循環(huán)代碼180的一個或多個寄存器卸載指令被置于循環(huán)出口塊188中。
[0031]循環(huán)體塊186包括基于分配的寄存器來操作的代碼指令。在示例中,循環(huán)編譯模塊140基于循環(huán)入口塊182中的分配的寄存器逐個轉(zhuǎn)譯循環(huán)代碼160中的指令,并且循環(huán)編譯模塊140不需要在每次代碼指令轉(zhuǎn)移時分別添加寄存器分配/加載指令和卸載指令。
[0032]循環(huán)控制塊186包括確定是否重復(fù)循環(huán)體塊186或者通過循環(huán)出口塊188退出循環(huán)代碼180的條件。
[0033]注意存儲器模塊120可以具有被分配用于其它適當(dāng)?shù)哪K的存儲器空間。在示例中,在存儲器模塊120中分配存儲器空間(未示出)以存儲用于內(nèi)核(kernel)的程序。內(nèi)核是將用戶應(yīng)用程序與系統(tǒng)100的硬件組件相對接的用于系統(tǒng)100的操作系統(tǒng)的一部分。例如,內(nèi)核管理來自軟件組件(例如用戶應(yīng)用程序等)的輸入/輸出請求,并將它們轉(zhuǎn)譯成用于硬件組件(例如處理模塊110、存儲器模塊120等)的數(shù)據(jù)處理指令。
[0034]圖2示出了概述根據(jù)本公開的實施例的處理過程示例200的流程圖。在示例中,用Java語言編寫的應(yīng)用程序被轉(zhuǎn)譯為Java字節(jié)碼,并且該Java字節(jié)碼被存儲在圖1的示例中的存儲器模塊120中的存儲器空間150處。在實施例中,為了執(zhí)行Java字節(jié)碼,CPU111執(zhí)行被存儲在存儲器空間130處的Java軟件程序以啟動Java虛擬機(jī)。Java虛擬機(jī)提供用于執(zhí)行Java字節(jié)碼的Java運(yùn)行時環(huán)境。在示例中,Java虛擬機(jī)利用JIT編譯器135來將Java字節(jié)碼形式的循環(huán)編譯為本機(jī)代碼,并且Java虛擬機(jī)執(zhí)行經(jīng)編譯的本機(jī)代碼以提高性能。在該示例中,CPU 111根據(jù)處理過程200執(zhí)行循環(huán)編譯模塊140以將Java字節(jié)碼形式的循環(huán)代碼160編譯為本機(jī)代碼形式的循環(huán)代碼180。處理過程開始于S201并進(jìn)行到 S210。
[0035]在S210處,接收字節(jié)碼形式的循環(huán)代碼。在圖1的示例中,Java虛擬機(jī)接收用于執(zhí)行的循環(huán)代碼160。循環(huán)代碼160包括字節(jié)碼形式的多個指令。
[0036]在S220處,掃描循環(huán)代碼以收集虛擬寄存器的列表和虛擬寄存器的信息。在圖1的示例中,掃描循環(huán)代碼160以收集循環(huán)代碼160中所使用的虛擬寄存器的列表以及虛擬寄存器的信息,例如每個虛擬寄存器的類型、虛擬寄存器的類型一致性等。在示例中,該類型信息可以根據(jù)循環(huán)代碼160中的寄存器使用和/或寄存器定義而被得到。
[0037]在S230處,該處理過程基于可用物理寄存器是否滿足循環(huán)代碼的虛擬寄存器分配要求的確定而繼續(xù)進(jìn)行。在示例中,物理寄存器的限值數(shù)目被預(yù)先確定,或者根據(jù)經(jīng)驗公式基于對循環(huán)代碼的掃描而在S220處被確定。限值數(shù)目指示編譯成功的要求。循環(huán)編譯模塊140將可用物理寄存器(例如尚未分配的物理寄存器)與限值數(shù)目比較。在示例中,當(dāng)系統(tǒng)100中的可用物理寄存器的數(shù)目大于限值數(shù)目時,循環(huán)編譯模塊140確定可用物理寄存器滿足虛擬寄存器分配要求。當(dāng)可用物理寄存器滿足虛擬寄存器分配要求時,處理過程進(jìn)行到S240 ;否則,處理過程進(jìn)行到S280。
[0038]在S240處,從列表獲取虛擬寄存器。在示例中,標(biāo)識出虛擬寄存器列表中的未分配的虛擬寄存器。
[0039]在250處,處理過程基于在循環(huán)代碼中虛擬寄存器是否具有一致的類型的確定而繼續(xù)進(jìn)行。在圖1的示例中,循環(huán)編譯模塊140基于在S220處所收集的寄存器的信息來確定在循環(huán)代碼160中虛擬寄存器是否具有一致的類型。當(dāng)在循環(huán)代碼160中虛擬寄存器具有一致的類型時,處理過程進(jìn)行到S260 ;否則,處理過程進(jìn)行到S270。
[0040]在S260處,在本機(jī)代碼的循環(huán)入口塊中添加用于虛擬寄存器的寄存器分配/加載指令。在圖1的示例中,循環(huán)編譯模塊140在循環(huán)入口塊182中添加寄存器分配/加載指令來向虛擬寄存器分配物理寄存器并將虛擬寄存器中的數(shù)據(jù)加載到分配的物理寄存器中。此外,在實施例中,循環(huán)編譯模塊140在循環(huán)出口塊188中添加卸載指令以將數(shù)據(jù)從分配的物理寄存器卸載到虛擬寄存器中。
[0041]在S270處,處理過程基于是否所有虛擬寄存器是否已被檢查的確定而繼續(xù)進(jìn)行。在圖1的示例中,循環(huán)編譯模塊140確定列表中的虛擬寄存器是否都已被檢查以用于預(yù)分配。當(dāng)所有虛擬寄存器都已被檢查以進(jìn)行預(yù)分配時,處理過程進(jìn)行到S280 ;否則,處理過程進(jìn)行到S230來確定余下的可用物理寄存器是否滿足循環(huán)代碼的虛擬寄存器分配要求。
[0042]在S280處,基于寄存器分配來編譯循環(huán)代碼中的指令以生成本機(jī)代碼。在圖1的示例中,循環(huán)編譯模塊140隨后基于分配的寄存器逐個編譯循環(huán)代碼160中的字節(jié)碼。例如,當(dāng)指令中的虛擬寄存器已經(jīng)通過循環(huán)入口塊182中的指令被分配和加載時,循環(huán)編譯模塊140不會針對虛擬寄存器而在循環(huán)體184中添加單獨的寄存器分配/加載指令和卸載指令。然而,當(dāng)指令中的虛擬寄存器尚未被分配時,例如這是由于循環(huán)代碼160中的虛擬寄存器的類型不一致,則循環(huán)編譯模塊140可以在循環(huán)體184中添加用于虛擬寄存器的寄存器分配/加載和卸載指令。處理過程隨后進(jìn)行到S280并結(jié)束。
[0043]根據(jù)本公開的實施例,圖3A示出了用于編譯的字節(jié)碼形式的循環(huán)代碼360并且圖3B示出了本機(jī)代碼形式的經(jīng)編譯的循環(huán)代碼380。
[0044]在圖