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

數(shù)據(jù)序列產(chǎn)生方法及設(shè)備、轉(zhuǎn)換方法及計算機的制作方法

文檔序號:6414642閱讀:332來源:國知局
專利名稱:數(shù)據(jù)序列產(chǎn)生方法及設(shè)備、轉(zhuǎn)換方法及計算機的制作方法
技術(shù)領(lǐng)域
本發(fā)明涉及一編譯器,特別是用于Java(Java是Sun微系統(tǒng)公司的注冊商標)的即時(Just In Time-JIT)編譯器。
憑借因特網(wǎng)的普及Java得以廣泛地作用,這是由于如

圖1所示字節(jié)碼14的特點所決定的,此字節(jié)碼是當服務(wù)器1中的Java編譯器12編譯Java源碼10時而得到的。字節(jié)碼14既與OS(操作系統(tǒng))53無關(guān)也與硬件55,如客戶機5中的CPU無關(guān),因此能被連結(jié)在網(wǎng)絡(luò)3上各種各樣的客戶機5執(zhí)行。另一方面,因為字節(jié)碼14必須要由客戶機5重新解釋,從而出現(xiàn)了執(zhí)行速度下降的問題??蛻魴C5可以是一般計算機,或者是稱作網(wǎng)絡(luò)計算機,還可以是存儲容量小的家用信息處理機,或者是沒有裝備像硬盤這樣的輔助存儲設(shè)備的機器。
字節(jié)碼14是在客戶機5中為WWW(萬維網(wǎng))瀏覽器提供的Java虛擬機(Java VM)52的本機碼。當CPU,即硬件55實際執(zhí)行字節(jié)碼14時,使用了Java解釋器54和Java JIT編譯器56。
當執(zhí)行字節(jié)碼14時,解釋器54翻譯字節(jié)碼14并調(diào)用和執(zhí)行為每個指令準備的執(zhí)行程序。解釋器的優(yōu)點在于字節(jié)碼14-讀出,字節(jié)碼14的執(zhí)行就可應(yīng)即開始,并且所包含的字節(jié)碼的數(shù)量通常很小,為了執(zhí)行僅需小的存儲器容量。缺點是執(zhí)行速率低,這是因為字節(jié)碼只是在它執(zhí)行前才被解碼而出現(xiàn)以下問題造成的結(jié)果。
(a)因為Java字節(jié)碼以可變長格式提供,為CPU的多預(yù)取指優(yōu)化難以實現(xiàn)。
(b)難以提供基于規(guī)則的優(yōu)化,以頻繁地檢測字節(jié)碼。當使用復(fù)雜的規(guī)則或多規(guī)則時,為了對字節(jié)碼序列應(yīng)用規(guī)則,需要許多時間來檢測字節(jié)碼,這種處理是不實際的。
(c)參數(shù)的讀出只能在執(zhí)行程序的頭部發(fā)生,所以處理過程不能立即開始。
(d)因為解碼循環(huán)的存在,解碼循環(huán)的處理時間附加到全部字節(jié)碼14的處理時間上。因此,處理速度不可能增強以使超過解碼循環(huán)處理速度。
JIT編譯器56預(yù)先或者在執(zhí)行前即時將字節(jié)碼14翻譯成機器碼并執(zhí)行機器碼。此方法的優(yōu)點在于因編譯器技術(shù)的使用而優(yōu)化了機器碼,被翻譯的碼執(zhí)行速度高。然而,通常的優(yōu)化編譯器比解釋器要求更多的存儲器和更高的CPU能力。
有一種使用線程碼的技術(shù),字節(jié)碼14轉(zhuǎn)換成一子程序調(diào)用而后才被執(zhí)行,線程碼是一子程序和一機器碼構(gòu)成的對,其中子程序是為每個字節(jié)碼準備的用以處理對應(yīng)的字節(jié)碼,而機器碼設(shè)置參數(shù)并根據(jù)字節(jié)碼發(fā)出子程序調(diào)用。線程碼是通過編譯字節(jié)碼成為具有最小長度的機器碼而得到。線程碼的執(zhí)行快于解釋器,同時比通常的優(yōu)化編譯器要較少的資源。然而,在這種情況下會出現(xiàn)下列問題。
(a)為Java字節(jié)碼例如用32位的RISC CPU,轉(zhuǎn)換參數(shù)集和調(diào)用指令占用存儲器的平均大小是字節(jié)碼占用的四倍之多。
(b)在基于規(guī)則的優(yōu)化能對快速檢測的字節(jié)碼序列使用之前,程序的結(jié)構(gòu)必須被分析以確認字節(jié)碼序列不超過大多數(shù)基本塊,因為這樣,字節(jié)碼序列的開銷也許偏離優(yōu)化的效果。
(c)因為中間碼也是機器碼,一個已經(jīng)預(yù)先執(zhí)行過的執(zhí)行程序可能從指令高速緩存中被清除。

