亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

優(yōu)化的代碼生成的制作方法

文檔序號(hào):6414015閱讀:201來(lái)源:國(guó)知局
專(zhuān)利名稱(chēng):優(yōu)化的代碼生成的制作方法
技術(shù)領(lǐng)域
本發(fā)明涉及為數(shù)據(jù)處理系統(tǒng)生成可執(zhí)行程序代碼。
數(shù)據(jù)處理系統(tǒng)的內(nèi)存應(yīng)保持盡可能小以便使系統(tǒng)的成本不高。具體而言,這是對(duì)移動(dòng)終端如移動(dòng)電話、PDA等移動(dòng)數(shù)據(jù)處理系統(tǒng)的一項(xiàng)重要的一般要求。另一方面,需要允許移動(dòng)終端下載和執(zhí)行不斷增多的各種軟件應(yīng)用,從而增加了移動(dòng)終端中的內(nèi)存使用量。
此外,軟件應(yīng)用程序在數(shù)據(jù)處理系統(tǒng)上執(zhí)行時(shí)應(yīng)快速、高效地執(zhí)行。
還希望生成和下載的軟件也適用于不同類(lèi)型的數(shù)據(jù)處理系統(tǒng),例如,某個(gè)制造商的所有移動(dòng)電話。
因此,軟件應(yīng)用程序的共同要求包括-要存儲(chǔ)在數(shù)據(jù)處理系統(tǒng)中的代碼量小。
-機(jī)器無(wú)關(guān)的代碼。
-優(yōu)化的代碼。
例如,作為一種生成稱(chēng)為字節(jié)碼的平臺(tái)無(wú)關(guān)代碼的編程語(yǔ)言,Java為人所熟知。Java字節(jié)碼可以壓縮形式發(fā)布,例如,采用Lempel-Ziv壓縮或其它通用壓縮技術(shù)。
執(zhí)行Java字節(jié)碼有幾種可能的方式,包括由Java虛擬機(jī)器解釋、由生成可執(zhí)行代碼的編譯器提前編譯以及及時(shí)(JIT)編譯。然而,上述方法的缺點(diǎn)在于它們生成了機(jī)器相關(guān)的代碼或?qū)е麓a執(zhí)行緩慢,因而未滿(mǎn)足所有上述要求。具體而言,JIT編譯是一種通用方案,在該方案中,字節(jié)碼部分正好在其執(zhí)行前編譯。在執(zhí)行期間,編譯產(chǎn)生通??山邮艿拈_(kāi)銷(xiāo)。然而,由于及時(shí)編譯需要很短的時(shí)間以便限制此開(kāi)銷(xiāo),因此,所產(chǎn)生的代碼未很好地優(yōu)化,因而產(chǎn)生慢且效率低的可執(zhí)行代碼。
“統(tǒng)計(jì)代碼壓縮模型的自動(dòng)推論”(Christopher W.Fraser,,“Automatic Inference of Models for Statistical Code Compression”,(REF))一文公開(kāi)了一種壓縮計(jì)算機(jī)程序的方法,其中應(yīng)用了機(jī)器學(xué)習(xí)算法來(lái)壓縮常規(guī)編譯器的中間表示。
然而,上述先有技術(shù)方法未解決提供高效可執(zhí)行代碼的問(wèn)題。
本發(fā)明的又一目的是解決提供一種編碼方案的問(wèn)題,所述方案提供了改進(jìn)的壓縮率。
上述和其它問(wèn)題通過(guò)為數(shù)據(jù)處理系統(tǒng)生成可執(zhí)行程序代碼的一種方法得以解決;所述方法包括用于生成輸入代碼的壓縮中間表示的編碼級(jí),所述編碼級(jí)包括-對(duì)所述輸入碼進(jìn)行變換,包括執(zhí)行一組選定的代碼優(yōu)化步驟,從而產(chǎn)生變換代碼和有關(guān)所述變換代碼的編譯器信息;-從所述變換代碼和所述編譯器信息提取統(tǒng)計(jì)模型的狀態(tài)信息和統(tǒng)計(jì)信息;以及-使用所述提取的狀態(tài)信息和統(tǒng)計(jì)信息,將所述變換代碼和所述編碼器信息編碼,并產(chǎn)生所述壓縮中間表示;用于從所述壓縮中間表示生成所述可執(zhí)行程序代碼的解碼級(jí);所述解碼級(jí)包括-將所述壓縮中間表示解碼,從而得到所述變換代碼和所述編譯器信息;以及-使用所述解碼的編譯器信息進(jìn)一步編譯所述變換代碼,從而產(chǎn)生所述可執(zhí)行程序代碼。
因此,本發(fā)明的優(yōu)點(diǎn)在于它提供了用于編譯程序代碼的框架,這產(chǎn)生了程序代碼的高效壓縮中間表示并在所述編碼級(jí)的編譯期間高度優(yōu)化代碼。
術(shù)語(yǔ)優(yōu)化在本文中使用時(shí)的含意是以提高代碼性能為目的的變換。
因此,一個(gè)優(yōu)點(diǎn)是可在所述編碼級(jí)期間執(zhí)行耗時(shí)的優(yōu)化步驟,從而提供高度優(yōu)化的中間表示,而所述中間表示在解碼器處可變換成優(yōu)化的可執(zhí)行代碼而無(wú)需大的開(kāi)銷(xiāo)。
壓縮中間表示由于減小了要傳送到和/或存儲(chǔ)在數(shù)據(jù)處理系統(tǒng)中的代碼大小,因此它可高效地傳送到和/或存儲(chǔ)在數(shù)據(jù)處理系統(tǒng)中。本發(fā)明的一個(gè)優(yōu)點(diǎn)是它提供了高壓縮率。
本發(fā)明的一個(gè)優(yōu)點(diǎn)是除所述傳送代碼外,第一編譯級(jí)還提供編譯器信息。編譯器信息流包含對(duì)重建的可執(zhí)行代碼,如所述第一編譯級(jí)期間執(zhí)行的優(yōu)化分析的結(jié)果的正確性無(wú)直接影響的信息。所述編譯器信息有兩個(gè)用途-它可包含語(yǔ)義信息,如高級(jí)語(yǔ)言數(shù)據(jù)類(lèi)型,從而由于它允許更好的建模而改進(jìn)了壓縮。這可以是在更早的編譯遍(pass)中已由初始編譯器使用的信息,以及在寄存器值分布中反映的信息等。
-它可以傳送編譯器信息以供編譯器在解碼級(jí)使用。這可以是初始編譯器已從源文件中的輸入代碼提取的信息,但從壓縮的編譯數(shù)據(jù)提取是不容易,甚至是不可能的。
編譯器信息項(xiàng)可用于以上的一個(gè)或兩個(gè)用途。
因此,第一編譯級(jí)的編譯器信息可由編碼器利用,也可由解碼器級(jí)利用。因此,在目標(biāo)設(shè)備中進(jìn)一步編譯變換代碼的步驟要訪問(wèn)由編碼級(jí)的編譯步驟生成的編譯器信息,從而提高了目標(biāo)設(shè)備中生成代碼的性能。此外,編碼級(jí)期間編譯器信息的可用性提供了改進(jìn)的數(shù)據(jù)建模,從而提高了壓縮中間表示的壓縮率。
又一個(gè)優(yōu)點(diǎn)是,在根據(jù)本發(fā)明的框架內(nèi),編碼器與解碼器之間的壓縮和文件傳送可在任何編譯遍應(yīng)用。
此外,編碼器級(jí)中的編譯可根據(jù)特殊實(shí)施例的特定需要而進(jìn)行優(yōu)化。在一個(gè)實(shí)施例中,編碼器級(jí)中的編碼可進(jìn)行優(yōu)化以得到高壓縮率。在另一實(shí)施例中,編碼可適于在壓縮和編譯時(shí)之間提供一種折衷。
在優(yōu)選實(shí)施例中,在第一數(shù)據(jù)處理系統(tǒng)上執(zhí)行編碼級(jí),并在第二數(shù)據(jù)處理系統(tǒng)上執(zhí)行解碼級(jí);所述方法還包括將所述壓縮中間表示從所述第一數(shù)據(jù)處理系統(tǒng)傳送到所述第二數(shù)據(jù)處理系統(tǒng)。因此,初始編譯階段是在不同于目標(biāo)數(shù)據(jù)處理系統(tǒng)的數(shù)據(jù)處理系統(tǒng)上脫機(jī)執(zhí)行的,從而允許代碼優(yōu)化和/或需要多于目標(biāo)系統(tǒng)上可用資源的壓縮技術(shù)。因此,在此實(shí)施例中,壓縮階段發(fā)生在程序傳送到例如移動(dòng)電話等目標(biāo)系統(tǒng)前,而解壓縮和執(zhí)行階段發(fā)生在移動(dòng)電話上。相應(yīng)地,由編碼器和解碼器上的編譯器執(zhí)行的代碼優(yōu)化將分別稱(chēng)為傳送前和傳送后優(yōu)化。
變換代碼包括反映在編碼級(jí)中執(zhí)行的優(yōu)化步驟并適用于壓縮的計(jì)算機(jī)程序的表示。變換代碼可包括輸入代碼的任何適當(dāng)?shù)闹虚g表示,該表示可由解碼級(jí)進(jìn)一步編譯和鏈接,以獲得優(yōu)化的可執(zhí)行代碼。傳送代碼的示例包括優(yōu)化的機(jī)器無(wú)關(guān)中間表示、適用于目標(biāo)體系結(jié)構(gòu)有限類(lèi)的優(yōu)化的部分機(jī)器無(wú)關(guān)中間表示、僅適用于特定目標(biāo)體系結(jié)構(gòu)的優(yōu)化機(jī)器特定中間表示等。由于平臺(tái)無(wú)關(guān)性程度可能不同,因而可實(shí)現(xiàn)平臺(tái)無(wú)關(guān)性與優(yōu)化之間的折衷。
壓縮中間表示可通過(guò)無(wú)線通信(例如UMTS、藍(lán)牙或WLAN)、線路(例如USB、串行端口、以太網(wǎng))、可移動(dòng)存儲(chǔ)器(例如,多媒體卡、記憶棒)或其它方式傳送到目標(biāo)系統(tǒng)。
在其它實(shí)施例中,編碼級(jí)可在目標(biāo)設(shè)備如移動(dòng)電話上執(zhí)行。在此實(shí)施例中,移動(dòng)電話仍可利用高壓縮率和脫機(jī)優(yōu)化分析取得的良好優(yōu)化。
提取的狀態(tài)信息包括由編譯器生成的有關(guān)編譯期間編譯器狀態(tài)的信息。在本發(fā)明的優(yōu)選實(shí)施例中,生成狀態(tài)信息和統(tǒng)計(jì)信息的步驟還包括
-根據(jù)變換代碼和編譯器信息,從狀態(tài)機(jī)獲取狀態(tài)信息;以及-根據(jù)所獲取的狀態(tài)信息,從統(tǒng)計(jì)模型獲取概率信息。
本發(fā)明的優(yōu)點(diǎn)在于它提供了導(dǎo)致高壓縮率的數(shù)據(jù)建模。
狀態(tài)機(jī)可包括多個(gè)模型,這些模型結(jié)合起來(lái)產(chǎn)生統(tǒng)計(jì)模型的狀態(tài)變量。
在一個(gè)實(shí)施例中,狀態(tài)機(jī)包括至少所述變換代碼和所述編譯器信息之一的語(yǔ)法模型。例如,狀態(tài)可以是編譯數(shù)據(jù)流中在前符號(hào)的函數(shù)。
在一個(gè)實(shí)施例中,狀態(tài)機(jī)包括變換代碼的執(zhí)行模型,其中,狀態(tài)變量可以是例如虛擬機(jī)棧的內(nèi)容,或存儲(chǔ)器存取模式的函數(shù)。
在又一優(yōu)選實(shí)施例中,狀態(tài)機(jī)包括編譯器信息的模型。編譯器信息的統(tǒng)計(jì)模型取決于編譯器信息有類(lèi)型,并可包括諸如類(lèi)信息、數(shù)據(jù)類(lèi)型、變量的寄存器分配、上下文信息等不容易從編譯數(shù)據(jù)流中獲取的元素。因此,改進(jìn)的壓縮率可通過(guò)利用編譯器信息來(lái)實(shí)現(xiàn)。
因此,通過(guò)組合根據(jù)本發(fā)明的編譯和編碼級(jí),并向編碼器提供有關(guān)變換代碼語(yǔ)法和有關(guān)其內(nèi)容的信息,例如,有關(guān)類(lèi)信息、數(shù)據(jù)類(lèi)型、上下文信息等的信息,可取得改進(jìn)的數(shù)據(jù)建模,從而取得提高的壓縮率。
在本發(fā)明的優(yōu)選實(shí)施例中,所述方法還包括-存儲(chǔ)所述壓縮中間表示;以及-結(jié)合所生成的可執(zhí)行程序代碼的后續(xù)執(zhí)行來(lái)執(zhí)行所述解碼級(jí)。
因此,根據(jù)經(jīng)過(guò)壓縮且至少部分平臺(tái)無(wú)關(guān)的表示,可由目標(biāo)設(shè)備生成高效的可執(zhí)行代碼,其中,代碼生成只造成與實(shí)際代碼執(zhí)行有關(guān)的很少開(kāi)銷(xiāo),并且其中只需少量的存儲(chǔ)空間用于在目標(biāo)設(shè)備上存儲(chǔ)壓縮中間表示。因此,根據(jù)此實(shí)施例,解碼級(jí)作為及時(shí)(JIT)過(guò)程執(zhí)行,即,在給定軟件執(zhí)行內(nèi)初次使用壓縮中間表示時(shí),將壓縮中間表示存儲(chǔ)并對(duì)其進(jìn)行解壓縮/解碼。隨后,在整個(gè)應(yīng)用程序執(zhí)行期間存儲(chǔ)器中提供解壓縮/解碼的代碼。
在又一實(shí)施例中,壓縮代碼從網(wǎng)絡(luò)服務(wù)器傳送到固定的臺(tái)式計(jì)算機(jī),在臺(tái)式計(jì)算機(jī)中進(jìn)行解碼并執(zhí)行。注意,壓縮中間表示可傳送到多個(gè)不同的接收設(shè)備,每個(gè)設(shè)備實(shí)施不同的解碼級(jí)實(shí)現(xiàn)方案。例如,可分別對(duì)移動(dòng)電話、PDA和PC實(shí)現(xiàn)不同的解碼器。
在其它實(shí)施例中,代碼在移動(dòng)設(shè)備上壓縮并傳送到服務(wù)器,并在以后下載到具有不同平臺(tái)的一個(gè)或多個(gè)移動(dòng)設(shè)備。因此,在放置在目標(biāo)設(shè)備上后,壓縮中間表示可在同一設(shè)備或不同設(shè)備上解壓縮/執(zhí)行。另外,在一些實(shí)施例中,它可傳送到其它目標(biāo)設(shè)備,或者上載到服務(wù)器以進(jìn)一步分發(fā)。
在一個(gè)實(shí)施例中,壓縮中間表示由計(jì)算機(jī)上執(zhí)行的編譯程序產(chǎn)生,該計(jì)算機(jī)采用不同于將被壓縮的代碼(例如,Java字節(jié)碼)和/或目標(biāo)系統(tǒng)(例如,基于ARM94的移動(dòng)電話)的指令格式(例如,基于Pentium-4的臺(tái)式PC)。然而,在其它實(shí)施例中,指令格式可以相同或部分相同。
輸入代碼可以是不同于主機(jī)處理器標(biāo)準(zhǔn)可執(zhí)行格式的計(jì)算機(jī)程序的任何適當(dāng)表示。在本發(fā)明的一個(gè)實(shí)施例中,輸入代碼包括Java字節(jié)碼。
此類(lèi)輸入代碼的其它示例包括-被解釋或以某種方式編譯用于基礎(chǔ)體系結(jié)構(gòu)的平臺(tái)無(wú)關(guān)代碼格式。
-具有另一體系結(jié)構(gòu)的處理器上的一種體系結(jié)構(gòu)的二進(jìn)制代碼的執(zhí)行,例如,Intel X86代碼在ARM處理器上的執(zhí)行。
在本發(fā)明還有的另一優(yōu)選實(shí)施例中,變換代碼包括多個(gè)代碼元素,并且所述方法還包括確定所述代碼元素的概率分布,并將所確定的概率分布提供給生成統(tǒng)計(jì)信息的步驟。本發(fā)明的優(yōu)點(diǎn)在于它提供了可適用于許多不同類(lèi)型代碼的壓縮方法?;蛘撸怕史植伎深A(yù)先確定并制成表格,從而提供進(jìn)一步改進(jìn)的壓縮率。
變換代碼和編譯器信息可以不同的方式耦合。在一個(gè)實(shí)施例中,它們完全交織,從而在解碼器上的編譯器需要時(shí)為其提供信息。在另一個(gè)實(shí)施例中,所有編譯器信息作為變換代碼的前置數(shù)據(jù)傳送和/或存儲(chǔ)。也可能存在中間形式。
本發(fā)明可以不同的方式實(shí)施,包括上述方法和如下系統(tǒng)及其它產(chǎn)品裝置,每個(gè)均提供了聯(lián)系最先所述方法描述的一個(gè)或多個(gè)益處和優(yōu)點(diǎn),并且每個(gè)均具有與聯(lián)系最先所述方法描述并在所附權(quán)利要求書(shū)中公開(kāi)的優(yōu)選實(shí)施例相對(duì)應(yīng)的一個(gè)或多個(gè)優(yōu)選實(shí)施例。
注意,前面和下文所述的方法特征可在軟件中實(shí)施,并可在數(shù)據(jù)處理系統(tǒng)中或由執(zhí)行計(jì)算機(jī)可執(zhí)行指令驅(qū)動(dòng)的其它處理裝置中執(zhí)行。指令可以是經(jīng)計(jì)算機(jī)網(wǎng)絡(luò)從存儲(chǔ)介質(zhì)或另一計(jì)算機(jī)裝入存儲(chǔ)器如RAM中的程序代碼組件?;蛘咚鎏卣骺梢杂捎策B線電路而非軟件,或者結(jié)合軟件來(lái)實(shí)現(xiàn)。
本發(fā)明還涉及為數(shù)據(jù)處理系統(tǒng)生成程序代碼的方法;所述方法包括-對(duì)輸入代碼進(jìn)行變換,包括執(zhí)行一組選定的優(yōu)化步驟,從而產(chǎn)生變換代碼和有關(guān)所述變換代碼的編譯器信息;-從所述變換代碼和所述編譯器信息提取統(tǒng)計(jì)模型的狀態(tài)信息和統(tǒng)計(jì)信息;以及-使用所述提取的狀態(tài)信息和統(tǒng)計(jì)信息將所述變換代碼和所述編譯信息編碼,并產(chǎn)生所述輸入代碼的壓縮中間表示;所述壓縮中間表示適于在后續(xù)的解碼級(jí)中進(jìn)行解碼并進(jìn)一步編譯以生成可執(zhí)行程序代碼。
本發(fā)明還涉及在數(shù)據(jù)處理系統(tǒng)中生成可執(zhí)行程序代碼的方法;所述方法包括
-接收輸入代碼的壓縮中間表示,所述壓縮中間表示包括由編譯器生成并至少部分優(yōu)化的編碼變換代碼和表示由所述編譯器生成的有關(guān)所述變換代碼的其它信息的編碼編譯器信息;所述編碼變換代碼和所述編碼編譯器信息利用從所述變換代碼和所述編譯器信息中提取的統(tǒng)計(jì)模型的狀態(tài)信息和統(tǒng)計(jì)信息進(jìn)行編碼;-將所述壓縮中間表示解碼,從而得到所述變換代碼和所述編譯器信息;以及-使用所述解碼的編譯器信息進(jìn)一步編譯所述變換代碼,從而產(chǎn)生所述可執(zhí)行程序代碼。
本發(fā)明還涉及用于生成可執(zhí)行程序代碼的數(shù)據(jù)處理系統(tǒng),所述系統(tǒng)包括適于生成輸入代碼的壓縮中間表示的編碼模塊;所述編碼模塊包括-適于對(duì)所述輸入代碼進(jìn)行變換的第一編譯器裝置,包括執(zhí)行一組選定的代碼優(yōu)化步驟并產(chǎn)生變換代碼和有關(guān)所述變換代碼的編譯器信息;-處理裝置,適于從所述變換代碼和所述編譯器信息提取統(tǒng)計(jì)模型的狀態(tài)信息和統(tǒng)計(jì)信息;以及-編碼裝置,適于使用所提取的狀態(tài)信息和統(tǒng)計(jì)信息將所述變換代碼和所述編譯器信息編碼,并產(chǎn)生所述壓縮中間表示;適于從所述壓縮中間表示生成所述可執(zhí)行程序代碼的解碼模塊;所述解碼模塊包括-解碼裝置,適于將所述壓縮中間表示解碼,從而得到所述變換代碼和所述編譯器信息;以及-第二編譯器裝置,適于使用所述解碼的編譯器信息進(jìn)一步編譯所述變換代碼,從而產(chǎn)生所述可執(zhí)行程序代碼。
本發(fā)明還涉及用于為數(shù)據(jù)處理系統(tǒng)生成程序代碼的編碼設(shè)備;所述編碼設(shè)備包括-用于對(duì)輸入代碼進(jìn)行變換的編譯器裝置,包括執(zhí)行一組選定的代碼優(yōu)化步驟,從而產(chǎn)生變換代碼和有關(guān)所述變換代碼的編譯器信息;-處理裝置,適于從所述變換代碼和所述編譯器信息中提取統(tǒng)計(jì)模型的狀態(tài)信息和統(tǒng)計(jì)信息;以及-編碼裝置,適于使用所述提取的狀態(tài)信息和統(tǒng)計(jì)信息將所述變換代碼和所述編譯器信息編碼,并產(chǎn)生所述輸入代碼的所述壓縮中間表示;所述壓縮中間表示適于在后續(xù)的解碼級(jí)中進(jìn)行解碼并進(jìn)一步編譯以生成可執(zhí)行程序代碼。
本發(fā)明還涉及用于生成可執(zhí)行程序代碼的數(shù)據(jù)處理系統(tǒng);所述數(shù)據(jù)處理系統(tǒng)包括-適于接收輸入代碼的壓縮中間表示的接收裝置,所述壓縮中間表示包括由編譯器生成并至少部分優(yōu)化的編碼變換代碼和由所述編譯器生成的表示所述編譯器生成的其它信息的編碼編譯器信息;所述編碼變換代碼和所述編碼編譯器信息利用從所述變換代碼和所述編譯器信息中提取的統(tǒng)計(jì)模型的狀態(tài)信息和統(tǒng)計(jì)信息進(jìn)行編碼;-解碼裝置,適于將所述壓縮中間表示解碼,從而得到所述變換代碼和所述編譯器信息;以及-編譯器裝置,適于使用所述解碼的編譯器信息進(jìn)一步編譯所述變換代碼,從而產(chǎn)生所述可執(zhí)行程序代碼。
本發(fā)明還涉及包括輸入代碼的壓縮中間表示的數(shù)據(jù)記錄;所述壓縮中間表示包括由編譯器生成并至少部分優(yōu)化的編碼變換代碼和表示所述編譯器生成的其它信息的編碼編譯器信息;所述編碼變換代碼和所述編碼編譯器信息利用從所述變換代碼和所述編譯器信息中提取的統(tǒng)計(jì)模型的狀態(tài)信息和統(tǒng)計(jì)信息進(jìn)行編碼;數(shù)據(jù)處理系統(tǒng)對(duì)所述壓縮中間表示進(jìn)行解碼并進(jìn)一步編譯,從而產(chǎn)生可執(zhí)行程序代碼。
下面將結(jié)合優(yōu)選實(shí)施例,參照附圖更詳細(xì)地描述本發(fā)明的上述和其它方面,其中

