用于編譯器優(yōu)化的方法和系統(tǒng)的制作方法
【專利說明】用于編譯器優(yōu)化的方法和系統(tǒng)
[0001]引用并入
[0002]本公開要求2013年7月24日遞交的第61/857,952號美國臨時(shí)申請“Type-basedEarly Stage Register Allocat1n Optimizat1n Technology Applied to MultiRegister Virtual Machine”的權(quán)益,該臨時(shí)申請的全部內(nèi)容通過引用被并入于此。
【背景技術(shù)】
[0003]這里所提供的【背景技術(shù)】描述是為了總地給出本公開的上下文的目的。目前所提名的發(fā)明人的工作(就該【背景技術(shù)】部分中所描述的工作的程度)以及不可作為遞交申請時(shí)的現(xiàn)有技術(shù)的本描述的多個(gè)方面既不明確地也不隱含地被承認(rèn)為本公開的現(xiàn)有技術(shù)。
[0004]—般來說,諸如Dalvik之類的Java虛擬機(jī)將經(jīng)常使用的Java字節(jié)碼(bytecode)編譯為本機(jī)代碼(native code)以提高運(yùn)行時(shí)的性能。在示例中,Java虛擬機(jī)包括逐個(gè)編譯字節(jié)碼并且同時(shí)進(jìn)行寄存器分配的即時(shí)(just-1n-time)編譯器。
【發(fā)明內(nèi)容】
[0005]本公開的多個(gè)方面提供了一種用于代碼編譯的方法。該方法包括接收用于編譯的循環(huán)代碼的指令,在將指令編譯為針對循環(huán)代碼的循環(huán)體之前向變量分配一個(gè)或多個(gè)寄存器,并且基于分配的寄存器將指令編譯為循環(huán)體。
[0006]在實(shí)施例中,循環(huán)代碼為字節(jié)碼形式,并且被編譯為本機(jī)代碼。該方法包括接收用于編譯的字節(jié)碼形式的循環(huán)代碼的指令,在將指令編譯為針對字節(jié)碼形式的循環(huán)代碼的本機(jī)代碼形式的循環(huán)體之前向虛擬寄存器分配一個(gè)或多個(gè)物理寄存器,并且基于分配的物理寄存器將指令編譯為本機(jī)代碼形式的循環(huán)體。在示例中,該方法包括在循環(huán)體之前的循環(huán)入口塊中添加載入指令以將虛擬寄存器中的值載入到分配的物理寄存器中。在另一示例中,該方法包括在循環(huán)體之后的循環(huán)出口塊中添加卸載指令以將分配的物理寄存器中的值卸載到虛擬寄存器中。
[0007]此外,根據(jù)本公開的一方面,該方法包括確定可用物理寄存器是否滿足循環(huán)代碼的指令的編譯要求。在示例中,該方法包括將可用物理寄存器的數(shù)目與預(yù)定限值進(jìn)行比較,并且當(dāng)可用物理寄存器的數(shù)目大于預(yù)定限值時(shí)在要在循環(huán)體之前被執(zhí)行的本機(jī)代碼的循環(huán)入口塊中添加分配指令。
[0008]本公開的多個(gè)方面提供了一種存儲用于使處理器執(zhí)行用于代碼編譯的操作的程序指令的非瞬態(tài)計(jì)算機(jī)可讀介質(zhì)。該操作包括接收用于編譯的循環(huán)代碼的指令,在將指令編譯為針對循環(huán)代碼的循環(huán)體之前向變量分配一個(gè)或多個(gè)寄存器,并且基于分配的寄存器將指令編譯為循環(huán)體。
[0009]本公開的多個(gè)方面提供了一種包括處理器和存儲器的裝置。處理器被配置為執(zhí)行指令代碼。存儲器被配置為存儲用于使處理器執(zhí)行以下操作的指令:接收用于編譯的循環(huán)代碼的指令,在將指令編譯為針對循環(huán)代碼的循環(huán)體之前向變量分配一個(gè)或多個(gè)寄存器;并且基于分配的寄存器將指令編譯為循環(huán)體。
【附圖說明】
[0010]作為示例被提出的本公開的各個(gè)實(shí)施例將參考以下附圖被詳細(xì)描述,其中相似的標(biāo)號指代相似的元件,并且其中:
[0011]圖1示出了根據(jù)本公開的實(shí)施例的系統(tǒng)示例100的框圖;
[0012]圖2示出了概述根據(jù)本公開的實(shí)施例的編譯過程200的流程圖;以及
[0013]圖3A和3B示出了根據(jù)本公開的實(shí)施例的代碼示例。
【具體實(shí)施方式】
[0014]圖1示出了根據(jù)本公開的實(shí)施例的系統(tǒng)示例100的框圖。系統(tǒng)100包括諸如處理模塊110、存儲器模塊120等之類的硬件組件以及諸如被存儲在存儲器模塊120中的各種代碼指令之類的軟件組件。硬件組件根據(jù)軟件組件進(jìn)行操作以執(zhí)行各種任務(wù)。系統(tǒng)100使用即時(shí)(JIT)編譯器135,該編譯器被配置為在編譯循環(huán)中的一個(gè)接一個(gè)的指令之前針對循環(huán)執(zhí)行循環(huán)范圍的寄存器分配。
[0015]系統(tǒng)100可以是任何合適的系統(tǒng),例如臺式計(jì)算機(jī)、膝上型計(jì)算機(jī)、平板計(jì)算機(jī)、智能電話等。系統(tǒng)100可以包括其它合適的組件(未被示出),例如顯示器、觸摸屏、麥克風(fēng)、通信組件等。在實(shí)施例中,系統(tǒng)100包括將諸如處理模塊110、存儲器模塊120之類的各種電路集成到單個(gè)集成電路(1C)芯片上的單個(gè)1C芯片。在另一實(shí)施例中,系統(tǒng)100包括被適當(dāng)?shù)伛詈显谝黄鸬亩鄠€(gè)1C芯片,例如處理器芯片、存儲器芯片等。
[0016]處理模塊110包括諸如中央處理單元(CPU) 111之類的一個(gè)或多個(gè)處理器來執(zhí)行各種代碼指令以執(zhí)行各種任務(wù)。代碼指令可以是可被CPU 111直接執(zhí)行的低級代碼,例如機(jī)器代碼(本機(jī)代碼),或者可以是高級代碼,例如用Java語言、用C語言等寫成的代碼,其可被轉(zhuǎn)譯成機(jī)器代碼并且然后被執(zhí)行。
[0017]CPU 111可以利用任何合適的體系結(jié)構(gòu)來實(shí)現(xiàn),例如x86、ARM等。在示例中,當(dāng)CPU111具有X86體系結(jié)構(gòu)時(shí),CPU 111能夠執(zhí)行專用于x86體系結(jié)構(gòu)的x86指令集中的機(jī)器代碼。在另一示例中,當(dāng)CPU 111具有ARM體系結(jié)構(gòu)時(shí),CPU 111能夠執(zhí)行專用于ARM體系結(jié)構(gòu)的ARM指令集中的機(jī)器代碼。
[0018]—般來說,CPU 111包括可以快速被訪問的多個(gè)寄存器115 (物理寄存器)。每個(gè)指令對寄存器和/或存儲器模塊120中的數(shù)據(jù)執(zhí)行特定任務(wù),例如加載、跳轉(zhuǎn)、算術(shù)運(yùn)算、邏輯運(yùn)算等。在實(shí)施例中,CPU 111被配置為具有流水線體系結(jié)構(gòu),并且基于寄存器的指令通常是時(shí)間上高效的。
[0019]存儲器模塊120包括針對各種存儲需要提供存儲器空間的一個(gè)或多個(gè)存儲介質(zhì)。在示例中,存儲器模塊120存儲要被處理模塊110執(zhí)行的代碼指令并且存儲要被處理模塊110處理的數(shù)據(jù)。在另一示例中,存儲器模塊120包括被分配用于系統(tǒng)存儲的存儲器空間,并且包括被分配用于用戶存儲的存儲器空間。
[0020]存儲介質(zhì)包括但不限于硬盤驅(qū)動、光盤、固態(tài)驅(qū)動、只讀存儲器(ROM)、動態(tài)隨機(jī)訪問存儲器(DRAM)、靜態(tài)隨機(jī)訪問存儲器(SRAM)、閃存等。
[0021]根據(jù)本公開的一方面,存儲器模塊120存儲各種計(jì)算機(jī)程序,例如系統(tǒng)程序、用戶應(yīng)用程序等。每個(gè)計(jì)算機(jī)程序包括要被執(zhí)行以執(zhí)行任務(wù)的代碼指令。
[0022]在圖1的示例中,存儲器空間130在存儲器模塊120中被分配用于存儲適合于系統(tǒng)100的Java軟件程序。該Java軟件程序被安裝在系統(tǒng)100中以提供Java運(yùn)行時(shí)環(huán)境(JRE),例如可以在系統(tǒng)100中被執(zhí)行的Java字節(jié)碼。在示例中,Java軟件程序被執(zhí)行以啟動系統(tǒng)100中的Java虛擬機(jī)用于執(zhí)行Java字節(jié)碼。在示例中,系統(tǒng)100是Android系統(tǒng),并且存儲器空間130存儲用于Android系統(tǒng)的Dalvik軟件程序。
[0023]在實(shí)施例中,用戶應(yīng)用程序的源代碼用Java語言來生成。源代碼被編譯以生成用于用戶應(yīng)用的Java字節(jié)碼。Java字節(jié)碼可被各種Java虛擬機(jī)執(zhí)行。在圖1的示例中,存儲器空間150被分配以存儲用于用戶應(yīng)用的Java字節(jié)碼。為了執(zhí)行Java字節(jié)碼,系統(tǒng)100啟動Java虛擬機(jī)。在示例中,CPU 111執(zhí)行存儲器空間130處的Java軟件以啟動Java虛擬機(jī)。Java虛擬機(jī)提供用于Java字節(jié)碼的Java運(yùn)行時(shí)環(huán)境。在示例中,在Java字節(jié)碼的執(zhí)行之后,Java虛擬機(jī)被終止。
[0024]根據(jù)本發(fā)明的一方面,Java虛擬機(jī)利用解析和即時(shí)(JIT)編譯用于Java字節(jié)碼執(zhí)行。在示例中,Java虛擬機(jī)檢測Java字節(jié)碼中經(jīng)常被執(zhí)行的軌跡,例如路徑、循環(huán)等,并且按照與比較不常被執(zhí)行的軌跡不同的方式執(zhí)行經(jīng)常被執(zhí)行的軌跡。Java虛擬機(jī)跟蹤針對軌跡的執(zhí)行次數(shù)。當(dāng)針對軌跡的執(zhí)行次數(shù)少于閾值(例如2)時(shí),Java虛擬機(jī)通過解析(interpretat1n)執(zhí)行軌跡;并且