背景技術(shù)
中沒有公開這樣的Java字節(jié)碼編譯器,它能被結(jié)合到網(wǎng)絡(luò)計算機和家用信息處理機中,并且在要求很少的資源時能執(zhí)行高速處理。
因此,本發(fā)明的第一個目的就是提供一編譯器,它能在使用有限資源的同時以高速編譯Java字節(jié)碼。
本發(fā)明的另一個目的是提供一編譯器,它能實現(xiàn)基于規(guī)則的優(yōu)化而無需分析程序的結(jié)構(gòu)。
本發(fā)明還有一個目的是為優(yōu)化程序的執(zhí)行,應(yīng)用一種規(guī)則而不必考慮程序基本塊的邊界。
本發(fā)明再一個目的是對對應(yīng)于一字節(jié)碼的執(zhí)行程序提供一種指令結(jié)構(gòu),以充分利用CPU的能力。
本發(fā)明的第一個特點是一種方法,用于把字節(jié)碼轉(zhuǎn)換成中間碼,這里用與一個字節(jié)碼對應(yīng)的執(zhí)行程序的地址作為操作碼,并且以連續(xù)順序執(zhí)行此執(zhí)行程序。中間碼的長度是固定的,操作碼的位的位置也是固定的。執(zhí)行程序存儲在存儲器的連續(xù)區(qū)域中,而且執(zhí)行程序相對于頭地址的偏移量作為操作碼來使用。因此,對應(yīng)于中間碼的執(zhí)行程序地址產(chǎn)生和操作數(shù)產(chǎn)生都能高速實現(xiàn)。此外,通過使用CPU中的空流水線,用于移到下一中間碼執(zhí)行程序之指令組的一部分(操作數(shù)產(chǎn)生和轉(zhuǎn)移),以及用于轉(zhuǎn)移到再下一中間碼執(zhí)行程序之指令組的一部分(中間碼預(yù)取指和執(zhí)行程序地址計算)能與原始中間碼處理并行執(zhí)行。其結(jié)果是節(jié)省了解碼和轉(zhuǎn)移處理所要求的時間,而且執(zhí)行的速度能夠提高。另外,因為中間碼不是指令而是數(shù)據(jù),指令高速緩存可用于僅緩存執(zhí)行程序組。因此,指令高速緩存比在背景技術(shù)中能被更有效地使用。在那里是使用參數(shù)集和對執(zhí)行程序的子程序調(diào)用來實現(xiàn)中間碼的。
本發(fā)明的第二個特點是采用表達方式(idioms)來實現(xiàn)基于規(guī)則的優(yōu)化,不要求分析程序結(jié)構(gòu)。具體地,當有字節(jié)碼序列A,B,C和D,以及表達方式ABCD被定義時,字節(jié)碼A被轉(zhuǎn)換成中間碼abcd,這里使用ABCD執(zhí)行程序的地址作為操作碼,而字節(jié)碼B,C和D被轉(zhuǎn)換成中間碼b,c和d,使用了相應(yīng)的執(zhí)行程序的地址作為操作碼。也就是,中間碼按abcd,b,c和d的次序產(chǎn)生。如果當abcd的執(zhí)行已經(jīng)完成時,處理轉(zhuǎn)移到d下面的位置,在那出現(xiàn)分支指令轉(zhuǎn)移到b,c或d的情況也能被處理,在高速處理能被提供時,能確保相同的處理。中間碼不能減少,但使用表達方式的基于規(guī)則的優(yōu)化可以提供,無需分析程序結(jié)構(gòu)。因為在有分支指令轉(zhuǎn)移到表達方式化的碼上時,通常的規(guī)則不能被使用,本發(fā)明擴展了該規(guī)則的使用范圍。
綜上所述,大多數(shù)執(zhí)行程序的每一個,都能被一個周期中能執(zhí)行兩個或更多指令的處理機來執(zhí)行,包括有執(zhí)行程序原始要求的指令;跟隨執(zhí)行程序后執(zhí)行的轉(zhuǎn)移到第二執(zhí)行程序的部分指令;以及跟在第二執(zhí)行程序后執(zhí)行的轉(zhuǎn)移到第三執(zhí)行程序的部分指令。這兩個執(zhí)行程序共享為執(zhí)行一個執(zhí)行程序所要求的預(yù)處理,所以在一個執(zhí)行程序中的指令可被平穩(wěn)地優(yōu)化,對轉(zhuǎn)移和解碼不會招致任何不利后果。此執(zhí)行程序以及編譯器的其它元素被存儲在主存儲器中,以便執(zhí)行。
在碼序列中的每個碼可以與每個執(zhí)行程序?qū)?yīng)以便調(diào)節(jié)處理流,并且用于轉(zhuǎn)移到第二執(zhí)行程序的部分指令可能包含為第二執(zhí)行程序的操作數(shù)生成指令,以及為轉(zhuǎn)移到第二執(zhí)行程序的轉(zhuǎn)移指令。同時,為轉(zhuǎn)移到第三執(zhí)行程序的部分指令可能包含用于相對第三執(zhí)行程序取碼的指令,以及用于計算第三執(zhí)行程序地址的指令。
在碼序列中的每個碼可以與每個執(zhí)行程序?qū)?yīng)以便調(diào)節(jié)處理流,并且一表達方式化的執(zhí)行程序,它是許多執(zhí)行程序的一個集,可能包含用于對應(yīng)第二執(zhí)行程序從碼序列中取一碼字的指令,為計算第二執(zhí)行程序地址的指令,為第二執(zhí)行程序的操作數(shù)生成指令,為轉(zhuǎn)移到第二執(zhí)行程序的指令,為從碼序列中取對應(yīng)第三執(zhí)行程序一碼的指令,和為計算第三執(zhí)行程序地址的指令。當使用表達方式的優(yōu)化不分析程序的結(jié)構(gòu)而執(zhí)行時,在上面所說的例子中,中間碼按abcd,b,c和d的次序產(chǎn)生。在abcd前的中間碼的執(zhí)行程序中,執(zhí)行預(yù)取b和b的執(zhí)行程序的地址計算。然而,因為在abcd后將要處理的中間碼是跟在d后的中間碼,并且不是中間碼b,所以預(yù)取址和地址計算必須再次執(zhí)行。因此,表示方式執(zhí)行程序要求上面所述的指令。
另外,當?shù)诙悢?shù)據(jù)序列(中間碼序列)根據(jù)第一類數(shù)據(jù)序列(字節(jié)碼序列)而產(chǎn)生時,下列步驟要執(zhí)行讀出第一類數(shù)據(jù);確定讀出的第一類數(shù)據(jù)序列是否與預(yù)定的表達方式數(shù)據(jù)之一相同,每個預(yù)定的表達方式數(shù)據(jù)包含一組第一類數(shù)據(jù);以及如果讀出的第一類數(shù)據(jù)序列與表達方式數(shù)據(jù)相同,則轉(zhuǎn)換讀出的第一類數(shù)據(jù)序列中的第一數(shù)據(jù)成為對應(yīng)于表達方式數(shù)據(jù)的第二類數(shù)據(jù),在上面所說的例子中,此處理對應(yīng)于字節(jié)碼A到中間碼abcd的轉(zhuǎn)換。
再則,還可能包括下面的步驟轉(zhuǎn)換讀出的第一類數(shù)據(jù)序列中不是第一數(shù)據(jù)的每個數(shù)據(jù)成為第二類對應(yīng)數(shù)據(jù)。在上述例子中,這一步對應(yīng)于字節(jié)碼B,C和D到對應(yīng)中間碼b,c和d的轉(zhuǎn)換。
還有,下列步驟也可能被包括第二確定步驟確定是否有可能性在讀出的第一類數(shù)據(jù)序列中,除了第一數(shù)據(jù)的數(shù)據(jù)序列與包含在預(yù)定的表達方式數(shù)據(jù)中的數(shù)據(jù)序列相同;以及,如果查明沒有可能性時,轉(zhuǎn)換第一數(shù)據(jù)下面的數(shù)據(jù)成為第二類對應(yīng)數(shù)據(jù)的步驟。在上述例子中,表達方式BCD或BCDX(X是字節(jié)碼或為1或更大的字節(jié)碼)沒有出現(xiàn)。然而,通常此表達方式BCD或BCDX可被預(yù)先規(guī)定。存在這種表達方法的可能性被判斷,并當沒有這種表達方式存在的可能性時,下面的字節(jié)碼被轉(zhuǎn)換成相應(yīng)的中間碼。
這樣一來,可能進一步包括下面的步驟對還沒有轉(zhuǎn)換成第二類數(shù)據(jù)序列的第一類讀出數(shù)據(jù)序列中的數(shù)據(jù)序列施行第二確定步驟。在上面的例子中這一步是完成了,表達方法可能被預(yù)先規(guī)定從C或D開始。
上面所敘述的處理在確定步驟之前,另一類數(shù)據(jù)序列的結(jié)構(gòu)無須被分析就可以實現(xiàn)。
還有,下面這些步驟也可能還被包括如果查明存在可能性時,確定在第一類讀出數(shù)據(jù)序列中還沒有轉(zhuǎn)換成第二類數(shù)據(jù)的數(shù)據(jù)序列是否等于預(yù)定的表達方式數(shù)據(jù);以及如果此數(shù)據(jù)序列等于預(yù)定表達方式數(shù)據(jù)時,將第一類讀出數(shù)據(jù)序列中尚未轉(zhuǎn)換為第二類數(shù)據(jù)的數(shù)據(jù)序列的第一數(shù)據(jù),轉(zhuǎn)換成對應(yīng)被確認為等同預(yù)定表達方式數(shù)據(jù)的第二類數(shù)據(jù)。這是當預(yù)先規(guī)定了表達方式BCD時實現(xiàn)的處理的實例。
轉(zhuǎn)換為第二類數(shù)據(jù)的步驟可能包含為對應(yīng)于第一類數(shù)據(jù)的執(zhí)行程序計算地址的步驟。當執(zhí)行程序的地址作為中間操作碼的操作碼使用時,此計算是必須的。
上面的處理可借助專用的設(shè)備實現(xiàn)或者依據(jù)計算機程序執(zhí)行。這種執(zhí)行程序和計算機程序可以存儲在象軟盤,或CD-ROM,或者如主存或硬盤的存儲設(shè)備中。
圖1是說明一般系統(tǒng)的方塊圖。
圖2是顯示JIT編譯器56的方塊圖。
圖3是轉(zhuǎn)換/執(zhí)行模塊的流程圖。
圖4是當未實現(xiàn)基于規(guī)則的優(yōu)化時,轉(zhuǎn)換為中間碼的流程圖。
圖5是解釋中間碼的操作碼的圖形。
圖6為“iload”的執(zhí)行程序示例圖。
圖7為“iadd”的執(zhí)行程序示例圖。
圖8為“iconst”的執(zhí)行程序示例圖。
圖9的圖形用以說明“rlwimi”指令。
圖10的圖形用以說明本發(fā)明的第二特點。
圖11是依照本發(fā)明的基于規(guī)則的優(yōu)化處理流程圖。
圖12是為確定讀出的字節(jié)碼是否與規(guī)則匹配的流程圖。
圖13是為查找下一規(guī)則準備的流程圖。
圖14是復(fù)位規(guī)則查找部分的流程圖。
圖15是轉(zhuǎn)換為中間碼的常規(guī)處理流程。
圖16是圖15中程序結(jié)構(gòu)分析的流程。
圖17是圖15中規(guī)則查找期間當基本塊的邊界達到時,規(guī)則查找處理的流程。
圖18為對規(guī)則“ILLADDS”的執(zhí)行程序?qū)嵗龍D。
圖19為使用解釋器方法的處理實例圖。
圖20為使用線程碼方法的處理實例圖。
附圖中的標號意義說明如下1服務(wù)器3網(wǎng)絡(luò)5客戶機10Java源碼12Java編譯器14字節(jié)碼52Java虛擬機53操作系統(tǒng)54Java解釋器55硬件(包括存儲器及CPU)56Java JIT編譯器58機器碼100轉(zhuǎn)換/執(zhí)行模塊102中間碼104執(zhí)行程序組本發(fā)明可提供一編譯器,僅使用有限的資源它能以高速執(zhí)行Java字節(jié)碼。
本發(fā)明可提供一編譯器,它能實現(xiàn)基于規(guī)則的優(yōu)化而無須分析程序的結(jié)構(gòu)。
為優(yōu)化程序的執(zhí)行,不考慮程序基本塊的邊界而能應(yīng)用規(guī)則。
可為對應(yīng)于字節(jié)碼的執(zhí)行程序提供一種指令結(jié)構(gòu),它能夠充分利用CPU的能力。
按照本發(fā)明的系統(tǒng)總體結(jié)構(gòu)與圖1所示相似。被裝載進入客戶機主存的JIT編譯器56,顯示在圖2方塊圖中。字節(jié)碼14通過網(wǎng)絡(luò)3被客戶機5所接收,并裝載入主存。一執(zhí)行程序組104對應(yīng)于字節(jié)碼的各個字段,被連續(xù)地存儲在主存中,并且在此圖中包含有執(zhí)行程序1(104a),執(zhí)行程序2(104b)和執(zhí)行程序3(104c)。另外,轉(zhuǎn)換/執(zhí)行模塊100被準備以讀取字節(jié)碼14,產(chǎn)生中間碼102,以及通過訪問執(zhí)行程序組104執(zhí)行此代碼。
由轉(zhuǎn)換/執(zhí)行模塊100實現(xiàn)的處理現(xiàn)參照圖3將予以說明。當轉(zhuǎn)換/執(zhí)行模塊100被調(diào)用時,首先確定字節(jié)碼14是否已被裝載(步1010)。如果字節(jié)碼14已被裝載完畢,對此字節(jié)碼的轉(zhuǎn)換處理已經(jīng)完成,并且程序控制轉(zhuǎn)移到步1040。當字節(jié)碼14尚未被裝載時則將其裝載(步1020),并轉(zhuǎn)換成中間碼(步1030)。一旦字節(jié)碼已被轉(zhuǎn)換為中間碼,此字節(jié)碼就不再需要了,并且此字節(jié)碼存放的區(qū)域被釋放。其結(jié)果是存儲器能得以有效利用。轉(zhuǎn)換處理包括一計算處理,如用中間碼的操作數(shù),計算與每個字節(jié)碼對應(yīng)的執(zhí)行程序的地址。
當完成了到中間碼的轉(zhuǎn)換時,CPU的寄存器被初始化。從而程序的控制轉(zhuǎn)移到對第一個中間碼的執(zhí)行程序(步1040),并且執(zhí)行中間碼的處理(步1050)。只要中間碼不是返回指令,中間碼的處理就一直繼續(xù)(步1060)。當中間碼為返回指令時,程序的控制返回到主調(diào)程序(步1070)。
圖4顯示了轉(zhuǎn)換為中間碼的處理。首先,一字節(jié)碼序列被讀出(步1110),以及產(chǎn)生一中間碼,此中間碼具有與字節(jié)碼對應(yīng)的執(zhí)行程序的地址作為其操作碼(步1120)。因為執(zhí)行程序104被裝載進入存儲器的連續(xù)區(qū)域,通過首地址的偏移可確定對應(yīng)執(zhí)行程序的地址。在圖5的例子中,因為對應(yīng)于字節(jié)碼“iadd”的執(zhí)行程序在偏移執(zhí)行程序組104的頭(頂)部“xxxx”處被裝載,此中間碼的第一個操作碼是“xxxx”。而且,因?qū)?yīng)于字節(jié)碼“iload”的執(zhí)行程序在偏移執(zhí)行程序組104頭部“yyyy”處被裝載,此中間碼的下一操作碼是“yyyy”。另外,因?qū)?yīng)于字節(jié)碼“if cmplt”的執(zhí)行程序在偏移執(zhí)行程序組104頭部“zzzz”處被裝入,中間碼的下一操作碼為“zzzz”。這些執(zhí)行程序無須連接放置,只要相互靠近,裝載過程速度沒有不利影響。
因為通常字節(jié)碼具有可變長度于是難以由CPU多步預(yù)取處理,中間碼的長度應(yīng)該是恒定值,也就是二進制碼由字單位(例如32bits)構(gòu)成,第一個字由操作碼及操作數(shù)構(gòu)成。最好在一個字中操作碼和操作數(shù)的位置和長度也是定值。另外,還希望操作碼和操作數(shù)占據(jù)一單個字的位置,除非要求多操作數(shù)的情況存在。如果需要第二個和后續(xù)的字,其結(jié)構(gòu)為每個操作碼預(yù)先規(guī)定,對要求二個操作數(shù)的指令,這第一個字可由普通的操作碼和第一操作數(shù)組成,而第二字可由第二操作數(shù)及(空操作)NOP指令構(gòu)成。當使用可變長的操作時,第二個及后面的字必須包含具有合適長度的操作數(shù)。
字節(jié)碼的操作數(shù)中一個被裝進堆棧,一個包含在字節(jié)碼中,執(zhí)行程序期間,裝入堆棧的操作數(shù)從堆棧裝載,而包含在字節(jié)碼中的操作數(shù)從中間碼的操作數(shù)字段抽出。包含在中間碼中的操作數(shù)被劃分為如下1.局部變量索引2.常量數(shù)據(jù)存儲區(qū)索引3.常量值4.空操作數(shù)(僅在堆棧中的操作數(shù))5.與指令符合的其它操作數(shù)現(xiàn)將說明上面各個操作數(shù)。
1.局部變量索引在Java字節(jié)碼中,局部變量從0開始按升序被編號,并且這些號作為操作數(shù)用以指定要被使用的局部變量。全部局部變量具有相同的大小(一字長=32位),兩個局部變量用64位的數(shù)據(jù)。對中間碼,不是局部變量號,用該方法從堆??蚣茴^到局部變量地址的偏移量(以字長度單位計算)作為操作數(shù)。當JIT編譯器執(zhí)行一具體方法時,用于局部變量的區(qū)域定義在緊靠該方法的堆棧框架處。運行中該方法之堆??蚣茴^的地址保持在寄存器中(當使用下面要說的Power PC機時為BP寄存器)。因此,當操作數(shù)按上面所說地被定義時,此BP寄存器和一偏移量被使用以允許應(yīng)即訪問局部變量。偏移量是在前面的執(zhí)行程序中將偏移量乘以4并將結(jié)果轉(zhuǎn)換為字節(jié)單位而獲得(在前面程序中是否操作數(shù)要乘以4取決于CPU)。
2.常量數(shù)據(jù)存儲區(qū)索引在Java中存在字節(jié)碼中包含具有常量值的操作數(shù)的情況,還有常量值被存儲在常量數(shù)據(jù)存儲區(qū)(一常量表,每個元素的大小為一個字=32位)而且其索引用做操作數(shù)的情況。當操作數(shù)是存儲在常量數(shù)據(jù)存儲區(qū)的常量值時,從常量數(shù)據(jù)存儲區(qū)的基地址中得到,按字為單位計算出的偏移量定義為操作數(shù)。在執(zhí)行程序中,保持常量數(shù)據(jù)存儲區(qū)基地址的寄存器(在下面的例子中為CP寄存器)和獲得的一偏移量被使用以應(yīng)即裝載常量數(shù)據(jù)存儲區(qū)的常數(shù)。該偏移量是在前面的程序中將偏移量乘以4并將結(jié)果轉(zhuǎn)換為字節(jié)單位而獲得,在實際實施時,常量數(shù)據(jù)存儲區(qū)的基地址定義為常量數(shù)據(jù)存儲區(qū)的頭地址+32K字。用這種定義,當使用16位帶符號的操作數(shù)作為索引時,最大64K入口可被訪問。
3.常量值當字節(jié)碼中包含一常量值并且一處理整數(shù)的指令被發(fā)出時,此常量值落在16位帶符號的整數(shù)范圍內(nèi)。在此情況下,此整數(shù)作為操作數(shù)使用,對于處理浮點值的指令常數(shù)值或者是0,1,或者是2。不管單精度字點值還是多精度浮點值,除高端16個位外,其余各位是0。因此,根據(jù)指令以格式表示的常量值的高16個位被定義作為操作數(shù)。當一處理整數(shù)值的指令使用操作數(shù)時,因為在前面的執(zhí)行程序中操作數(shù)被乘以4,此操作數(shù)應(yīng)乘以1/4以便返回為原始值。盡管這種處理是浪費的,在實際程序的字節(jié)碼中,比之處理常量值的指令,有更多的訪問局部變量和常量數(shù)據(jù)存儲區(qū)的指令,而且系統(tǒng)經(jīng)常設(shè)計成具有更高的所需處理速度。因為處理常量值的指令,僅僅是將常量值推入堆棧的簡單指令。由于指令間的依賴性的存在,該乘以1/4的處理不會對執(zhí)行速度帶來有害的影響,對于處理浮點值的指令要求增加上第0位。
4.無操作數(shù)當在字節(jié)碼中沒有操作數(shù)時如像iadd指令(用于計算堆棧中二個整數(shù)值之和并將此和推入堆棧),一合適的值(實際實施時是“0”)被輸入。
5.與指令符合的其它操作數(shù)一個能用16位表示的值它代表每個指令的一個操作數(shù),并且有了它執(zhí)行速度能增加。對于超過16位的操作數(shù),中間碼使用二個或更多的字。
對圖4中步1120的處理,當提供字節(jié)碼和對應(yīng)偏移量的表時,處理速度能夠提高。步1110和1120的處理被重復(fù)直到全部字節(jié)碼轉(zhuǎn)換完成(步1130)。
在本實施例中,執(zhí)行程序由CPU執(zhí)行,在一個周期內(nèi)(一個時鐘)CPU能執(zhí)行二個或更多的機器碼。每個執(zhí)行程序中包含為處理字節(jié)碼的機器碼,為下一字節(jié)碼計算執(zhí)行程序地址和為操作數(shù)生成的機器碼,為裝載再下一個中間碼和為執(zhí)行程序計算地址的機器碼,以及為下一字節(jié)碼轉(zhuǎn)移到執(zhí)行程序的機器碼。一以Power PC 603e作為CPU使用的例子被給出。(Power PC是IBM公司的注冊商標)。
Power PC 603e在一個周期中最多可執(zhí)行5個指令(需要說明的是Power PC 603e在一個周期可執(zhí)行讀兩條指令,但在讀指令已經(jīng)完成以后在一個周期可執(zhí)行5條指令)。使用這一能力,為執(zhí)行中間碼的預(yù)處理開銷可被隱藏掉。圖6到圖8所示的指令能在一個周期中被執(zhí)行(以一行表示)。例如在對字節(jié)碼“iload”的執(zhí)行程序中,如圖6所示,這是一指令將局部變量推入操作數(shù)堆棧。對下一中間碼的處理(陰暗部分)和為再下一個中間碼的處理(在中間一列和右邊一列畫有剖面線的部分)在“iload”指令的原始處理執(zhí)行的同時(在左邊一列)實現(xiàn)。由虛線圍繞的部分代表在CPU的流水線中沒有要執(zhí)行的指令,這是由于停止原始中間碼的處理或中間碼中原始處理指令之間的相關(guān)性。
“l(fā)wzx”是從局部變量裝載數(shù)值的指令,而“stwu”是將其推入操作數(shù)據(jù)堆棧的指令。這兩條指令都要求字節(jié)碼“iload”處理?!癿tctr”是用于在計數(shù)器中設(shè)定下一執(zhí)行程序地址的指令;“srawi”是將操作數(shù)乘以4的指令;而“bctr”是實現(xiàn)轉(zhuǎn)移到下一執(zhí)行程序的指令。這些指令構(gòu)成向下一執(zhí)行程序轉(zhuǎn)移的這種請求。另外,“l(fā)wzu”是預(yù)取再下一個中間碼的指令,而“rlwimi”是計算再一個執(zhí)行程序地址的指令。這些指令構(gòu)成向再下一執(zhí)行程序轉(zhuǎn)移的這種請求部分。
圖7所示的指令是“iadd”指令所要求的,“iadd”指令用于從操作數(shù)堆棧彈出兩組數(shù)據(jù)并且將此數(shù)據(jù)值的和推入操作數(shù)堆棧。如從圖7所見,為轉(zhuǎn)移到下一執(zhí)行程序所要求的指令部分和為轉(zhuǎn)移到再下一程序所要求的指令部分,與“iload”的那些是相同的。而且,為“iadd”所要求的指令是“l(fā)wz”(裝載數(shù)據(jù)1),“l(fā)wz”(裝載數(shù)據(jù)2),“add”(用數(shù)據(jù)1和數(shù)據(jù)2執(zhí)行的計算)和“stwu”(結(jié)果推入操作數(shù)堆棧)。
圖8所示的指令是字節(jié)碼“iconst”所要求的,這是用于將操作數(shù)所提供的常量值推入操作數(shù)堆棧。如從圖8所見,為轉(zhuǎn)移到下一執(zhí)行程序所要求的指令部分和為轉(zhuǎn)移到再一個執(zhí)行程序所要求的指令部分,與“iload”的那些是相同的。而且,為“iconst”所要求的指令包括用于計算常量值(帶符號值)的指令“srawi”和用于將常量值推入操作數(shù)堆棧的指令“stwu”。
假定備用的寄存器按如下命名,對應(yīng)于“iload 4”,“iadd”和“iconst 4”的具體執(zhí)行程序給出如下。
pc中間碼地址ea下一中間碼的執(zhí)行程序的地址op下一中間碼×4的操作數(shù)now再一個中間碼bp堆??蚣艿念^sp操作數(shù)據(jù)棧頭cp常量數(shù)據(jù)存儲區(qū)的基地址“iload4”#cycle1mtctrealwzx r3,bp,op#cycle2
sraxiop,now,14lwzu now,4(pc)#cycle3stwu r3,-4(sp)#cycle4rlwimi ea,now,2,16,29bctr#cycle5流水線停止“iadd”#cycle1mtctrealwz r3,4(sp)#cycle2lwz r4,0(sp)srzwop,now,14#cycle3lwzunow,4(pc)#cycle4add r3,r3,r4#cycle5stwur3,4(sp)rlwimi ea,now,2,16,29bctr#cycle6流水線停止“iconst4”#cycle1mtctreasrawir3,op,2
#cycle2srawiop,now,14lwzu now,4(pc)i#cycle3stwu r3,-4(sp)#cycle4rlwimi ea,now,2,16,29bctr#cycle5流水線停止對上面各條指令的規(guī)定將在下面予以說明。
lwz從存儲器讀出一個字(4個字節(jié))并裝載到寄存器lwzu從存儲器讀出一個字并裝載到寄存器,并且在寄存器中存儲的數(shù)據(jù)地址用來表示一地址。
Iwzx從存儲器讀出一個字并裝載到寄存器,用兩個寄存器值之和指示一個地址。
lbz從存儲器讀出一個字節(jié)并裝載到寄存器。
stwu從寄存器寫一字到存儲器,并在寄存器中存儲的數(shù)據(jù)地址用來表示一地址。
stwx從寄存器寫一字到存儲器,用兩個寄存器值之和指示一個地址。
li在寄存器中設(shè)置一常量add加兩個寄存器值。
addi加常量值到寄存器值上。
srawi右移寄存器的內(nèi)容并使用符號擴展slwi左移寄存器的內(nèi)容rlwimi寄存器A的內(nèi)容循環(huán)移位,并以對應(yīng)的結(jié)果位序列替代寄存器B的位序列。
mtctr在計數(shù)器寄存器(用以存儲間接轉(zhuǎn)移地址的寄存器)中設(shè)置一個值。
bctr按計數(shù)器寄存器中存儲的地址轉(zhuǎn)移。
blr按連接寄存器(用以保存返回地址的寄存器)中存儲的地址轉(zhuǎn)移。
bctrl在連接寄存器中保存返回地址,并按存儲在計數(shù)器寄存器中的地址轉(zhuǎn)移。
現(xiàn)在參照圖9,對用于計算下一執(zhí)行程序地址的“rlwimi”指令進行說明。當“rlwimi B,A,8,12,23”和寄存器A和B如圖9所示時,首先,寄存器A的內(nèi)容向左循環(huán)移8位,然后,寄存器A的12個位(在此情況為5,6,7),位12到位23取代在寄存器B中對應(yīng)位置的各個位置。結(jié)果,寄存器B的內(nèi)容是如步2所表示的。在寄存器A和B中的第一個0x表示16進制系統(tǒng)。
采用上面的結(jié)構(gòu),處理速度可以同樣快或高于以通常的編譯器完成的編譯處理,它不執(zhí)行高級優(yōu)化如寄存器分配或碼的調(diào)度。此外,因為執(zhí)行程序組的頭地址被用作操作碼,中間碼能被降低到兩倍的字節(jié)碼,應(yīng)當指出的是因為在被轉(zhuǎn)換成中間碼以后字節(jié)碼被丟棄,使用的存儲量可以減少。
本發(fā)明的第二個特點現(xiàn)將予以說明。這第二個特點是對采用的CPU沒有限制,具體說,在以上的說明中,在一個周期中CPU應(yīng)當執(zhí)行多條指令,本發(fā)明的第二特點并不依仗CPU。然而需要指出,如要求高速的處理,可采用第二特點和上面所述特點的結(jié)合。
圖10給出第二特點的概貌。圖10中“原始字節(jié)碼”列的左邊表示操作碼,而右邊表示操作數(shù)?!耙?guī)則LLAS應(yīng)用”和“規(guī)則LAS附加應(yīng)用”兩列是為中間碼,并且其左邊表示操作碼而其右邊表示操作數(shù),操作碼是地址,但在此情況下,以字節(jié)碼中相同名或以規(guī)則名來描述。
假定一包括字節(jié)碼序列“iload”,“iload”,“iadd”和“istore”的表達方式LLAS被預(yù)先規(guī)定。因為圖10中左邊的字節(jié)碼序列如圖在LLAS規(guī)定的那樣被安排,規(guī)則LLAS被采用以生成中間碼,產(chǎn)生進到“規(guī)則LLAS應(yīng)用”列的那些內(nèi)容。需要指出的是當使用表達方式的規(guī)則在背景技術(shù)領(lǐng)域應(yīng)用時,包含在規(guī)則定義中的全部碼被恰當?shù)囊?guī)則替換。這就是,在圖10的例子中“iload”,“iload”,“iadd”和“istore”被“LLAS”所替代,并且它們后面跟隨著未對其使用規(guī)則的中間碼“iload”。然而,在本發(fā)明中僅有包含在表達方式中的第一個碼被轉(zhuǎn)換成“LLAS”,而余下的“iload”,“iadd”和“istore”被轉(zhuǎn)換為中間碼。結(jié)果,采用表達方式的規(guī)則應(yīng)用可以不必進行程序結(jié)構(gòu)的分析,也就是,即使當某些碼轉(zhuǎn)移到“原始字節(jié)碼”中的第二個“iload”碼(用箭頭表示的),因“iload”“iadd”和“istore”保持為中間碼,理想地校正處理可得以實現(xiàn)(按LLAS執(zhí)行程序需要讀操作數(shù)“iload”和“istore”的的處理,以及轉(zhuǎn)移到最后一個“iload”的處理)。依照背景技術(shù)采用表達方式的規(guī)則用到這種部分上是不可能的。換句話說,通常通過程序結(jié)構(gòu)的分析已經(jīng)確認,采用表達方式的規(guī)則應(yīng)用對這樣的部分是不可能的。
按照本發(fā)明,當包含字節(jié)碼序列“iload”,“iadd”和“istore”的一表達方式LAS被定義時,它如同圖10右邊“規(guī)則LAS附加應(yīng)用”到所表示的那樣。還有在此情況下,構(gòu)成LAS的字節(jié)碼序列“iload”,“iadd”和“istore”中,只有第一個碼“iload”被轉(zhuǎn)換成LAS,而余下的“iadd”和“istore”被轉(zhuǎn)換為中間碼。“LAS”的執(zhí)行程序也要求讀“istore”的操作數(shù)和轉(zhuǎn)移到最后一個“iload”的處理。在圖10的例子中,規(guī)則LLAS和LAS被定義并能夠使用。不過,當規(guī)則LLAS和AS(“iadd”,“istore”)或者規(guī)則LLAS和SL(“istore”,“iload”)被定義時,它們都能被使用。
在轉(zhuǎn)換字節(jié)碼成為中間碼的處理中(圖3的步1030)采用表達方式的規(guī)則應(yīng)用被實現(xiàn)。此處理在圖11中被顯示。首先,一個字節(jié)碼序列被讀出以確定它是否與規(guī)則匹配(步1210)。在多數(shù)情況下,此處理使用下面將會簡要說明的狀態(tài)轉(zhuǎn)變而實現(xiàn)。讀出的字節(jié)碼序列被確定是否與規(guī)則匹配(步1220)。如果字節(jié)碼序列匹配此規(guī)則,使用匹配規(guī)則的執(zhí)行程序的地址生成中間碼并輸出(步1230)。對此處理,可以使用提供一些地址與對應(yīng)規(guī)則的表。需要指出的是僅對字節(jié)碼序列的第一個字節(jié)碼產(chǎn)生中間碼,而其它的字節(jié)碼保持不改變。當讀出的字節(jié)碼序列不匹配此規(guī)則時,對已被讀出但尚未為其產(chǎn)生中間碼的第一個字節(jié)碼,使用執(zhí)行程序的地址生成中間碼并輸出(步1240)。該處理被執(zhí)行是因為當字節(jié)碼序列不匹配時,為了找尋規(guī)則使用下一字節(jié)碼作為第一字節(jié)碼,此第一字節(jié)碼被轉(zhuǎn)換成中間碼。
遵循這點,檢查是否存在已被讀出但為它尚未生成中間碼的字節(jié)碼(步1250)。當存在這樣的字節(jié)碼,或當步1230的處理已被執(zhí)行完時,則檢查該已讀出但中間碼尚未生成的字節(jié)碼序列與具體規(guī)則的全部或第一部分是否匹配(步1260)。如果字節(jié)碼序列不與任何規(guī)則匹配,程序的控制返回到步1240。當字節(jié)碼序列匹配具體的規(guī)則或大慨匹配此規(guī)則,則準備尋求下一規(guī)則(步1290)。當對已讀出的全部字節(jié)碼都產(chǎn)生了中間碼時,規(guī)則尋找處理被復(fù)位(步1270)。上面的處理被重復(fù)直到?jīng)]有尚未被轉(zhuǎn)換的字節(jié)碼存在為止。步1220的各個處理和下面的步驟要對每一個字節(jié)碼執(zhí)行。
參考圖12現(xiàn)將對圖11中步1210的處理事例作一說明。首先,檢查是否有尚未被轉(zhuǎn)換的字節(jié)碼(1410)。如存在這樣的字節(jié)碼則讀出相繼的字節(jié)碼(步1420)。此相繼的字節(jié)碼用以獲得要被替換的狀態(tài)(步1430)。檢查得到的狀態(tài)是否與任何規(guī)則不匹配(步1440)。如果不匹配,此后的處理被終止(步1520)。如果存在與規(guī)則匹配的可能性,則當前的狀態(tài)被替換為獲得的狀態(tài)(步1450),同時指針指示下次要被讀出的字節(jié)碼的指針加1處(步1460)。然后,檢查是否當前狀態(tài)已與規(guī)則匹配(步1470)。如果狀態(tài)不與規(guī)則匹配,程序的控制返回到步1410,如狀態(tài)已與規(guī)則匹配,處理作為成功匹配而結(jié)束(步1510)。
當在步1410不存在未被轉(zhuǎn)換的字節(jié)碼時,狀態(tài)替換成不再有字節(jié)碼要被讀出的狀態(tài),并且被獲得(步1480)。然后,檢查是否當前狀態(tài)與規(guī)則匹配(步1490)。如果狀態(tài)與規(guī)則匹配,狀態(tài)改變?yōu)楂@得的狀態(tài)(步1500),而此后處理被終止(步1510)。如果狀態(tài)與規(guī)則不匹配,處理被終止(步1520)。因為使用狀態(tài)轉(zhuǎn)換以確定狀態(tài)是否與規(guī)則匹配的算法與使用狀態(tài)轉(zhuǎn)換以查找字符序列的算法類似,應(yīng)當參考《算法介紹“Introduction to Algorithms”》McGraw-Hill圖書公司,MIT出版社,1991,PP.855~868。
圖11中步1290的處理事例被顯示在圖13中。首先,檢查已被讀出但尚未為其生成中間碼的字節(jié)碼序列是否匹配具體規(guī)則前面的部分(步1560)。反之,檢查已被讀出但尚未為其生成中間碼的整個字節(jié)碼序列是否不匹配該規(guī)則。如果整個字節(jié)碼序列匹配該規(guī)則(圖11中步1560的直接回答是NO),初始狀態(tài)由下面狀態(tài)所替換匹配于規(guī)則的字節(jié)碼序列已經(jīng)讀到最后指令的第二個(步1590),也就是,處理返回到已讀出的最后字節(jié)碼的前一個字節(jié)碼。然后,指示下面要被讀出的字節(jié)碼的指針移到與規(guī)則匹配的字節(jié)碼序列的末端,以便將其讀出并且重復(fù)圖12中的處理。
如果被讀出但尚未為其生成中間碼的字節(jié)碼序列是規(guī)則的前面部分,初始狀態(tài)改變到與規(guī)則匹配的字節(jié)碼序列已被讀出的狀態(tài)(步1570)。指示要被讀出的下一字節(jié)碼的指針不移動(步1580),因為要讀的下一字節(jié)碼已被準備好。
圖11中步1270的處理示例在圖14中給出。復(fù)位規(guī)則尋找部分,狀態(tài)被恢復(fù)成初始狀態(tài)(步1660),并且檢查是否存在已被讀出而還沒有轉(zhuǎn)換成中間碼的字節(jié)碼(步1670)。通常,如果處理達到圖11中的步1270,即使已被讀出也不會有尚未轉(zhuǎn)換成中間碼的字節(jié)碼存在。當不存在未轉(zhuǎn)換的字節(jié)碼時,此后處理終止(步1690)。如果存在未轉(zhuǎn)換的字節(jié)碼,該已被讀出的字節(jié)碼被丟棄(步1680)。
為比較,常規(guī)的處理顯示在圖15中,雖然沒有對它作出詳細說明,程序結(jié)構(gòu)的分析是必須首先執(zhí)行的(見圖16)。接著執(zhí)行檢查以確定字節(jié)碼序列是否匹配于規(guī)則,同時考慮基本塊的邊界。使用匹配于規(guī)則的執(zhí)行程序的地址產(chǎn)生和輸出中間碼的處理,按當與規(guī)則匹配的字節(jié)碼序列已被讀出時同樣的方式來實現(xiàn),在此情況下,包含在規(guī)則定義中的全部字節(jié)碼用此規(guī)則來替代,并且規(guī)則查找部分而后被復(fù)位(與圖14中相同)。因此,在本發(fā)明和背景技術(shù)之間產(chǎn)生的中間碼的結(jié)構(gòu)不同。在查找規(guī)則的過程中,當達到基本塊的邊界時,圖15中的規(guī)則查找處理顯示在圖17中。
如在解釋本發(fā)明的第二個特點的第一部分所說,對實現(xiàn)該特點的CPU沒有施加特別的限制。因此,執(zhí)行程序也許為一個周期中僅執(zhí)行一條機器語言指令的CPU準備。這里所示的執(zhí)行程序是由上面所說的Power PC 603e執(zhí)行,以便以更高的速度實現(xiàn)履行的處理。
圖18中給出使用字節(jié)碼序列“iload”,“iload”,“iadd”和“istore”,為規(guī)則“ILLADDS”的執(zhí)行程序。左邊的列表示原始規(guī)則處理,而“srawi”是用于計算數(shù)據(jù)2的偏移的指令。第一個“l(fā)wz”是從局部變量裝載數(shù)據(jù)1的指令;第二個“l(fā)wz”是從局部變量裝載數(shù)據(jù)2的指令;第三個“l(fā)wz”是裝載為“istore”的操作數(shù)的指令?!癮dd”是數(shù)據(jù)1加到數(shù)據(jù)2上的指令;接著的“srawi”是用于計算目標位置處的偏移的指令,在此目標位置處存儲著結(jié)果;而“stwu”是存儲結(jié)果到局部變量的指令。
圖18中間列和右列分別表示轉(zhuǎn)移到下一中間碼的指令部分(陰暗部分)和轉(zhuǎn)移到再一中間碼的指令部分(劃有剖面線的部分)。轉(zhuǎn)移到下一中間碼的指令部分不同于圖6到圖8所示的。也就是為取下一中間碼的指令“l(fā)wz”和為計算下面執(zhí)行程序地址的指令“rlwimi”被額外提供。這是根據(jù)以下情況。在為“ILLADDS”之前的中間碼的執(zhí)行程序中,用以轉(zhuǎn)移到下一中間碼后面的中間碼的指令部分,也就是預(yù)取下一中間碼后面的中間碼和執(zhí)行程序的地址計算,被執(zhí)行。依照本發(fā)明的第二個特點,對應(yīng)于包含在“ILLADDS”定義中的字節(jié)碼的中間碼也被生成。因此,先于“ILLADDS”在下一中間之后到來的中間碼,是“ILLADDS”的定義中包含的第二字節(jié)碼“iload”,因為這在理論上不正確,在為“ILLADDS”的執(zhí)行程序中執(zhí)行了重新計算,處理的其余部分與前面所說的情況相同。
包括“iload4”,“iload5”,“iadd”和“istore6”的規(guī)則“ILLADDS”的細節(jié)如下。
#cycle1srawir4,now,14lwz now,12(pc)#cycle2lwz r3,bp,op#cycle3lwz r4,bp,r4rlwimi ea,now,2,16,29#sycle4mtctrealwz r5,8(pc)srawiop,now,14#cycle5lwzu now,16(pc)add r3,r3,r4#cycle6srawir5,r5,14#cycle7stwu r3,bp,r5rlwimi ea,now,2,16,29bctr#cycle 8流水線停止本發(fā)明已經(jīng)說明過由JIT編譯器執(zhí)行的處理,對應(yīng)于流程圖中各個步驟的功能模塊/電路能夠配備的構(gòu)成專用設(shè)備。
當一程序被用以實現(xiàn)JIT編譯器時,它可存儲在如像CD-ROM,存儲進客戶機。
上面所說明的實施例僅僅是一個示例,而且執(zhí)行程序可針對PowerPC以外的CPU進行修改。另外,由本發(fā)明的第二特點實現(xiàn)的處理不限于圖11中所示的那些,而且也能實現(xiàn)其它的處理,以便生成在圖10中中間和右邊列的中間碼。在圖12,13,和14中采用的算法能被相互替換。
當解釋器方法或線程碼方法由Power PC使用時的處理示例將被說明。圖19所示的處理使用解釋器方法(a)顯示一解碼循環(huán),而(b)顯示“iload”的執(zhí)行程序。如圖19所顯現(xiàn)的,(a)和(b)的處理必須實現(xiàn)此執(zhí)行“iload”,并且總共要求17個周期。執(zhí)行如在上面所說的“ILLADDS”中的同樣的處理,要求(a),(b),(a),(b),(a),(c),(a)和(d)的這些處理。處理(c)是“iadd”的執(zhí)行程序而(d)是“istore”的執(zhí)行程序。因為用解釋器方法基于規(guī)則的優(yōu)化不能實現(xiàn),多重周期是需要的,因此處理較慢。
圖20顯示使用線程碼方法的處理,根據(jù)此方法,首先,中間碼被執(zhí)行,然后開始執(zhí)行程序?!癷load”的處理示于圖20(a),并且在中間碼的處理中,局部變量索引被設(shè)置同時做出對執(zhí)行程序的調(diào)用。圖20(b)顯示“ILLADDS”處理,那里執(zhí)行中間碼的處理并接著處理執(zhí)行程序。當比較圖8和圖18中的處理時,可以看到幾乎要求同樣的周期數(shù)目。然而,當使用線程碼方法以執(zhí)行基于規(guī)則的優(yōu)化時,程序的結(jié)構(gòu)必須首先被分析,所以本發(fā)明的處理執(zhí)行得更快。另外,因為在線程碼系統(tǒng)中中間碼也是指令,指令高速緩存為這種碼所使用。另一方面,因本發(fā)明中中間碼是數(shù)據(jù),從有效使用指令高速緩存的觀點來看處理速度能增加。再則,中間碼的大小小于線程碼。
權(quán)利要求
1.用于根據(jù)第一類數(shù)據(jù)序列產(chǎn)生第二類數(shù)據(jù)序列的方法,包括以下步驟讀出第一類數(shù)據(jù)確定讀出的第一類數(shù)據(jù)序列是否與預(yù)定的表達方式數(shù)據(jù)之一相同,每個所說預(yù)定表達方式數(shù)據(jù)封裝一組所述的第一類數(shù)據(jù);并且如果上述第一類讀出數(shù)據(jù)序列等同于表達方式數(shù)據(jù)之一,則把上述讀出的第一類數(shù)據(jù)序列中的第一個數(shù)據(jù),轉(zhuǎn)換為對應(yīng)于所說的表達方式數(shù)據(jù)之一的第二類數(shù)據(jù)。
2.根據(jù)權(quán)利要求1的方法,其特征在于還包含一步驟將上述讀出的第一類數(shù)據(jù)序列中第一個數(shù)據(jù)以外的每個數(shù)據(jù)轉(zhuǎn)換成第二類對應(yīng)的數(shù)據(jù)。
3.按照權(quán)利要求1的方法,其特征在于還包括以下步驟確定在所說讀出的第一類數(shù)據(jù)序列中除上述第一個數(shù)據(jù)以外的數(shù)據(jù)序列,是否存在可能性與包含在所說預(yù)定表達方式數(shù)據(jù)中的數(shù)據(jù)序列相同;如果查明沒有可能性,則把上述第一個數(shù)據(jù)下面的一個數(shù)據(jù)轉(zhuǎn)換為第二類對應(yīng)數(shù)據(jù)。
4.按照權(quán)利要求3的方法,其特征在于還包括一步驟對所說讀出的第一類數(shù)據(jù)序列中尚未被轉(zhuǎn)換成第二類數(shù)據(jù)序列的數(shù)據(jù)序列,執(zhí)行在權(quán)利要求3中所說的確定步驟。
5.按照權(quán)利要求1的方法,其特征在于,在上述確定步驟之前,所說讀出的第一類數(shù)據(jù)序列的結(jié)構(gòu)未被分析。
6.按照權(quán)利要求3的方法,其特征在于進一步包括下列步驟確定是否在上述讀出的第一類數(shù)據(jù)序列中有尚未被轉(zhuǎn)換成第二類數(shù)據(jù)的數(shù)據(jù)序列,是否確定有可能與所說預(yù)定的表達方式數(shù)據(jù)相等;并且如果上述數(shù)據(jù)序列等同于所說預(yù)定表達方式數(shù)據(jù)時,把上述讀出的第一類數(shù)據(jù)中尚未被轉(zhuǎn)換成第二類數(shù)據(jù)的數(shù)據(jù)序列的第一個數(shù)據(jù),轉(zhuǎn)換成對應(yīng)于被確定等同的所說預(yù)定表達方式數(shù)據(jù)的第二類數(shù)據(jù)。
7.按照權(quán)利要求1,2或6的方法,其特征在于所說對上述第二類數(shù)據(jù)轉(zhuǎn)換步驟,包括為對應(yīng)上述第一類數(shù)據(jù)的執(zhí)行程序計算地址的步驟。
8.一種用于將字節(jié)碼序列轉(zhuǎn)換成為中間碼序列的方法,包括下列步驟第一字節(jié)碼;確定讀出的字節(jié)碼序列是否等同于預(yù)定的表達方式碼之一,每個所說預(yù)定的表達方式數(shù)據(jù)包含一組上述字節(jié)碼;而且如所說中間碼對應(yīng)于上述表達方式碼之一,轉(zhuǎn)換上述讀出的字節(jié)碼序列的第一個碼,成為對應(yīng)于所說表達方式碼之一的中間碼。
9.按照權(quán)利要求8的方法,其特征在于還包括以下步驟確定是否存在這樣的可能性,即在上述字節(jié)碼序列中除所說第一個碼以外的字節(jié)碼序列,與包含在所說預(yù)定表達方式碼中字節(jié)碼序列相同;并且如果查明無此可能性,則將第一個碼下面的碼轉(zhuǎn)換成對應(yīng)的中間碼。
10.一存儲介質(zhì),用于存儲由處理器執(zhí)行的大量執(zhí)行程序,該處理器在一個周期中能執(zhí)行二條或更多的指令,每個所說的大量執(zhí)行程序包括執(zhí)行程序原始要求的一些指令;為轉(zhuǎn)移到接著上述執(zhí)行程序執(zhí)行的第二執(zhí)行程序所須的部分指令;和為轉(zhuǎn)移到接著上述第二執(zhí)行程序執(zhí)行的第三執(zhí)行程序所需的部分指令。
11.按照權(quán)利要求10的存儲介質(zhì),其特征在于,每個上述執(zhí)行程序?qū)?yīng)于調(diào)節(jié)處理流的碼序列中的每個碼;所說的用于轉(zhuǎn)移到上述第二執(zhí)行程序的部分指令,包含為所說第二執(zhí)行程序操作數(shù)生成指令以及為轉(zhuǎn)移到上述第二執(zhí)行程序的轉(zhuǎn)移指令;并且上述為轉(zhuǎn)移到所說第三執(zhí)行程序的部分指令,包括對應(yīng)于所說第三執(zhí)行程序取一個碼的指令,和為計算上述第三執(zhí)行程序地址的指令。
12.按照權(quán)利要求10的存儲介質(zhì),其特征在于,每個上述執(zhí)行程序?qū)?yīng)于調(diào)節(jié)處理流之碼序列中的每個碼;并且一表達方式執(zhí)行程序,它是大量執(zhí)行程序的一個組,包含對應(yīng)于上述第二執(zhí)行程序從所說碼序列中取一個碼的指令,計算上述第二執(zhí)行程序地址的指令,所說第二執(zhí)行程序的操作數(shù)生成指令,轉(zhuǎn)移到上述第二執(zhí)行程序的指令,對應(yīng)于上述第三執(zhí)行程序從所說的碼序列中取一個碼的指令,和計算上述第三執(zhí)行程序地址的指令。
13.用于根據(jù)第一類數(shù)據(jù)序列產(chǎn)生第二類數(shù)據(jù)序列的裝置,包括用以讀出第一類數(shù)據(jù)的模塊;用以確定讀出的第一類數(shù)據(jù)序列是否與預(yù)定表達方式數(shù)據(jù)之一相同的模塊,每個所說預(yù)定表達方式數(shù)據(jù)包含一組所說的第一類數(shù)據(jù);以及轉(zhuǎn)換模塊,用以當上述第一類讀出數(shù)據(jù)序列等同于表達方式數(shù)據(jù)之一時,則把上述讀出的第一類數(shù)據(jù)序列中的第一個數(shù)據(jù),轉(zhuǎn)換為對應(yīng)于所說的表達方式數(shù)據(jù)之一的第二數(shù)據(jù)。
14.按照權(quán)利要求13的裝置,其特征在于還包括第二確定模塊,用以確定在所說讀出的第一類數(shù)據(jù)序列中除上述第一個數(shù)據(jù)以外的數(shù)據(jù)序列,是否存在可能性與包含在所說預(yù)定表達方式數(shù)據(jù)中的數(shù)據(jù)序列相同;并且如果查明沒有可能性,所說的轉(zhuǎn)換模塊把上述第一個數(shù)據(jù)下面的一個數(shù)據(jù)轉(zhuǎn)換為第二類對應(yīng)數(shù)據(jù)。
15.按照權(quán)利要求13或14的裝置,其特征在于上述轉(zhuǎn)換模塊包含一模塊,用于計算對應(yīng)于上述第一類數(shù)據(jù)執(zhí)行程序的地址。
16.按照權(quán)利要求15的裝置,其特征在于上述執(zhí)行程序由在一個周期中能執(zhí)行2條或更多條指令的處理器執(zhí)行;所說的設(shè)備還包括一存儲設(shè)備,用以存儲上述執(zhí)行程序;并且每個上述執(zhí)行程序包含執(zhí)行程序原始要求的一些指令;為轉(zhuǎn)移到接著上述執(zhí)行程序被執(zhí)行的第二執(zhí)行程序所須的部分指令;和為轉(zhuǎn)移到接著上述第二執(zhí)行程序被執(zhí)行的第三執(zhí)行程序所須的部分指令。
17.一種計算機,用于將字節(jié)碼序列轉(zhuǎn)換成中間碼序列,包括一處理器;一存儲器;由處理器執(zhí)行的程序,所說的程序包括用以讀出字節(jié)碼序列的模塊;用以確定讀出的字節(jié)碼序列是否等同于預(yù)定的表達方式碼之一的模塊,每個上述預(yù)定的表達方式碼打包一組所說的字節(jié)碼;還有轉(zhuǎn)換模塊,用于當上述讀出的字節(jié)碼序列等同于表達方式碼之一時,把上述讀出的字節(jié)碼序列的第一個碼轉(zhuǎn)換為對應(yīng)于所說表達方式碼的中間碼。
18.按照權(quán)利要求17的計算機,其特征在于所說的存儲器存儲有與各個字節(jié)碼對應(yīng)的執(zhí)行程序,而且上述轉(zhuǎn)換模塊執(zhí)行處理,以計算對應(yīng)所說字節(jié)碼的執(zhí)行程序的地址。
19.按照權(quán)利要求18的計算機,其特征在于所說的處理器在一個周期中執(zhí)行多個指令;對應(yīng)于上述表達方式碼的執(zhí)行程序包含一指令,用以取接著上述表達方式碼后要被執(zhí)行的第一個中間碼,所說的第一個中間碼對應(yīng)于第二個執(zhí)行程序;包含一指令用以計算上述第二個執(zhí)行程序的地址,一為所說第二執(zhí)行程序操作數(shù)生成指令,一為轉(zhuǎn)移到上述第二個執(zhí)行程序的指令,一個取接著再下一個上述表達方式碼后要被執(zhí)行的第二個中間碼的指令,該第二個中間碼對應(yīng)于第三個執(zhí)行程序,還包含一用以計算上述第三執(zhí)行程序地址的指令。
20.一存儲介質(zhì),存儲有使計算機根據(jù)第一類數(shù)據(jù)序列產(chǎn)生第二類數(shù)據(jù)序列的程序,所說的程序包含下列步驟讀出第一類數(shù)據(jù);確定讀出的第一類數(shù)據(jù)序列是否與預(yù)定的表達方式數(shù)據(jù)之一相同,每個所說預(yù)定表達方式數(shù)據(jù)包含一組上述第一類數(shù)據(jù);并且如果上述第一類讀出數(shù)據(jù)序列等同于表達方式數(shù)據(jù)之一,則把上述讀出的第一類數(shù)據(jù)序列中的第一個數(shù)據(jù),轉(zhuǎn)換為對應(yīng)于所說的表達方式之一的第二類數(shù)據(jù)。
21.一存儲介質(zhì),存儲有使計算機將字節(jié)碼序列轉(zhuǎn)換成為中間碼序列的程序,所說的程序包含下列步驟讀出第一類數(shù)據(jù);確定讀出的字節(jié)碼序列是否與預(yù)定的表達方式碼之一相等,每個上述預(yù)定表達方式碼封裝一組所說的字節(jié)碼;并且如果上述讀出的字節(jié)碼序列等同于所說的表達方式碼之一,轉(zhuǎn)換上述讀出的字節(jié)碼序列的第一個碼成為對應(yīng)于所說表達方式碼之一的中間碼。
全文摘要
一種編譯器,其中將字節(jié)碼轉(zhuǎn)換為中間碼,它使用對應(yīng)于字節(jié)碼的執(zhí)行程序的地址,作為一操作碼,并按對應(yīng)于中間碼的連續(xù)順序執(zhí)行此執(zhí)行程序。中間碼的長度恒定且操作碼的位置也恒定。執(zhí)行程序組相對于頭的地址的偏移量作為操作碼使用。此外,通過使用CPU中的空流水線,用于轉(zhuǎn)移到下一中間碼執(zhí)行程序指令組的一部分指令組以及用于轉(zhuǎn)移到再下一中間碼執(zhí)行程序指令組的一部分指令組能與原始中間碼處理并行執(zhí)行。
文檔編號G06F9/45GK1218222SQ9812383
公開日1999年6月2日 申請日期1998年11月4日 優(yōu)先權(quán)日1997年11月11日
發(fā)明者緒方一則, 小松秀昭, 百瀨浩之 申請人:國際商業(yè)機器公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1