圖1顯示了根據(jù)本發(fā)明實(shí)施例的系統(tǒng)方框圖,包括用于生成壓縮中間表示的計(jì)算機(jī)和移動(dòng)終端;圖2示意性地顯示了生成有效本機(jī)二進(jìn)制碼的典型優(yōu)化Java字節(jié)碼提前編譯器不同級(jí)的示例;圖3顯示了根據(jù)本發(fā)明實(shí)施例的編碼器方框圖;圖4顯示了根據(jù)本發(fā)明實(shí)施例的解碼器方框圖;圖5顯示了Java字節(jié)碼的一個(gè)示例段的流程圖;圖6顯示了Java字節(jié)碼的另一個(gè)示例段的流程圖;以及圖7顯示了根據(jù)本發(fā)明實(shí)施例,用于生成可執(zhí)行代碼的數(shù)據(jù)處理系統(tǒng)的方框圖。
圖1顯示了根據(jù)本發(fā)明實(shí)施例的系統(tǒng)方框圖,包括用于生成壓縮中間表示的計(jì)算機(jī)101和用于接收壓縮中間表示并生成可執(zhí)行計(jì)算機(jī)代碼的目標(biāo)設(shè)備102。計(jì)算機(jī)101包括處理單元(CPU)104、通信單元105、RAM 111及數(shù)據(jù)存儲(chǔ)裝置106如硬盤(pán)。存儲(chǔ)在數(shù)據(jù)存儲(chǔ)裝置106的數(shù)據(jù)包括要編譯成用于目標(biāo)設(shè)備102的可執(zhí)行代碼的輸入代碼107、由處理單元執(zhí)行的編碼進(jìn)程生成的壓縮中間表示108、由編碼進(jìn)程使用的狀態(tài)機(jī)模型109和在由處理單元運(yùn)行時(shí)實(shí)現(xiàn)編碼進(jìn)程的程序代碼110。因此,在編碼程序裝入RAM 114中并由CPU執(zhí)行時(shí),CPU將輸入代碼107和狀態(tài)機(jī)數(shù)據(jù)裝入RAM,并創(chuàng)建壓縮中間表示。壓縮中間表示可存儲(chǔ)在數(shù)據(jù)存儲(chǔ)裝置上以便隨后傳輸?shù)揭粋€(gè)或多個(gè)目標(biāo)設(shè)備,或者它可直接經(jīng)通信單元105發(fā)送。
在一些實(shí)施例中,在一臺(tái)計(jì)算機(jī)上創(chuàng)建壓縮中間表示,然后將其傳送到服務(wù)器計(jì)算機(jī);壓縮中間表示可從服務(wù)器計(jì)算機(jī)發(fā)送到一個(gè)或多個(gè)目標(biāo)設(shè)備。
通信單元105包括適于經(jīng)通信鏈路103將數(shù)據(jù)傳送到目標(biāo)設(shè)備102的電路和/或裝置。此類(lèi)電路的示例包括用于無(wú)線通信(例如,UMTS、藍(lán)牙或WLAN)的無(wú)線電發(fā)射機(jī)/接收機(jī)、適于其它適當(dāng)電磁信號(hào)的接收機(jī)/發(fā)射機(jī)、適于實(shí)現(xiàn)有線通信的電路如網(wǎng)絡(luò)接口、網(wǎng)絡(luò)卡、電纜調(diào)制解調(diào)器、電話調(diào)制解調(diào)器、綜合業(yè)務(wù)數(shù)字網(wǎng)(ISDN)適配器、數(shù)字用戶(hù)線(DSL)適配器、USB端口、串行端口、以太網(wǎng)適配器等。
目標(biāo)設(shè)備102包括對(duì)應(yīng)的通信單元111、處理單元112和存儲(chǔ)器113。在收到壓縮中間表示后,該表示可存儲(chǔ)在該設(shè)備的存儲(chǔ)器113中以便后續(xù)編譯,例如,在程序代碼將要執(zhí)行時(shí)的及時(shí)編譯。因此,在程序代碼要由處理單元112執(zhí)行時(shí),處理單元112從存儲(chǔ)器113裝入壓縮中間表示,例如裝入RAM中(未明示),將壓縮中間表示解碼并生成可執(zhí)行代碼,該可執(zhí)行代碼隨后由處理單元112執(zhí)行。其優(yōu)點(diǎn)在于通過(guò)存儲(chǔ)壓縮表示,降低了在存儲(chǔ)器113中存儲(chǔ)程序代碼所需的存儲(chǔ)空間。根據(jù)本發(fā)明,由于代碼編譯的耗時(shí)優(yōu)化步驟在計(jì)算機(jī)101上的編碼期間脫機(jī)執(zhí)行,因此,目標(biāo)設(shè)備102上的及時(shí)編譯只需要很少的額外開(kāi)銷(xiāo),但生成高效、經(jīng)過(guò)良好優(yōu)化的程序代碼,從而確保目標(biāo)設(shè)備上的高效性能。
在其它實(shí)施例中,中間表示可提前解碼和編譯,例如,在經(jīng)通信單元111接收壓縮中間表示的數(shù)據(jù)流時(shí),處理單元112可將該表示解碼而生成可執(zhí)行代碼,并存儲(chǔ)到存儲(chǔ)器113中。此實(shí)施例具有的優(yōu)點(diǎn)是與實(shí)際執(zhí)行有關(guān)的開(kāi)銷(xiāo)將進(jìn)一步降到最低。此外,此實(shí)施例利用了在代碼從計(jì)算機(jī)101發(fā)送到目標(biāo)設(shè)備期間壓縮中間表示的小尺寸。
根據(jù)本發(fā)明,在由處理單元104執(zhí)行的編碼期間執(zhí)行編譯的選擇和代碼優(yōu)化步驟,從而產(chǎn)生優(yōu)化的中間表示,該中間表示在編碼期間以及在傳送到目標(biāo)設(shè)備之前壓縮。因此,在下文中,此中間表示也將稱(chēng)為可壓縮的中間表示(CIR)。包括編碼CIR的數(shù)據(jù)記錄也將稱(chēng)為目標(biāo)文件。
編碼器執(zhí)行的具體選擇的優(yōu)化步驟以及中間表示的平臺(tái)無(wú)關(guān)程度取決于具體實(shí)施例,下面將對(duì)此作更詳細(xì)的描述。
圖2示意性地顯示了生成有效本機(jī)二進(jìn)制碼的典型優(yōu)化Java字節(jié)碼提前編譯器的不同級(jí)的示例。不同的編譯和優(yōu)化步驟201-205將Java字節(jié)碼206經(jīng)多個(gè)中間表示(IR)207-210轉(zhuǎn)換成給定平臺(tái)的優(yōu)化的本機(jī)代碼211。注意,在不同步驟之間,除暫時(shí)存儲(chǔ)外,無(wú)需將不同的中間表示存儲(chǔ)在文件中或甚至在存儲(chǔ)器中,但它們可只以概念格式存在,從而可加以存儲(chǔ)。還注意,圖2所示的大多數(shù)優(yōu)化步驟由于編譯步驟的時(shí)間限制而在JIT編譯器中不可行。
在下述內(nèi)容中,結(jié)合Java字節(jié)碼的轉(zhuǎn)換描述了本發(fā)明的優(yōu)選實(shí)施例。
根據(jù)本發(fā)明,要執(zhí)行代碼優(yōu)化的兩個(gè)主要部分。第一部分是在將目標(biāo)文件傳送到目標(biāo)設(shè)備前完成,而第二個(gè)部分是在下載目標(biāo)文件后在目標(biāo)設(shè)備完成。在下述內(nèi)容中,這兩個(gè)部分將分別表示為傳送前優(yōu)化和傳送后優(yōu)化。傳送前是提前優(yōu)化,而傳送后可以是提前優(yōu)化、及時(shí)優(yōu)化,或兩者的組合。
最初,Java字節(jié)碼變換成CIR,CIR饋入執(zhí)行一組代碼優(yōu)化步驟的優(yōu)化程序中。為縮短目標(biāo)設(shè)備上的編譯時(shí),最好在傳送前階段執(zhí)行盡可能多的優(yōu)化。原則上,所有優(yōu)化可在傳送前完成,并且可下載含機(jī)器指令的最終二進(jìn)制文件并使其在終端上執(zhí)行,而無(wú)需任何傳送后優(yōu)化。此方案的優(yōu)點(diǎn)是可消除終端上的編譯時(shí)。
然而,傳送后執(zhí)行某些優(yōu)化步驟的優(yōu)點(diǎn)在于產(chǎn)生的中間表示是至少部分平臺(tái)無(wú)關(guān)的。例如,將來(lái)的目標(biāo)設(shè)備可具有在軟件編譯時(shí)未預(yù)計(jì)到的硬件特征。這些特征可由傳送后優(yōu)化步驟利用,從而提高生成的可執(zhí)行代碼的效率。
生成(部分)機(jī)器無(wú)關(guān)的中間表示并在目標(biāo)設(shè)備上執(zhí)行某些傳送后優(yōu)化的又一優(yōu)點(diǎn)在于提供下載的站點(diǎn)不需要為所有不同的硬件平臺(tái)保持大量不同的程序版本。
也執(zhí)行傳送后優(yōu)化的又一優(yōu)點(diǎn)在于可采用并調(diào)整反饋導(dǎo)向的優(yōu)化,以適應(yīng)終端用戶(hù)的實(shí)際行為,而非將優(yōu)化限制為針對(duì)“普通用戶(hù)”。
在下述內(nèi)容中,將描述最好可以在傳送前執(zhí)行的多個(gè)優(yōu)選優(yōu)化。
然而,應(yīng)注意,哪些優(yōu)化應(yīng)在傳送前執(zhí)行以及哪些優(yōu)化應(yīng)在傳送后執(zhí)行的確切區(qū)別可加以調(diào)整,以適應(yīng)特殊的平臺(tái)。因此,傳送前優(yōu)化和傳送后的確切界線不應(yīng)視為是固定的,而是取決于多個(gè)系統(tǒng)特定的設(shè)計(jì)參數(shù)。此類(lèi)參數(shù)的一個(gè)示例是指示哪些指令集體系結(jié)構(gòu)是目標(biāo)指令集體系結(jié)構(gòu)的參數(shù)。
通常,本領(lǐng)域中已知多種不同的優(yōu)化技術(shù)。機(jī)器無(wú)關(guān)的優(yōu)化傳統(tǒng)上使用20世紀(jì)70年代期間開(kāi)發(fā)的框架,并且基于使用位矢量的迭代數(shù)據(jù)流分析(參見(jiàn)例如“編譯器-原理、技術(shù)和工具”[Al Aho,Revi Sethi,Jeffrey Ullman,“Compilers-Principles,Techniques,andTools”,Addison-Wesley,1986])。在20世紀(jì)80年代末,開(kāi)發(fā)了稱(chēng)為靜態(tài)單一賦值格式(即SSA格式)的新的更有效且功能更強(qiáng)大的優(yōu)化框架(參見(jiàn)例如“現(xiàn)代編譯器的Java實(shí)現(xiàn)”[Andrew Appel,“Modern compiler Implementation in Java”,Cambridge UniversityPress,1998])。
傳送前優(yōu)化控制流程圖結(jié)構(gòu)和分析進(jìn)行優(yōu)化前,應(yīng)完成過(guò)程轉(zhuǎn)移指令的分析。此分析的結(jié)果是稱(chēng)為控制流程圖的有向圖。在控制流程圖構(gòu)建期間,從過(guò)程中去除不可達(dá)的代碼。通過(guò)使用控制流程圖,計(jì)算出支配樹(shù)(dominator tree)(參見(jiàn)例如“現(xiàn)代編譯器的Java實(shí)現(xiàn)”[Andrew Appel,“Modern compiler Implementation in Java”,CambridgeUniversity Press,1998])和循環(huán)嵌套。
調(diào)用圖構(gòu)建調(diào)用圖描述過(guò)程間的控制流,即,哪個(gè)過(guò)程可調(diào)用哪些過(guò)程。它用于過(guò)程間數(shù)據(jù)流分析以確定過(guò)程調(diào)用的副作用。
過(guò)程調(diào)用優(yōu)化此處,目標(biāo)是減少或消除過(guò)程調(diào)用的開(kāi)銷(xiāo)。編譯時(shí)已知的小過(guò)程(不包括面向?qū)ο缶幊陶Z(yǔ)言中的大多數(shù)虛函數(shù))可以?xún)?nèi)聯(lián)。過(guò)程內(nèi)聯(lián)時(shí)消除了調(diào)用開(kāi)銷(xiāo),但指令高速緩存的效率可能降低。除了消除調(diào)用開(kāi)銷(xiāo)外,其它優(yōu)化技術(shù)通常由于要處理更大的過(guò)程而變得更有效。遞歸過(guò)程一般不是內(nèi)聯(lián)的目標(biāo)(雖然它們可以部分內(nèi)聯(lián)),但一些遞歸過(guò)程可使用稱(chēng)為尾遞歸消除的技術(shù)進(jìn)行優(yōu)化。如果在遞歸調(diào)用后沒(méi)有語(yǔ)句,則該調(diào)用可變成跳到過(guò)程開(kāi)始處的goto語(yǔ)句。
數(shù)組引用的標(biāo)量替換數(shù)組引用的標(biāo)量替換是為數(shù)組元素進(jìn)行寄存器分配的技術(shù)(參見(jiàn)例如“現(xiàn)代體系結(jié)構(gòu)的優(yōu)化編譯器[RandyAllen,Ken Kennedy,“Optimising Compilers for ModernArchitectures”,Morgan Kaufmann Publishers,2002])。此優(yōu)化實(shí)際上不分配任何處理器寄存器,相反,數(shù)組元素保持在編譯器生成的臨時(shí)變量中。隨后,正常的寄存器分配將這些臨時(shí)變量分配給處理器寄存器(如果有利)。數(shù)組引用的標(biāo)量替換本身的執(zhí)行并不非常耗時(shí),但它依賴(lài)于具有可用的數(shù)據(jù)相關(guān)信息。在及時(shí)優(yōu)化器中計(jì)算此信息可能在大多數(shù)環(huán)境下過(guò)于昂貴。
帶條件轉(zhuǎn)移的常量傳播通過(guò)從過(guò)程的第一個(gè)語(yǔ)句開(kāi)始解釋過(guò)程而傳播盡可能多的常量,常量傳播簡(jiǎn)化了過(guò)程。常量傳播在SSA格式上可用,并且應(yīng)在傳送前優(yōu)化期間執(zhí)行。
操作符強(qiáng)度降低操作符強(qiáng)度降低(operator strength reduction)也是以數(shù)組引用為目標(biāo)的優(yōu)化技術(shù)。數(shù)組引用形式為a[i]格式時(shí),為找出元素地址需要乘法。操作符強(qiáng)度降低將循環(huán)中的數(shù)組引用變換成轉(zhuǎn)為使用指針的代碼(無(wú)需乘法)。操作符強(qiáng)度降低是最重要的機(jī)器無(wú)關(guān)優(yōu)化方法之一,在SSA格式上可用,且最好應(yīng)在傳送前優(yōu)化期間執(zhí)行。
全局值編號(hào)全局值編號(hào)屬于旨在去除冗余計(jì)算的優(yōu)化技術(shù)系列。一個(gè)語(yǔ)句如果重復(fù)計(jì)算已經(jīng)計(jì)算出的值,則該語(yǔ)句稱(chēng)為冗余。在下面的示例中,假定操作符強(qiáng)度降低不能消除數(shù)組引用中的乘法(例如,由于代碼不在循環(huán)中)。在下面的代碼段中,i和第二數(shù)組引用中元素大小的相乘是多余的x=a[i]if(x<y)y=a[i]采用與有限狀態(tài)機(jī)最小化期間查找等效狀態(tài)時(shí)所用相同的原理,全局值編號(hào)證明哪些語(yǔ)句是等效的。在某些環(huán)境下,可去除一些等效語(yǔ)句。全局編號(hào)在SSA格式上可用,并最好應(yīng)在傳送前優(yōu)化期間執(zhí)行。
部分冗余消除部分冗余消除(PRE)是旨在消除冗余計(jì)算的另一技術(shù)。為盡可能簡(jiǎn)單地介紹PRE可以執(zhí)行的操作,可考慮以下示例代碼段if(a<b) if(a<b){c=x*y; t=x*y;else c=t;d=a+b;} else{e=x*y; d=a+b;t=x*y;}e=t;左側(cè)是部分冗余如果條件為真,則將計(jì)算兩次x*y。如果條件為假,則不存在冗余。通過(guò)在else部分插入額外的x*y,可刪除第二次相乘。PRE概括了此操作,而且還可去除循環(huán)外的語(yǔ)句。PRE是十分復(fù)雜的功能很強(qiáng)大的優(yōu)化。PRE在SSA格式上可用,并最好應(yīng)在傳送前優(yōu)化期間執(zhí)行。
失效代碼刪除通過(guò)使用控制相關(guān)信息,在失效代碼刪除期間刪除了無(wú)法影響過(guò)程可視行為的所有語(yǔ)句(除其執(zhí)行時(shí)間外)。失效代碼刪除在SSA格式上可用,并最好應(yīng)在傳送前優(yōu)化期間執(zhí)行。
傳送后優(yōu)化下面簡(jiǎn)述最好應(yīng)在傳送后執(zhí)行的多個(gè)優(yōu)化技術(shù)。
循環(huán)展開(kāi)循環(huán)展開(kāi)重復(fù)循環(huán)體,從而消除轉(zhuǎn)移語(yǔ)句。由于循環(huán)展開(kāi)一般會(huì)增加代碼大小,因此,最好應(yīng)在傳送后優(yōu)化期間執(zhí)行循環(huán)展開(kāi)。
轉(zhuǎn)移重排序利用來(lái)自先前執(zhí)行的反饋,可將轉(zhuǎn)移重排序以便執(zhí)行更少的轉(zhuǎn)移,如下面的示例代碼段所示while((c=getchar())?。紼OF){ Ac=getchar();if(c==′\n′) if(c>″)X; Z;else if(c==″) else if(c==″)Y; Y;else else if(c==′\n′)Z; X;} else if(c==EOF)goto B;elseZ;goto A;B如果“新行”和空格不是從輸入中最常讀到的字符,則右側(cè)的代碼將執(zhí)行比左側(cè)代碼更少的轉(zhuǎn)移。此優(yōu)化可在傳送前或傳送后執(zhí)行。傳送后執(zhí)行此優(yōu)化的優(yōu)點(diǎn)在于隨后可調(diào)整轉(zhuǎn)移以適應(yīng)特殊用戶(hù)的行為。
第一遍指令調(diào)度指序調(diào)度將指令重新排序以便降低流水線暫停的次數(shù)。雖然在超標(biāo)量處理器上可在傳送前執(zhí)行指令調(diào)度,但它可能產(chǎn)生不是次佳的代碼(因?yàn)楸仨毤俣ㄖ噶钛舆t的常見(jiàn)模型)。在超標(biāo)量處理器上,代碼在功能上仍然正確(由于硬件在需要時(shí)可使執(zhí)行延遲),但在VLIM處理器上,它將變得更為復(fù)雜。直線式代碼(straight line code)(所謂基本塊)范圍內(nèi)的調(diào)度指令并不很耗時(shí),但僅對(duì)諸如單發(fā)射RISC處理器等相對(duì)簡(jiǎn)單的處理器有用。對(duì)于超標(biāo)量處理器,必需跨基本塊調(diào)度指令,例如使用跟蹤調(diào)度(參見(jiàn)例如“構(gòu)建優(yōu)化編譯器”[Robert Morgan,“Building an OptimisingCompiler”,Digital Press,1998])??缁緣K調(diào)度指令需要正在被優(yōu)化的過(guò)程的控制流程圖的支配樹(shù)。為了傳送前優(yōu)化,還計(jì)算支配樹(shù),并因此可將其存儲(chǔ)在目標(biāo)文件中并傳送到終端。然而,在傳送后優(yōu)化期間重新計(jì)算支配樹(shù)可以足夠快地完成。跟蹤調(diào)度可利用有關(guān)轉(zhuǎn)移頻率的反饋信息而變得更為有效。對(duì)于許多內(nèi)循環(huán),使用稱(chēng)為軟件流水化的成本更高的調(diào)度技術(shù),可實(shí)現(xiàn)更高的性能。軟件流水化需要有關(guān)數(shù)組引用的數(shù)據(jù)相關(guān)信息,這在及時(shí)編譯器計(jì)算起來(lái)很耗時(shí)。一種替代方案是傳送只與傳送前優(yōu)化確定要在傳送后優(yōu)化期間從軟件流水化獲益的那些內(nèi)循環(huán)有關(guān)的數(shù)據(jù)相關(guān)信息。
寄存器分配寄存器分配確定哪些變量應(yīng)存儲(chǔ)在處理器寄存器中及何時(shí)存儲(chǔ)。此優(yōu)化在指令調(diào)度后執(zhí)行,這是因?yàn)樵谥噶钫{(diào)度完成后可知道有關(guān)同時(shí)使用哪些變量的信息。
第二遍指令調(diào)度如果寄存器分配將一些變量溢出到存儲(chǔ)器,則執(zhí)行第二遍指令調(diào)度以在代碼中將裝入指令上移。
平臺(tái)無(wú)關(guān)性一些優(yōu)化在了解有關(guān)目標(biāo)平臺(tái)的更多信息時(shí)可產(chǎn)生更好的結(jié)果。例如,如果指令調(diào)度器知道每條指令的等待時(shí)間,則與它針對(duì)某個(gè)處理器模型只用指令等待時(shí)間估計(jì)值進(jìn)行調(diào)度相比,通??梢援a(chǎn)生更好的調(diào)度。盡管如此,人們可能希望在下載到終端前執(zhí)行一些典型的傳送后優(yōu)化。如上所述,人們當(dāng)然可以在傳送前執(zhí)行以特定芯片為目標(biāo)的所有優(yōu)化。其缺點(diǎn)是具有只為特定指令集體系結(jié)構(gòu)或芯片優(yōu)化的應(yīng)用程序版本。然而,人們也可以決定以平臺(tái)無(wú)關(guān)的方式,以不過(guò)分優(yōu)化代碼為代價(jià),執(zhí)行例如指令調(diào)度或寄存器分配(它們是典型的傳送后優(yōu)化)。
一個(gè)益處是可實(shí)現(xiàn)更容易的軟件分布,這是因?yàn)樾枰俚陌姹?。另一個(gè)益處是傳送后優(yōu)化更快,因?yàn)榱艚o終端的工作更少。下面,針對(duì)指令調(diào)度和寄存器分配闡述了這種折衷。
指令調(diào)度許多指令集體系結(jié)構(gòu)具有大量共同的指令,如存儲(chǔ)器存取指令及整數(shù)與浮點(diǎn)運(yùn)算指令。大多數(shù)處理器芯片的共同之處還在于例如乘法和除法指令執(zhí)行時(shí)間比其它指令長(zhǎng)。因此,無(wú)論代碼將在哪個(gè)目標(biāo)芯片上執(zhí)行,大多數(shù)調(diào)度器在調(diào)度許多指令時(shí)將具有類(lèi)似的目標(biāo)。在傳送前,易于提供調(diào)度指令的高級(jí)算法,例如,使用數(shù)組引用的數(shù)據(jù)相關(guān)信息。對(duì)中間表示執(zhí)行指令調(diào)度假定了目標(biāo)處理器實(shí)現(xiàn)該中間表示的指令,并且這些指令具有一定等待時(shí)間,如一個(gè)周期。一些處理器也許不實(shí)現(xiàn)給定中間表示的所有指令,并且必須在終端擴(kuò)展成幾個(gè)機(jī)器指令。這在一些情況下將產(chǎn)生次佳的代碼。
寄存器分配許多指令集體系結(jié)構(gòu)具有32個(gè)整數(shù)和32個(gè)浮點(diǎn)寄存器。寄存器分配通常根據(jù)可用于不同用戶(hù)的寄存器數(shù)量參數(shù)化。這涉及有關(guān)哪些寄存器用于傳遞參數(shù)和返回值,哪些必須由被叫方在跨函數(shù)調(diào)用時(shí)保留以及哪些必須由主叫方保存并在函數(shù)調(diào)用后恢復(fù)的規(guī)則。
寄存器分配可以下述平臺(tái)無(wú)關(guān)方式部分地執(zhí)行。假定N是可用于任一感興趣平臺(tái)上寄存器分配器的可用寄存器數(shù)量。典型的N值可以為10。寄存器分配有時(shí)分成局部階段和全局階段。局部寄存器分配將寄存器分配給僅在一個(gè)基本塊中使用的變量,而全局寄存器分配將寄存器分配給一個(gè)函數(shù)中使用的變量。全局寄存器分配是耗時(shí)的。傳送前寄存器分配的方法是使用至多N個(gè)寄存器同時(shí)執(zhí)行全局寄存器分配和局部寄存器分配。如果該分配不成功,則只可以使用至多N個(gè)寄存器進(jìn)行全局寄存器分配。在傳送后,可以較快地完成局部寄存器分配。
傳送前寄存器分配無(wú)法分配物理寄存器,這是因?yàn)樗仨殞⒓拇嫫魇褂靡?guī)則納入考慮。但是,可分配N(xiāo)個(gè)虛擬寄存器(這不同于通常在文獻(xiàn)中使用的所謂偽寄存器或符號(hào)寄存器)。然而,在對(duì)N個(gè)寄存器進(jìn)行分配后,利用將虛擬寄存器映射到物理寄存器的矢量來(lái)分配物理寄存器既簡(jiǎn)單又快。在面向?qū)ο笳Z(yǔ)言中,可能10個(gè)寄存器就足夠了。如果傳送前分配未成功(即,一些變量無(wú)法分配給寄存器并溢出到存儲(chǔ)器),則所述方法可在傳送后執(zhí)行不同的操作。例如,它現(xiàn)在可以使用平臺(tái)的所有寄存器重新進(jìn)行分配。另一種替代方案是讓溢出的變量保留在存儲(chǔ)器中。而另一種替代方案是在全局分配已經(jīng)完成時(shí)僅重新進(jìn)行局部分配。
中間語(yǔ)言規(guī)范下面將描述用于根據(jù)本發(fā)明實(shí)施例的可壓縮中間表示的語(yǔ)言。
目標(biāo)文件格式下面描述了一個(gè)目標(biāo)文件的部分,并且還討論了壓縮的時(shí)機(jī)。然而,要注意的是備選目標(biāo)文件格式可使用不同的段-文件標(biāo)題,它描述目標(biāo)文件類(lèi)型、目標(biāo)機(jī)器體系結(jié)構(gòu)、文件端序、文件是否是針對(duì)32位或64位體系結(jié)構(gòu)而生成的以及其它信息。
-段標(biāo)題數(shù)組,含指令段、數(shù)據(jù)段等存儲(chǔ)在文件中何處的信息。諸如段大小等其它信息也存儲(chǔ)在段標(biāo)題中。
-指令段,可以是機(jī)器指令或某一形式的中間表示,如Java字節(jié)碼或三地址碼??纱嬖诙鄠€(gè)指令段。這些段是根據(jù)本發(fā)明的主要壓縮目標(biāo)。
-編譯時(shí)初始化數(shù)據(jù)段,例如用于全局變量的編譯時(shí)初始化數(shù)據(jù)段??纱嬖诙鄠€(gè)數(shù)據(jù)段。
-重定位條目段,所述條目涉及指令或數(shù)據(jù),該段必須在鏈接編輯期間進(jìn)行修改以分析地址。存在不同類(lèi)型的重定位條目,并且通過(guò)例如按類(lèi)型及它們所引用的符號(hào)在編譯時(shí)將它們分類(lèi),可將類(lèi)似的重定位條目組合在一起。這引入了也用于隨后可進(jìn)行壓縮的重定位條目的上下文。
-符號(hào)的可選段(即,符號(hào)表)。對(duì)于靜態(tài)鏈接的商用應(yīng)用程序,一般不存在符號(hào)表(由于在任何方面均不需要它)。對(duì)于一些編程語(yǔ)言,包括Java,它用于解決符號(hào)。符號(hào)具有屬性,如屬于哪種數(shù)據(jù)(例如,為只讀符號(hào)、為全局符號(hào)以及在程序啟動(dòng)時(shí)初始化為零、為全局符號(hào)并在程序啟動(dòng)時(shí)初始化為某個(gè)值)。另一個(gè)屬性是符號(hào)的大小。類(lèi)似的符號(hào)可在編譯時(shí)組合在一起以形成壓縮的上下文。
-如果存在符號(hào)表,則也存在用于符號(hào)名稱(chēng)的單獨(dú)字符串段。此段只是空結(jié)束字符串序列。標(biāo)識(shí)符不存儲(chǔ)在符號(hào)表中,因?yàn)檫@將浪費(fèi)存儲(chǔ)空間并使得無(wú)法允許任意長(zhǎng)的標(biāo)識(shí)符名稱(chēng)。要查找符號(hào)名稱(chēng),符號(hào)表?xiàng)l目具有到此段的引用(偏移)。相關(guān)標(biāo)識(shí)符經(jīng)常具有相關(guān)的名稱(chēng),如共同的前綴或后綴。通過(guò)根據(jù)此方面或其它方面將標(biāo)識(shí)符分類(lèi),引入用于壓縮的上下文。
-可選調(diào)試信息。調(diào)試信息的現(xiàn)代、簡(jiǎn)潔的表達(dá)格式是DWARF2.1,它支持許多語(yǔ)言,包括Ada 95、C99、C++、Fortran 95和Java。
中間表示-指令根據(jù)本發(fā)明的優(yōu)選實(shí)施例,中間表示包括將稱(chēng)為指令的三地址碼。根據(jù)此實(shí)施例,指令是帶有一個(gè)操作碼和不定數(shù)量操作數(shù)的元組。因此,指令具有可變長(zhǎng)度并且不必正好在字節(jié)邊界上對(duì)齊。這使得解釋指令更加復(fù)雜,但節(jié)省了空間。
所有符號(hào)無(wú)需顯式地存儲(chǔ)在符號(hào)表中。例如,如果存在語(yǔ)句IADDI 1,2,3,它指“將變量2和常量3相加并將結(jié)果存儲(chǔ)到變量1中”。前綴I表示類(lèi)型(整數(shù)-與浮點(diǎn)數(shù)相對(duì)),并且后綴I指第二源操作數(shù)是立即常量。變量1和2不必存儲(chǔ)在符號(hào)表中。它們?cè)跅I系奈恢?與棧指針的偏移)將在解壓縮后決定。
表1列出了根據(jù)本發(fā)明實(shí)施例的中間表示的一組操作數(shù)。

