国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

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

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

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

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