表1注意,完整的操作碼列表可包括其它操作碼,例如,額外的轉(zhuǎn)換。在上面的表1中,只有IADDI采用了常量操作數(shù),但完整的操作數(shù)列表還可包括采用常量操作數(shù)的其它指令。此外,可能需要與特殊源語(yǔ)言(例如,Java)相關(guān)的特殊操作碼,以及與特殊硬件指令集體系結(jié)構(gòu)相關(guān)的特殊操作碼,例如在目標(biāo)處理器支持矢量指令時(shí)包括矢量指令。
圖3顯示了根據(jù)本發(fā)明實(shí)施列的編碼器方框圖。編碼器包括編譯器(Comp)模塊301、用于壓縮編譯數(shù)據(jù)的編碼(ENC)模塊307、狀態(tài)機(jī)(SM)模塊304及實(shí)現(xiàn)統(tǒng)計(jì)模型(Stat Mod)的統(tǒng)計(jì)模塊306。
編譯器模塊301接收輸入代碼IC,即要壓縮的程序代碼的初始形式,如JAVA字節(jié)碼。編譯器301將數(shù)據(jù)編譯為中間表示,即所說(shuō)的CIR-可壓縮的中間表示。CIR包括變換代碼302和額外的編譯器信息303,該信息由壓縮級(jí)307用于取得更高的壓縮率。變換代碼302和編譯器信息饋入狀態(tài)機(jī)模塊304以及編碼模塊307。狀態(tài)機(jī)包括多個(gè)狀態(tài)變量,這些變量根據(jù)從編譯器301接收的變換代碼302和編譯器信息303進(jìn)行更新。狀態(tài)機(jī)模塊將有關(guān)狀態(tài)機(jī)當(dāng)前狀態(tài)的狀態(tài)信息305輸出到統(tǒng)計(jì)模塊306。通過(guò)統(tǒng)計(jì)模塊實(shí)現(xiàn)的統(tǒng)計(jì)模型可視為按狀態(tài)機(jī)304的狀態(tài)信息305索引的概率密度函數(shù)表。概率密度函數(shù)PDF傳遞給編碼模塊307。編碼模塊307按順序壓縮變換代碼302和編譯器信息303,以產(chǎn)生包括編碼的中間表示E-IR的輸出數(shù)據(jù)字符串。輸出數(shù)據(jù)字符串的長(zhǎng)度等于由統(tǒng)計(jì)模型306分配給變換代碼302和編譯器信息303的概率的負(fù)對(duì)數(shù)。例如,這可以采用已知的算術(shù)編碼器實(shí)現(xiàn)(參見(jiàn)例如“用于長(zhǎng)源序列的有效編碼系統(tǒng)”[Jones,“An Efficient Coding System for Long Source Sequence”,IEEE-IT,vol.27,1981])。
變換代碼302和編譯器信息303最好是由編譯器301生成為一個(gè)符號(hào)字符串。在一個(gè)實(shí)施例中,編譯數(shù)據(jù)量化成分別表示指令和操作數(shù)的符號(hào)。編譯器信息以特殊指令的形式并入編譯數(shù)據(jù)流(例如,ENTER<context>和EXIT<context>)。
在一個(gè)實(shí)施例中,統(tǒng)計(jì)模型306是固定的,狀態(tài)機(jī)的每個(gè)狀態(tài)對(duì)應(yīng)一個(gè)符號(hào)分布。因此,對(duì)于編譯器輸出的每個(gè)符號(hào),對(duì)應(yīng)的狀態(tài)信息305由狀態(tài)機(jī)304饋送到統(tǒng)計(jì)模型306。對(duì)于該模型的每個(gè)狀態(tài),可通過(guò)分析“典型”數(shù)據(jù)訓(xùn)練集確定概率密度函數(shù)集并加以存儲(chǔ)。
在一個(gè)替代實(shí)施例中,統(tǒng)計(jì)模型是自適應(yīng)的,并包括對(duì)應(yīng)該模型的每個(gè)狀態(tài)的一組頻率計(jì)數(shù)器。頻率計(jì)數(shù)器在每個(gè)符號(hào)在給定狀態(tài)中進(jìn)行編碼后予以更新。在自適應(yīng)系統(tǒng)中,對(duì)于每個(gè)狀態(tài),饋入編碼模塊307和解碼(DEC)模塊401的概率密度函數(shù)是在壓縮期間從觀察的數(shù)據(jù)估計(jì)得到的。這樣做的優(yōu)點(diǎn)在于由于系統(tǒng)可適應(yīng)統(tǒng)計(jì)特性不符合訓(xùn)練集的變化更廣的數(shù)據(jù),從而提供了更通用的壓縮。固定分布的優(yōu)點(diǎn)在于它提供了比估計(jì)分布更短的壓縮數(shù)據(jù)串。編碼效率的差異為每個(gè)估計(jì)參數(shù)約0.5log2N個(gè)比特,其中,N是編碼符號(hào)的數(shù)量。具體而言,在數(shù)據(jù)流的早期部分,固定模型的性能一般比自適應(yīng)壓縮好。
如上所述,狀態(tài)機(jī)304的狀態(tài)的特征在于多個(gè)狀態(tài)變量。狀態(tài)機(jī)304可包括多個(gè)模型,這些模型組合在一起以產(chǎn)生統(tǒng)計(jì)模型的狀態(tài)變量。狀態(tài)機(jī)可包括語(yǔ)法模型,其中,狀態(tài)是編譯數(shù)據(jù)流中在先符號(hào)的函數(shù)。狀態(tài)機(jī)還可包括編譯數(shù)據(jù)的執(zhí)行模型,其中,狀態(tài)變量可以是例如虛擬機(jī)的棧內(nèi)容,或者是存儲(chǔ)器存取模式的函數(shù)。狀態(tài)機(jī)還可包括取決于編譯器信息的模型,并可包括諸如類(lèi)信息、數(shù)據(jù)類(lèi)型、變量的寄存器分配等不容易從編譯數(shù)據(jù)流中獲取的元素。
此外,自適應(yīng)的概念也可擴(kuò)展到狀態(tài)機(jī),即狀態(tài)機(jī)模塊可包含幾個(gè)可選狀態(tài)機(jī)(它們一般以某種方式嵌套在一起,因此更復(fù)雜的狀態(tài)機(jī)是更簡(jiǎn)單狀態(tài)機(jī)的精細(xì)化)。隨后,調(diào)整狀態(tài)機(jī)以適應(yīng)編碼數(shù)據(jù)。在一個(gè)實(shí)施例中,系統(tǒng)從包括幾個(gè)狀態(tài)的簡(jiǎn)單狀態(tài)機(jī)開(kāi)始,并逐漸將經(jīng)常使用的狀態(tài)精細(xì)化。只有估計(jì)了概率密度函數(shù)時(shí),使用自適應(yīng)狀態(tài)機(jī)才有意義,因?yàn)闉闋顟B(tài)機(jī)添加狀態(tài)的準(zhǔn)則應(yīng)該是它可以提供概率密度函數(shù)的更好的估計(jì)。
下面的表2列出了根據(jù)本發(fā)明實(shí)施例的一組狀態(tài)變量。
表2前一指令模型的這一部分用于捕捉相鄰指令之間的相關(guān)性。
前一指令制約后一指令的分布。
#指定的標(biāo)號(hào)此狀態(tài)變量用于制約標(biāo)號(hào)的分布。
棧變量有幾個(gè)棧狀態(tài)變量,它們包括變量、常量等。它們用于Move-to-front編碼(參見(jiàn)例如“借助書(shū)棧的數(shù)據(jù)壓縮”[B Ryabko,“Data Compression by Means of a Book Stack”,Problems ofInformation Transmission,vol.16,no.4,pp.16-21,Oct-Dec 1980]),即不是將變量、常量等編碼,而是將其在棧中的位置編碼。在編碼后,該項(xiàng)移到棧頂。如果同一棧上有不止一個(gè)源操作數(shù)(大多數(shù)算術(shù)運(yùn)算是這種情況),則在二者都已編碼后才更新棧。每個(gè)棧都有相關(guān)聯(lián)的用于代碼字的分布。選擇此分布,使概率隨棧中位置而減小。因此,此模型可捕捉引用的位置當(dāng)經(jīng)常使用某個(gè)變量時(shí),該變量停留在棧頂,并為其分配短代碼字。當(dāng)幾個(gè)棧具有同一類(lèi)型的內(nèi)容時(shí),每個(gè)變量一次只在一個(gè)棧上,例如,在整數(shù)變量棧或浮點(diǎn)變量棧上。變量棧初始化為零在頂部的有序列表。常量棧初始化為按出現(xiàn)順序包含使用的常量值。值列表被作為編碼數(shù)據(jù)的前置數(shù)據(jù)包括。
上下文類(lèi)型此狀態(tài)變量由編譯器提供,它描述指令的上下文,如算術(shù)上下文、函數(shù)調(diào)用上下文等。上下文類(lèi)型是固定的編號(hào)列表。
如上所述,編譯器301輸出的數(shù)據(jù)流由狀態(tài)機(jī)模塊304和編碼器307解析成不同類(lèi)型的符號(hào)。用于將給定符號(hào)編碼的分布(PDF)不需要依賴(lài)于所有狀態(tài)變量。要編碼的操作數(shù)的類(lèi)型由對(duì)應(yīng)指令格式唯一確定。這是確定性的,不需要將額外的信息編碼。表3描述了根據(jù)本發(fā)明實(shí)施例的符號(hào)類(lèi)型和條件結(jié)構(gòu)。
表3
因此,我們公開(kāi)了根據(jù)本發(fā)明的用于中間表示壓縮的狀態(tài)機(jī)模型示例。該模型包含了馬爾可夫(Markov)鏈組件(對(duì)前一符號(hào)類(lèi)型的依賴(lài)性)、棧組件(用于變量編碼)及語(yǔ)法組件(根據(jù)指令確定操作數(shù)類(lèi)型和編號(hào))。它也利用編譯器的附加信息(上下文)。
注意,編譯器模塊301也可執(zhí)行代碼變換以提高可壓縮性。
圖4顯示了根據(jù)本發(fā)明實(shí)施例的解碼器方框圖。解碼器包括解碼模塊401、編譯器模塊407、狀態(tài)機(jī)模塊404及實(shí)現(xiàn)統(tǒng)計(jì)模型的統(tǒng)計(jì)模塊406。
解碼模塊401接收包括編碼中間表示E-IR的輸入流,例如,由結(jié)合圖3所述編碼器生成的輸入流。解碼器提取變換代碼402和編譯器信息403,并將其作為符號(hào)序列饋入與編碼器的狀態(tài)機(jī)對(duì)應(yīng)的狀態(tài)機(jī)模塊404。因此,如結(jié)合圖3所述,狀態(tài)機(jī)404更新?tīng)顟B(tài)變量,并將對(duì)應(yīng)的狀態(tài)信息傳遞給統(tǒng)計(jì)模塊406,而統(tǒng)計(jì)模塊406又生成概率分布PDF。用于解碼的概率分布406與模型306生成的用于符號(hào)編碼的概率分布完全相同。解碼模塊401接收該概率分布以便在對(duì)輸入流的后續(xù)符號(hào)解碼中使用。因此,狀態(tài)信息405應(yīng)完全由變換代碼402和編譯器信息403確定,以允許解碼模塊401進(jìn)行重建。從解碼模塊401輸出的變換代碼402和編譯器信息403對(duì)應(yīng)于輸入圖3所示編碼器307的那些數(shù)據(jù)。注意,變換代碼402的格式可能不一定是通常在編譯期間用于存儲(chǔ)的格式。變換代碼402和編譯器信息還饋入編譯器407,此編譯器對(duì)變換代碼進(jìn)行編譯,并執(zhí)行傳送后優(yōu)化步驟,從而為相關(guān)目標(biāo)設(shè)備產(chǎn)生可執(zhí)行代碼。
用于傳送后優(yōu)化的編譯器信息包括在編碼中間表示中供解碼器使用的編譯器信息可包括不同類(lèi)型的編譯器信息,可生成這些信息以便在解壓縮后在優(yōu)化期間使用。有效代碼(執(zhí)行時(shí)間和/或空間)與短的編譯時(shí)間都是解壓縮后優(yōu)化期間所需要的。一些生成的編譯器信息可用于實(shí)現(xiàn)這兩個(gè)目標(biāo)。解壓縮后要執(zhí)行的兩個(gè)優(yōu)選優(yōu)化步驟是指令調(diào)度和寄存器分配,上面已描述過(guò)它們。下面描述要從編碼器傳送給解碼器的優(yōu)選類(lèi)型的編譯器信息每個(gè)流程圖的可簡(jiǎn)化性(reducibility)視所選擇的用于指令調(diào)度的算法而定,也許可以或者也許不可以對(duì)控制流程圖進(jìn)行分析以構(gòu)建其支配樹(shù)。控制流程圖可以是可簡(jiǎn)化或不可簡(jiǎn)化的??梢愿?jiǎn)單的方式對(duì)可簡(jiǎn)化的流程圖進(jìn)行分析。然而,如果傳送后優(yōu)化器不知道流程圖是否可簡(jiǎn)化,它必須假定它不可簡(jiǎn)化,并應(yīng)用算法構(gòu)建更一般(且更慢)的支配樹(shù)。通過(guò)在傳送前優(yōu)化期間對(duì)每個(gè)流程圖進(jìn)行可簡(jiǎn)化性測(cè)試并存儲(chǔ)此測(cè)試的輸出結(jié)果,便可在解壓縮后應(yīng)用最快的算法。
別名信息在指令調(diào)度期間,常常發(fā)現(xiàn)希望將在“store”指令之后某位置上的“l(fā)oad”指令移到“store”指令前的某個(gè)位置上。然而,這種移動(dòng)只可以在確定兩條指令涉及不同的存儲(chǔ)單元時(shí)才能執(zhí)行。在至少一個(gè)地址保持在指針中時(shí),這變得難以確定,因此要么跳過(guò)移動(dòng),要么必須(在指令調(diào)度前)執(zhí)行耗時(shí)的別名分析。別名分析收集有關(guān)哪些指針可指向程序中不同位置上的哪些變量的信息。別名信息一般在傳送前優(yōu)化期間收集,并且如果它存儲(chǔ)在傳送文件中,則在解壓縮后可實(shí)現(xiàn)更積極的指令調(diào)度。
數(shù)據(jù)相關(guān)性信息指令調(diào)度的一種高級(jí)形式是軟件流水化,軟件流水化創(chuàng)建包括來(lái)自多個(gè)循環(huán)迭代的指令的新循環(huán)體。執(zhí)行此操作可大大減少流水線暫停。要實(shí)現(xiàn)軟件流水化,需要稱(chēng)為數(shù)據(jù)相關(guān)圖的數(shù)據(jù)結(jié)構(gòu)。此圖的構(gòu)建很耗時(shí),因?yàn)樗枰治鲅h(huán)中的每對(duì)數(shù)組引用以便找出它們是否會(huì)涉及同一存儲(chǔ)單元,并且如果會(huì),則確定這兩個(gè)引用之間的迭代次數(shù)。數(shù)據(jù)相關(guān)圖可存儲(chǔ)在傳送文件中,從而減少了對(duì)傳送后分析的需要。
優(yōu)化優(yōu)先級(jí)信息并非所有方法需要大量?jī)?yōu)化。例如,可能很少調(diào)用差錯(cuò)處理器,而應(yīng)集中在重要方法的內(nèi)循環(huán)。傳送前優(yōu)化可使用靜態(tài)預(yù)測(cè)(例如根據(jù)導(dǎo)致應(yīng)用程序終止的代碼路徑)以將此類(lèi)方法標(biāo)記為對(duì)性能而言不太重要。
注意,圖3和圖4中的方框圖是示意圖。在根據(jù)本發(fā)明的編碼器或解碼器實(shí)施方案中,所示方框可以不同的方式分割和/或組合。例如,狀態(tài)機(jī)方框404包括數(shù)據(jù)模型的語(yǔ)法結(jié)構(gòu),并且基本上與編譯器407的至少第一遍的狀態(tài)一致。在圖4中,由于對(duì)統(tǒng)計(jì)模型而言無(wú)關(guān)的一些信息可由編譯器使用,且反之亦然,因此,它們分別顯示為單獨(dú)的方框404和407。在優(yōu)選實(shí)施例中,解碼器的狀態(tài)機(jī)404將是編譯器407的一部分,并且應(yīng)與編譯器407一起進(jìn)行設(shè)計(jì)。
還要注意,在替代實(shí)施例中,統(tǒng)計(jì)模型不為編碼器提供PDF,而是對(duì)CIR執(zhí)行非壓縮變換,以將其變換成可由標(biāo)準(zhǔn)壓縮工具壓縮的形式。在此實(shí)施例中,解碼側(cè)同樣使用標(biāo)準(zhǔn)工具將輸入解壓縮,然后對(duì)符號(hào)流進(jìn)行反向變換。此實(shí)施例的優(yōu)點(diǎn)在于它利用了預(yù)計(jì)在目標(biāo)系統(tǒng)上可用的標(biāo)準(zhǔn)工具。
圖5顯示了Java字節(jié)碼的一個(gè)示例段的流程圖。以下代碼段是Java方法的說(shuō)明性示例<pre listing-type="program-listing"><![CDATA[public class exl{public int h(int a,int b,int c){ int x,y; x=0; y=a+b*c; while(x<y) x=x+a*b*c; return x; }}]]></pre>上述代碼段中,可以通過(guò)將a*b*c移出循環(huán)而消除部分冗余。
轉(zhuǎn)換成Java字節(jié)碼后,以上示例如下0 iconst_01 istore 43 iload_14 iload_25 iload_36 imul7 iadd8 istore 510 goto 2313 iload 415 iload_116 iload_217 imul18 iload_319 imul20 iadd21 istore 423 iload 425 iload 527 icmplt 1330 iload 432 ireturn圖5顯示了上述示例的流程。從符號(hào)0開(kāi)始(501),流程繼續(xù)到符號(hào)10,該符號(hào)是到符號(hào)23的goto語(yǔ)句(503),流程從符號(hào)23繼續(xù)到符號(hào)27。如果滿(mǎn)足循環(huán)的終止條件,則流程繼續(xù)到符號(hào)30(504),否則流程從符號(hào)13(501)繼續(xù),直至它再次到達(dá)符號(hào)27。
下面的代碼段是上述代碼段到上述可壓縮中間表示(CIR)的變換。
0 begin ;標(biāo)記新方法的開(kāi)始
1 iconst 0,4 ;將常量0移到變量42 imul 2,3,6 ;將變量2和變量3相乘,并將結(jié)果放到變量6中3 iadd 1,6,5 ;將變量1和變量6相加,并將結(jié)果放到變量5中4 ba 23 ;轉(zhuǎn)到標(biāo)號(hào)235 label13 ;聲明標(biāo)號(hào)136 imul 1,2,7 ;將變量1和變量2相乘,并將結(jié)果放到變量7中7 imul 7,3,8 ;將變量7和變量3相乘,并將結(jié)果放到變量8中8 iadd 4,8,4 ;將變量4和變量8相加,并將結(jié)果放到變量4中9 label23 ;聲明標(biāo)號(hào)2310 icmp4,5 ;比較變量4和變量511 blt 13 ;如果變量4小于變量5,則轉(zhuǎn)移到標(biāo)號(hào)1312 ireturn 4;將變量4作為結(jié)果返回13 end ;標(biāo)記方法的結(jié)束注意,每行開(kāi)始處,即每個(gè)助記符左側(cè)的數(shù)字是指令編號(hào)而非地址。此外,上述代碼段中的注釋用“;”隔開(kāi),每行中包括注釋是為了提高可讀性。
在優(yōu)化后,上述CIR段如下所示0 begin1 iconst 0,42 imul 2,3,63 iadd 1,6,5
4 imul1,6,75 ba 16 label 0;以前標(biāo)記為137 iadd4,7,48 label 1;以前標(biāo)記為239 icmp4,510 blt 011 ireturn 412 end因此,乘法被從循環(huán)中移出。最后,在插入其它編譯器信息(包括由編碼器使用的信息)后,上述示例中由圖3的編譯器301生成的符號(hào)序列如下所示0 beginenterarithmetic_context(算術(shù)上下文)1 iconst 0,42 imul 2,3,63 iadd 1,6,54 imul 1,6,7exit arithmetic_context(算術(shù)上下文)5 ba 16 label07 iadd 4,7,48 label1entercondition_context(條件上下文)9 icmp 4,510 blt 0exit condition_context(條件上下文)11 ireturn 412 end
在編碼模塊307將上述CIR代碼編碼前,創(chuàng)建了所用常量值的列表。棧已初始化,并且狀態(tài)機(jī)304的上下文類(lèi)型和最近的指令狀態(tài)變量已初始化為默認(rèn)值。
設(shè)想這樣一個(gè)實(shí)施例,其中狀態(tài)機(jī)和概率密度函數(shù)是靜態(tài)的,并且事先已為編碼器(和解碼器)所知,則模型狀態(tài)可由狀態(tài)變量提供,所述狀態(tài)變量由下列元素最近的指令、上下文類(lèi)型、整數(shù)常量棧和整數(shù)變量棧組成。這是以上表2所列狀態(tài)變量空間的子集,其中,該子集局限于在此示例中使用的那些值。
因此,對(duì)于編碼器307和狀態(tài)機(jī)模塊304從編譯器301接收的每個(gè)符號(hào),執(zhí)行下列步驟1)使用算術(shù)編碼器和狀態(tài)變量提供的PDF將CIR符號(hào)編碼。
2)更新?tīng)顟B(tài)變量。更新?tīng)顟B(tài)變量的“最近的指令”或“上下文類(lèi)型”元素時(shí),將變量設(shè)為等于編碼CIR符號(hào)的值。
在更新棧狀態(tài)變量時(shí),將CIR符號(hào)移到棧頂。
3)對(duì)下一符號(hào)重復(fù)步驟1)和2),直至到達(dá)符號(hào)流末端。
表4包括根據(jù)上述過(guò)程的編碼符號(hào)的列表。表4還包括對(duì)應(yīng)的符號(hào)類(lèi)型和狀態(tài)機(jī)304的對(duì)應(yīng)狀態(tài)變量,這些狀態(tài)變量由狀態(tài)機(jī)模塊304在從編譯模塊301收到該符號(hào)時(shí)進(jìn)行更新
表4圖6顯示了Java字節(jié)碼的另一示例段流程圖。以下代碼段是說(shuō)明另一優(yōu)化示例的另一Java方法的示例<pre listing-type="program-listing"><![CDATA[public class ex2{ public int h(int a[]) {int x;int i;x=0;for(i=0;i<100;i++)x=x+a[i];return x; }}]]></pre>上述示例中,每次迭代時(shí)進(jìn)行數(shù)組界的檢查。轉(zhuǎn)換成Java字節(jié)碼后,以上示例如下所示0 iconst_01 istore_22 iconst_03 istore_34 goto 16
7 iload_28 aload_19 iload_310 iaload11 iadd12 istore_213 iinc 3 116 iload_317 bipush 10019 icmplt 722 iload_223 ireturn圖6顯示了上述Java字節(jié)碼段的流程圖。從符號(hào)0開(kāi)始(601),流程繼續(xù)到符號(hào)4,該符號(hào)是到符號(hào)16的goto語(yǔ)句(603),流程從符號(hào)16繼續(xù)到符號(hào)19。如果滿(mǎn)足循環(huán)的終止條件,則流程繼續(xù)到符號(hào)22(604),否則流程從符號(hào)7(602)繼續(xù),直至它再次到達(dá)符號(hào)19。注意,除了節(jié)點(diǎn)名稱(chēng)外,圖6所示的流程圖與圖5所示的流程圖是完全相同的。
在將以上Java字節(jié)碼段轉(zhuǎn)換成未優(yōu)化的CIR后,代碼段如下所示0 begin ;標(biāo)記新方法的開(kāi)始1 iconst 0,2 ;將x初始化為02 iconst 0,3 ;將i初始化為03 ba 16 ;轉(zhuǎn)到標(biāo)號(hào)164 label 7 ;聲明標(biāo)號(hào)75 bcheck 1,3 ;用變量3對(duì)數(shù)組1進(jìn)行邊界檢查6 imuli 3,4,4;將變量3和變量4相乘,將結(jié)果放到變量4中7 ldsw 1,4,5;從數(shù)組裝入字,將數(shù)據(jù)放到變量5中
8 iadd2,5,2 ;用數(shù)組元素使x遞增9 iaddi 3,1,3 ;使i遞增10 label 16 ;聲明標(biāo)號(hào)1611 icmpi 3,100 ;比較變量3和常量10012 blt 7;如果為真,則轉(zhuǎn)到標(biāo)號(hào)713 ireturn 2;將變量2作為結(jié)果返回14 end ;標(biāo)記方法的結(jié)束同樣地,每個(gè)助記符左側(cè)的數(shù)字是指令編號(hào)而非地址,并且上述代碼段中每行包括用“;”分開(kāi)的注釋?zhuān)蕴岣呖勺x性。
在下述內(nèi)容中,假定帶有N個(gè)元素的數(shù)組如下所示存儲(chǔ)在連續(xù)存儲(chǔ)單元中首先是包含用于邊界檢查的數(shù)組大小N的一個(gè)字,接著是數(shù)組的數(shù)據(jù)。此外,假定數(shù)組變量(上述CIR代碼段中的變量1)指向數(shù)組的數(shù)據(jù)。隨后,為便于進(jìn)行邊界檢查,應(yīng)使用概念上在索引-1上的字(假定是大小按字計(jì)(word sized)的元素;其中,由于元素具有雙字對(duì)齊要求,可進(jìn)行瑣碎的調(diào)整以確保正確對(duì)齊)。
優(yōu)化后,以上CIR段如下所示0 begin ;標(biāo)記新方法的開(kāi)始1 iconst 0,3;初始化x2 bchecki1,100 ;進(jìn)入循環(huán)湔進(jìn)行一次邊界檢查3 imov 1,5;將數(shù)組數(shù)據(jù)指針拷貝到變量5中4 iaddi 5,400,6 ;將元素101的地址放到變量6中5 label 0 ;聲明標(biāo)號(hào)06 ldsw 5,0,7 ;將數(shù)組元素裝入變量7中7 iadd 2,7,2 ;使x遞增8 iaddi 5,4,5 ;按數(shù)組元素的大小使指針遞增9 icmp 5,6;比較變量5和變量610 blt0 ;如果為真,則轉(zhuǎn)到標(biāo)號(hào)0
11 ireturn2 ;將變量2作為結(jié)果返回12 end ;方法結(jié)束因此,已重寫(xiě)數(shù)組訪問(wèn)部分,以便使用遍歷數(shù)組的指針。刪除了最初到標(biāo)號(hào)16的轉(zhuǎn)移,這也使得有可能刪除該標(biāo)號(hào)。
最后,在插入其它編譯器信息(包括由編碼器使用的信息)后,上述示例中由圖3的編譯器301生成的符號(hào)序列如下所示0 begin ;標(biāo)記新方法的開(kāi)始1 iconst 0,3 ;初始化x2 enter array_context3 bchecki1,100 ;進(jìn)入循環(huán)湔進(jìn)行一次邊界檢查4 imov 1,5 ;將數(shù)組數(shù)據(jù)指針拷貝到變量5中5 iaddi 5,400,6 ;將元素101的地址放到變量6中6 exit array_context7 enter for_loop_context,5,6,4;循環(huán)變量=5;終止值=6,步長(zhǎng)=4;忽略循環(huán)標(biāo)號(hào)的聲明8 ldsw 5,0,7;將數(shù)組元素裝入變量7中9 iadd 2,7,2;使x遞增;忽略遞增的指針(循環(huán)變量);忽略循環(huán)結(jié)束測(cè)試10 exit for_loop_cotnext11 ireturn2 ;將變量2作為結(jié)果返回12 end ;方法結(jié)束因此,在上述示例中,for_loop_context使得可以刪除循環(huán)體中一半以上的指令。
實(shí)際上,許多循環(huán)采用此示例中給出的形式。因此,更簡(jiǎn)潔的表示是使用循環(huán)變量、循環(huán)變量的終止值和步長(zhǎng)來(lái)聲明“循環(huán)(loop)”指令。循環(huán)指令作為上下文提示編碼。使用循環(huán)指令的益處在于可以忽略循環(huán)體的某些部分,即使循環(huán)變量遞增并測(cè)試循環(huán)結(jié)束。
注意,在上述示例中,未顯示指令調(diào)度或寄存器分配。所述代碼示例顯示了壓縮前執(zhí)行的傳送前優(yōu)化。
還要注意,在中間表示的上述實(shí)施例中存在很小的平臺(tái)相關(guān)性。該實(shí)施例采用了類(lèi)似于大多數(shù)微處理器的指令集體系結(jié)構(gòu)。然而,對(duì)于表示的任一實(shí)施例,應(yīng)決定如何處理?xiàng)l件轉(zhuǎn)移。處理器將比較的輸出結(jié)果存儲(chǔ)在條件碼寄存器中或通用寄存器中。以上假定使用條件碼寄存器。要在傳送后為不用條件碼的機(jī)器生成代碼,可使用不同的替代方案。例如,如果寄存器分配在傳送后優(yōu)化期間完成,則臨時(shí)變量可用于保持比較的輸出結(jié)果。隨后如其它變量一樣為這些變量分配寄存器。另一方面,如果寄存器分配在傳送前已經(jīng)完成,則可轉(zhuǎn)為使用專(zhuān)用的通用寄存器。
圖7顯示了根據(jù)本發(fā)明實(shí)施例,用于生成可執(zhí)行程序代碼的數(shù)據(jù)處理系統(tǒng)的方框圖。數(shù)據(jù)處理系統(tǒng)701包括處理單元(CPU)704、通信單元705、RAM 711和數(shù)據(jù)存儲(chǔ)裝置706,例如硬盤(pán)、EPROM、EEPROM等。根據(jù)此實(shí)施例,數(shù)據(jù)處理系統(tǒng)701經(jīng)通信單元705和數(shù)據(jù)鏈路703從另一數(shù)據(jù)處理系統(tǒng)(未顯示),例如從軟件供應(yīng)商的服務(wù)器接收輸入代碼。例如,輸入代碼可從網(wǎng)站下載。接收的輸入代碼裝入RAM 711中。此外,由編碼進(jìn)程使用的編碼程序和狀態(tài)機(jī)模型分別從數(shù)據(jù)存儲(chǔ)裝置706的對(duì)應(yīng)區(qū)域710和709裝入RAM中,由CPU執(zhí)行。編碼程序?qū)嵤└鶕?jù)本發(fā)明的編碼進(jìn)程,從而產(chǎn)生優(yōu)化的壓縮中間表示E-IR,此表示E-IR被存儲(chǔ)在數(shù)據(jù)存儲(chǔ)裝置706的對(duì)應(yīng)區(qū)域708中。當(dāng)在E-IR中編碼的程序代碼要在以后的某個(gè)時(shí)刻執(zhí)行時(shí),從存儲(chǔ)區(qū)域710和709分別將解碼程序和狀態(tài)機(jī)模型裝入RAM中。解碼程序由CPU執(zhí)行,使CPU從數(shù)據(jù)存儲(chǔ)裝置706的對(duì)應(yīng)區(qū)域708將E-IR裝入RAM中,以便將編碼的表示解碼,并生成隨后由CPU執(zhí)行的可執(zhí)行代碼。
因此,根據(jù)此實(shí)施例,編碼級(jí)和解碼級(jí)在目標(biāo)設(shè)備如移動(dòng)電話上執(zhí)行,即,上述的傳送前優(yōu)化和傳送后優(yōu)化均在目標(biāo)設(shè)備上執(zhí)行。在此實(shí)施例中,目標(biāo)設(shè)備仍然利用了中間表示的高壓縮率,從而減少了所需的存儲(chǔ)容量。此外,目標(biāo)設(shè)備利用脫機(jī)優(yōu)化分析取得的良好優(yōu)化即在編碼級(jí)期間執(zhí)行的所說(shuō)的傳送前優(yōu)化,提供了高效的代碼執(zhí)行,而在可作為及時(shí)操作實(shí)現(xiàn)的解碼級(jí)期間并不造成很大開(kāi)銷(xiāo)。
權(quán)利要求
1.一種為數(shù)據(jù)處理系統(tǒng)生成可執(zhí)行程序代碼的方法,所述方法包括用于生成輸入代碼(IC)的壓縮中間表示(E-IR)的編碼級(jí),所述編碼級(jí)包括-對(duì)所述輸入碼進(jìn)行變換(301),包括執(zhí)行一組選定的代碼優(yōu)化步驟,從而產(chǎn)生變換代碼(302)和有關(guān)所述變換代碼的編譯器信息(303);-從所述變換代碼和所述編譯器信息提取(304,306)統(tǒng)計(jì)模型的狀態(tài)信息(305)和統(tǒng)計(jì)信息(PDF);以及-使用所述提取的狀態(tài)信息和統(tǒng)計(jì)信息,將所述變換代碼和所述編碼器信息編碼(307),并產(chǎn)生所述壓縮中間表示;用于從所述壓縮中間表示生成所述可執(zhí)行程序代碼的解碼級(jí);所述解碼級(jí)包括-將所述壓縮中間表示解碼(401),從而產(chǎn)生所述變換代碼(402)和所述編譯器信息(403);以及-使用所述解碼的編譯器信息進(jìn)一步編譯(407)所述變換代碼,并產(chǎn)生所述可執(zhí)行程序代碼(EXE)。
2.如權(quán)利要求1所述的方法,其特征在于在第一數(shù)據(jù)處理系統(tǒng)(101)上執(zhí)行所述編碼級(jí),并在第二數(shù)據(jù)處理系統(tǒng)(102)上執(zhí)行所述解碼級(jí);所述方法還包括將所述壓縮中間表示從所述第一數(shù)據(jù)處理系統(tǒng)傳送到所述第二數(shù)據(jù)處理系統(tǒng)。
3.如權(quán)利要求1或2所述的方法,其特征在于生成所述狀態(tài)信息和統(tǒng)計(jì)信息的步驟還包括-根據(jù)所述變換代碼和所述編譯器信息從狀態(tài)機(jī)(304)獲取狀態(tài)信息(305);以及-根據(jù)所述獲取的狀態(tài)信息,從統(tǒng)計(jì)模型(306)獲取概率信息(PDF)。
4.如權(quán)利要求3所述的方法,其特征在于所述狀態(tài)機(jī)包括至少所述變換代碼和所述編譯器信息之一的語(yǔ)法模型。
5.如權(quán)利要求3或4所述的方法,其特征在于所述狀態(tài)機(jī)包括所述變換代碼的執(zhí)行模型。
6.如權(quán)利要求3到5中任意一項(xiàng)所述的方法,其特征在于所述狀態(tài)機(jī)包括所述編譯器信息的模型。
7.如權(quán)利要求1到6中任意一項(xiàng)所述的方法,其特征在于所述方法還包括-存儲(chǔ)所述壓縮中間表示;以及-結(jié)合所述生成的可執(zhí)行程序代碼的后續(xù)執(zhí)行來(lái)執(zhí)行所述解碼級(jí)。
8.如權(quán)利要求1到7中任意一項(xiàng)所述的方法,其特征在于進(jìn)一步編譯所述變換代碼的所述步驟還包括進(jìn)一步優(yōu)化所述產(chǎn)生的可執(zhí)行代碼。
9.如權(quán)利要求1到8中任意一項(xiàng)所述的方法,其特征在于所述輸入代碼包括Java字節(jié)碼。
10.如權(quán)利要求1到9中任意一項(xiàng)所述的方法,其特征在于所述數(shù)據(jù)處理系統(tǒng)是移動(dòng)終端。
11.如權(quán)利要求1到10中任意一項(xiàng)所述的方法,其特征在于所述變換代碼包括多個(gè)代碼元素,并且所述方法還包括確定所述代碼元素的概率分布,并將所述確定的概率分布提供給生成統(tǒng)計(jì)信息的所述步驟。
12.一種為數(shù)據(jù)處理系統(tǒng)生成程序代碼的方法,所述方法包括-對(duì)所述輸入碼進(jìn)行變換(301),包括執(zhí)行一組選定的代碼優(yōu)化步驟,從而產(chǎn)生變換代碼(302)和有關(guān)所述變換代碼的編譯器信息(303);-從所述變換代碼和所述編譯器信息提取(304,306)統(tǒng)計(jì)模型的狀態(tài)信息(305)和統(tǒng)計(jì)信息(PDF);以及-使用所述提取的狀態(tài)信息和統(tǒng)計(jì)信息,將所述變換代碼和所述編碼器信息編碼(307),并產(chǎn)生所述輸入代碼的壓縮中間表示(E-IR);所述壓縮中間表示適于在后續(xù)的解碼級(jí)中進(jìn)行解碼并進(jìn)一步編譯以生成可執(zhí)行程序代碼。
13.一種計(jì)算機(jī)程序,它包括程序代碼組件,所述程序代碼組件用于在所述程序在計(jì)算機(jī)上運(yùn)行時(shí)執(zhí)行如權(quán)利要求12所述的所有步驟。
14.一種在數(shù)據(jù)處理系統(tǒng)中生成可執(zhí)行程序代碼的方法,所述方法包括-接收輸入代碼的壓縮中間表示(E-IR),所述壓縮中間表示包括由編譯器生成且至少部分優(yōu)化的編碼變換代碼和表示由所述編譯器生成的有關(guān)所述變換代碼的其它信息的編碼編譯器信息;所述編碼變換代碼和所述編碼編譯器信息利用從所述變換代碼和所述編譯器信息中提取的統(tǒng)計(jì)模型的狀態(tài)信息和統(tǒng)計(jì)信息進(jìn)行編碼;-將所述壓縮中間表示解碼(401),從而產(chǎn)生所述變換代碼(402)和所述編譯器信息(403);以及-使用所述解碼的編譯器信息進(jìn)一步編譯(407)所述變換代碼,并產(chǎn)生所述可執(zhí)行程序代碼(EXE)。
15.一種計(jì)算機(jī)程序,它包括當(dāng)所述程序在計(jì)算機(jī)上運(yùn)行時(shí),用于執(zhí)行如權(quán)利要求14所述的所有步驟的程序代碼組件。
16.一種用于生成可執(zhí)行程序代碼的數(shù)據(jù)處理系統(tǒng),所述系統(tǒng)包括適于生成輸入代碼的壓縮中間表示的編碼模塊;所述編碼模塊包括-適于對(duì)所述輸入代碼進(jìn)行變換的第一編譯器裝置,包括執(zhí)行一組選定的代碼優(yōu)化步驟并產(chǎn)生變換代碼和有關(guān)所述變換代碼的編譯器信息;-處理裝置,適于從所述變換代碼和所述編譯器信息提取統(tǒng)計(jì)模型的狀態(tài)信息和統(tǒng)計(jì)信息;以及-編碼設(shè)備,適于使用所述提取的狀態(tài)信息和統(tǒng)計(jì)信息將所述變換代碼和所述編譯器信息編碼,并產(chǎn)生所述壓縮中間表示;適于從所述壓縮中間表示生成所述可執(zhí)行程序代碼的解碼模塊;所述解碼模塊包括-解碼裝置,適于將所述壓縮中間表示解碼,從而得到所述變換代碼和所述編譯器信息;以及-第二編譯器裝置,適于使用所述解碼的編譯器信息進(jìn)一步編譯所述變換代碼,從而產(chǎn)生所述可執(zhí)行程序代碼。
17.一種用于為數(shù)據(jù)處理系統(tǒng)生成程序代碼的編碼設(shè)備;所述編碼設(shè)備包括-用于對(duì)輸入代碼進(jìn)行變換的編譯器裝置,包括執(zhí)行一組選定的代碼優(yōu)化步驟,從而產(chǎn)生變換代碼和有關(guān)所述變換代碼的編譯器信息;-處理裝置,適于從所述變換代碼和所述編譯器信息中提取統(tǒng)計(jì)模型的狀態(tài)信息和統(tǒng)計(jì)信息;以及-編碼裝置,適于使用所述提取的狀態(tài)信息和統(tǒng)計(jì)信息將所述變換代碼和所述編譯器信息編碼,并產(chǎn)生所述輸入代碼的壓縮中間表示;所述壓縮中間表示適于在后續(xù)的解碼級(jí)中進(jìn)行解碼并進(jìn)一步編譯以生成可執(zhí)行程序代碼。
18.一種用于生成可執(zhí)行程序代碼的數(shù)據(jù)處理系統(tǒng),所述數(shù)據(jù)處理系統(tǒng)包括-適于接收輸入代碼的壓縮中間表示的接收裝置,所述壓縮中間表示包括由編譯器生成并至少部分優(yōu)化的編碼變換代碼和由所述編譯器生成的表示所述編譯器生成的其它信息的編碼編譯器信息;所述編碼變換代碼和所述編碼編譯器信息利用從所述變換代碼和所述編譯器信息中提取的統(tǒng)計(jì)模型的狀態(tài)信息和統(tǒng)計(jì)信息進(jìn)行編碼;-解碼裝置,適于將所述壓縮中間表示解碼,從而得到所述變換代碼和所述編譯器信息;以及-編譯器裝置,適于使用所述解碼的編譯器信息進(jìn)一步編譯所述變換代碼,從而產(chǎn)生所述可執(zhí)行程序代碼。
19.一種包括輸入代碼的壓縮中間表示的數(shù)據(jù)記錄,所述壓縮中間表示包括由編譯器生成并至少部分優(yōu)化的編碼變換代碼和表示由所述編譯器生成的其它信息的編碼編譯器信息;所述編碼變換代碼和所述編碼編譯器信息利用從所述變換代碼和所述編譯器信息中提取的統(tǒng)計(jì)模型的狀態(tài)信息和統(tǒng)計(jì)信息進(jìn)行編碼;所述壓縮中間表示適于由數(shù)據(jù)處理系統(tǒng)解碼并進(jìn)一步編譯,從而產(chǎn)生可執(zhí)行程序代碼。
全文摘要
本發(fā)明公開(kāi)了一種為數(shù)據(jù)處理系統(tǒng)生成可執(zhí)行程序代碼的方法,它包括用于生成輸入代碼(IC)的壓縮中間表示(E-IR)的編碼級(jí)和用于從所述中間表示生成可執(zhí)行代碼的解碼級(jí)。所述編碼級(jí)包括對(duì)所述輸入代碼進(jìn)行變換(301),包括執(zhí)行代碼優(yōu)化步驟,從而產(chǎn)生變換代碼(302)和有關(guān)所述變換代碼的編譯器信息(303);從所述變換代碼和所述編譯器信息提取(304,306)統(tǒng)計(jì)模型的狀態(tài)信息和統(tǒng)計(jì)信息(PDF)(305);以及使用所提取的狀態(tài)信息和統(tǒng)計(jì)信息,將所述變換代碼和所述編碼器信息編碼(307),并產(chǎn)生所述壓縮中間表示。所述解碼級(jí)包括將所述壓縮中間表示解碼,從而得到所述變換代碼和所述編譯器信息;并使用所述解碼的編譯器信息進(jìn)一步編譯所述變換代碼,從而產(chǎn)生所述可執(zhí)行程序代碼。
文檔編號(hào)G06F9/45GK1672133SQ03818445
公開(kāi)日2005年9月21日 申請(qǐng)日期2003年6月27日 優(yōu)先權(quán)日2002年8月2日
發(fā)明者J·阿貝里, F·達(dá)爾格倫, J·斯克普斯泰德特 申請(qǐng)人:艾利森電話股份有限公司
網(wǎng)友詢(xún)問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1