欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

N基數(shù)類型算術表達式的優(yōu)化的制作方法

文檔序號:6631719閱讀:241來源:國知局
專利名稱:N基數(shù)類型算術表達式的優(yōu)化的制作方法
技術領域
本發(fā)明涉及計算機系統(tǒng)。尤其是,本發(fā)明涉及對n基數(shù)類型算術表達式(n-base typed arithmetic expression)進行優(yōu)化。
背景技術


圖1說明了對計算機程序的預處理。用戶用高級程序設計語言10編寫程序。用高級程序設計語言10所編寫的程序被編譯成低級機器語言12,其可由目標機來執(zhí)行。例如,用高級JavaTM程序設計語言所編寫的程序被編譯成低級字節(jié)碼指令。字節(jié)碼指令是用于JavaTM虛擬機的機器語言。Lindholm等人所著的“JavaTM虛擬機規(guī)范(The JavaTMVirtual Machine Specification)”(出版于1999年,Addison Wesley,第二版)中描述了JavaTM虛擬機規(guī)范。
典型的高級程序設計語言支持算術表達式。可操作一個或多個操作數(shù)的算術運算符定義了算術表達式。通常支持的運算符包括加法、減法、乘法、除法、求余、求反、移位、按位“或”、按位“與”、及按位“異或”。中間數(shù)值是一個或多個算術運算的結果。
高級程序設計語言通常還支持多重或n基數(shù)整數(shù)類型并且算術運算是超載的(overloaded)。超載允許運算符接收具有混合類型的操作數(shù)。例如JavaTM程序設計語言支持四種基本整數(shù)類型字節(jié)(byte)、短整數(shù)(short)、整數(shù)(int)及長整數(shù)(long)。這些類型分別支持8位、16位、32位及64位數(shù)值。諸如“+”運算符這樣的運算符可接收任何這些整數(shù)類型的運算符。下面的三個例子說明在具有混合基數(shù)類型的操作數(shù)上所操作的超載的“+”運算符。
int a,b;a+b;short a,b;a+b;byte a,b;a+b;這種超載是一般是通過將數(shù)值擴展到更寬的基數(shù)類型并隨后執(zhí)行算術運算來完成的。例如,C和JavaTM編譯器通常將字節(jié)類型和短整數(shù)類型的數(shù)值擴展到整數(shù)類型。在JavaTM語言中,整數(shù)類型一般是32位。因此,在執(zhí)行算術運算之前,短整數(shù)類型的16位數(shù)值和字節(jié)類型的8位數(shù)值被擴展到32位的整數(shù)類型。在JavaTM語言中,為每個上面所列的三個例子而生成了下述字節(jié)碼iload aiload biaddiload指令取任意的8、16或32位的變量并將32位的操作數(shù)放入堆棧。iadd指令將兩個32位的操作數(shù)彈出堆棧,將其相加并將32位的結果放回堆棧。
不同于JavaTM,一些高級程序設計語言只定義了整數(shù)類型間的關系,但是沒有定義每個類型的大小。例如,一個C編譯器廠商可將字節(jié)類型、短整數(shù)類型及整數(shù)類型的位長度分別定義為8、16和32位。然而,另一個C編譯器廠商可將相同類型的位長度分別定義為16、32和64位。而又有一種編譯器可將這些位長度分別定義為16、32和32位。在所有的情況下,每個類型的長度間的關系得到保持(由字節(jié)類型所表示的數(shù)值數(shù)目<由短整數(shù)類型表示的數(shù)值數(shù)目,由短整數(shù)類型表示的數(shù)值數(shù)目<由整數(shù)類型表示的數(shù)值數(shù)目),但是用于表示每種類型的位的實際數(shù)目是不同的。與JavaTM類似,但C以每個特定編譯器所定義的整數(shù)類型的大小來執(zhí)行算術操作。這需要將具有較小基數(shù)類型的數(shù)值擴展到整數(shù)類型。
這種類型擴展方法減少了機器指令的數(shù)目,因此減小了目標機的復雜性。然而,這種類型擴展方法通常需要更多的計算堆??臻g。例如,在兩個16位的短整數(shù)類型數(shù)值擴展成32位類型之后,將其相加所使用的堆??臻g與將兩個32位的整數(shù)類型數(shù)值進行相加所使用的堆??臻g相同,如圖2A和2B所示。
現(xiàn)在轉(zhuǎn)向圖2A,說明以JavaTM語言對兩個短整數(shù)類型的16位數(shù)值進行相加時堆棧使用的流程圖。在附圖標記20,取第一個16位的操作數(shù)并下推進入操作數(shù)堆棧。此時的操作數(shù)堆棧被標注為附圖標記30。在附圖標記22,所述第一個16位的操作數(shù)被擴展為32位。在附圖標記24,取第二個16位的操作數(shù)并下推進入操作數(shù)堆棧。在附圖標記26,所述第二個16位的操作數(shù)被擴展為32位。此時,操作數(shù)堆棧占用4×16=64位。在附圖標記28,利用32位的加運算符使這兩個32位的操作數(shù)相加。
轉(zhuǎn)向圖3A,介紹使兩個整數(shù)類型的32位數(shù)值相加時堆棧使用的流程圖。在附圖標記40,取第一個32位的操作數(shù)并下推進入操作數(shù)堆棧。圖3B說明了操作數(shù)堆棧。在附圖標記42,取第二個32位的操作數(shù)并下推進入操作數(shù)堆棧。在附圖標記44,利用32位的加運算符使這兩個32位的操作數(shù)相加。因此,在上述16位的加操作和32位的加操作的例子中,兩個32位操作數(shù)在被彈出堆棧之前,被下推進入到堆棧并利用32位加運算而進行相加。
在程序執(zhí)行過程期間,可改變堆棧的大小,其原因在于諸如嵌套過程調(diào)用的級別、計算表達式的復雜度及局部說明的變量這樣的因素。在像智能卡這樣的資源受限設備中,通常就沒有足夠內(nèi)存來執(zhí)行這些其中發(fā)生了類型擴展的計算。
與典型的臺式計算機和類似設備相比,資源受限設備一般被認為是在內(nèi)存和/或計算能力或速度上相對受限的設備。舉例來說,其它資源受限設備包括蜂窩式電話、邊界掃描(boundary scan)設備、現(xiàn)場編程(field programmable)設備、個人數(shù)字助理(PDA)和傳呼機以及其它微型或小體積設備。
智能卡是資源受限設備的其中一種類型,還被稱為智能化便攜式數(shù)據(jù)攜帶卡。智能卡由塑料或者金屬制成并具有電子芯片,電子芯片包括用于執(zhí)行程序的嵌入式微處理器或者微控制器和用于存儲程序和數(shù)據(jù)的存儲器。這些設備可能有信用卡大小,具有8位或者16位結構的計算機芯片。另外,這些設備的存儲能力通常有限。例如,某些智能卡的隨機存儲器(RAM)容量小于1K,只讀存儲器(ROM)和/或非易失性存儲器(例如電可擦除只讀存儲器(EEPROM))容量也有限。
另外,具有8位或16位體系結構的智能卡通常分別具有內(nèi)置的8位或16位算術運算。這樣,智能卡即通??蓤?zhí)行比32位運算更有效的8位或16位運算。對于已經(jīng)擴展到32位的數(shù)據(jù)執(zhí)行32位運算尤其低效。所以,像智能卡這樣的資源受限設備的有限體系結構和內(nèi)存,就使得要執(zhí)行其中數(shù)值已擴展到更大整數(shù)類型的程序成為不切實際的或不可能的。
JavaTM虛擬機指令集定義了一個算術指令集以處理字節(jié)類型、短整數(shù)類型和整數(shù)類型數(shù)值。字節(jié)類型和短整數(shù)類型變量在編譯期間被擴展到整數(shù)類型。相反,除了處理整數(shù)類型的指令系統(tǒng)之外,JavaCardTM(支持JavaTM編程語言的智能卡)虛擬機還定義了單獨的指令集以處理字節(jié)和短整數(shù)類型的變量。大多數(shù)Java CardTM應用程序都運行于短整數(shù)或字節(jié)整數(shù)類型的數(shù)據(jù)值之上。
在計算機工業(yè)中,日益趨向于支持為在內(nèi)存相對充足的臺式計算機上執(zhí)行而設計的高級計算機語言,使得相同的程序可在資源受限設備上運行,從而實現(xiàn)跨垂直平臺的互用性。這種跨垂直平臺的互用性要求用高級程序設計語言所編寫的程序在資源受限設備上運行時可獲得與他們將在內(nèi)存相對充足的設備上運行時相同的結果。例如,希望支持在各種平臺上——包括智能卡平臺、手提式設備、用戶設備、臺式計算機及超級計算機——執(zhí)行用JavaTM程序設計語言所編寫的程序。
因此,需要將程序表示(program representation)加以轉(zhuǎn)換,使得可利用較少的計算堆??臻g來執(zhí)行語義相等的數(shù)學表達式。此外,現(xiàn)有技術需要執(zhí)行這樣的轉(zhuǎn)換以增加執(zhí)行速度。
發(fā)明概要對算術表達式進行優(yōu)化的方法包括接收為具有第一基數(shù)(base)的第一處理器所定義的第一指令,第一指令包括一個運算符和至少一個操作數(shù),當所有的操作數(shù)都不可能進位溢出時或當運算符對溢出不敏感時,將第一指令轉(zhuǎn)換成為第二指令,該第二指令經(jīng)優(yōu)化用于具有第二基數(shù)的第二處理器,第二基數(shù)小于第一基數(shù),并且當至少一個操作數(shù)可能溢出或運算符對溢出敏感時,該第二基數(shù)轉(zhuǎn)換成第三指令的更寬基數(shù),該第三指令是所述溢出的源。用于對算術表達式進行優(yōu)化的裝置包括至少一個具有程序指令的存儲器以及至少一個處理器,該處理器被設置為利用程序指令以接收為具有第一基數(shù)的第一處理器所定義的第一指令,當所述至少一個中的每個操作數(shù)都不可能進位溢出時或當運算符對溢出不敏感時將第一指令轉(zhuǎn)換成第二指令,該第二指令經(jīng)優(yōu)化用于具有第二基數(shù)的第二處理器,第二基數(shù)小于第一基數(shù),并且當所述至少一個操作數(shù)可能溢出或運算符對溢出敏感時,該第二基數(shù)轉(zhuǎn)換成第三指令的更寬基數(shù),該第三指令是所述溢出的源。
附圖簡述圖1說明了對由高級語言所編寫的程序進行編譯的方框圖;圖2A說明了將兩個被擴展到32位的16位操作數(shù)進行相加時堆棧使用的流程圖;圖2B說明了將兩個被擴展到32位的16位操作數(shù)進行相加時堆棧使用的方框圖;圖3A說明了將兩個32位的操作數(shù)進行相加時使用堆棧的流程圖;圖3B說明了將兩個32位的操作數(shù)進行相加時使用堆棧的方框圖;圖4A說明了根據(jù)本發(fā)明的一個實施例將在資源受限設備上所執(zhí)行的算術表達式進行轉(zhuǎn)換的方框圖;圖4B說明了根據(jù)本發(fā)明的一個實施例對JavaTM類文件進行轉(zhuǎn)換的方框圖;圖5A說明了在臺式計算機上對兩個短整數(shù)類型的數(shù)值進行相加的代碼例子;圖5B說明了在資源受限設備上對兩個短整數(shù)類型的數(shù)值進行相加的代碼例子;
圖6A說明了在臺式計算機上對兩個短整數(shù)類型的數(shù)值進行相加并立即將結果進行類型轉(zhuǎn)換(casting)的代碼例子;圖6B說明了在資源受限設備上立即將結果進行類型轉(zhuǎn)換的代碼例子,該運算可能進位溢出。
圖7A在臺式計算機上對三個短整數(shù)類型的數(shù)值進行相加并立即將結果進行類型轉(zhuǎn)換的代碼例子;圖7B說明了在資源受限設備上通過可能溢出的運算來執(zhí)行不受操作數(shù)溢出作用的運算的代碼例子。
圖8A說明了在臺式計算機上對兩個短整數(shù)類型的數(shù)值進行相加并將結果除以短整數(shù)類型的數(shù)值的代碼例子;圖8B說明了在資源受限設備上通過可能溢出的運算來執(zhí)行受操作數(shù)溢出作用的運算的代碼例子。
圖9說明了根據(jù)本發(fā)明的一個實施例對n基數(shù)型算術表達式進行優(yōu)化的方法流程圖;圖10說明了根據(jù)本發(fā)明的一個實施例對n基數(shù)型算術表達式進行優(yōu)化的方法的詳細流程圖;圖11說明了根據(jù)本發(fā)明一個實施例的對指令進行轉(zhuǎn)換的流程圖;圖12A說明了根據(jù)本發(fā)明一個實施例的對目標指令進行轉(zhuǎn)換的流程圖;圖12B說明了根據(jù)本發(fā)明一個實施例的對初值指令進行轉(zhuǎn)換的流程圖;圖13說明了根據(jù)本發(fā)明一個實施例的對類型轉(zhuǎn)換指令進行轉(zhuǎn)換的流程圖;圖14說明了根據(jù)本發(fā)明一個實施例的對堆棧處理指令進行轉(zhuǎn)換的流程圖;圖15說明了根據(jù)本發(fā)明一個實施例的對算術表達式進行轉(zhuǎn)換的流程圖;圖16說明了根據(jù)本發(fā)明一個實施例的用于確定所優(yōu)化的指令類型的方法的流程圖;圖17說明了根據(jù)本發(fā)明一個實施例的用于確定結果類型及結果溢出的方法的流程圖18說明了根據(jù)本發(fā)明一個實施例的用于記錄返回點(rollbackpoint)的方法的流程圖;圖19說明了根據(jù)本發(fā)明一個實施例的用于返回轉(zhuǎn)換處理的方法的流程圖;圖20說明了根據(jù)本發(fā)明一個實施例的用于傳播(propagating)指令優(yōu)化結果的流程圖;圖21說明了根據(jù)本發(fā)明一個實施例的對來自不同控制路徑的轉(zhuǎn)換信息進行合并的流程圖;圖22A說明了根據(jù)本發(fā)明一個實施例的指令轉(zhuǎn)換的方框圖;圖22B說明了根據(jù)本發(fā)明一個實施例的指令轉(zhuǎn)換的方框圖。
具體實施方案詳述本領域普通技術人員會明白以下對本發(fā)明的描述僅是說明性的。對受益于本發(fā)明描述的技術人員來說,易于想到本發(fā)明的其它實施例。
本發(fā)明涉及計算機系統(tǒng)。尤其是,本發(fā)明涉及n基數(shù)類型算術表達式的優(yōu)化。本發(fā)明進一步涉及機器可讀介質(zhì),在其上存儲有(1)本發(fā)明的設計參數(shù)和/或(2)利用本發(fā)明在計算機上執(zhí)行運算的程序指令。這種介質(zhì)包括例如磁帶、磁盤、諸如CD ROM這樣的光學可讀介質(zhì)、以及諸如PCMCIA卡這樣的半導體存儲器。所述介質(zhì)還可采取諸如硬盤驅(qū)動或計算機RAM這樣較大的或固定的對象的形式。
與典型的臺式計算機和類似設備相比,資源受限設備一般被認為是在內(nèi)存和/或計算能力或速度上相對受限的設備。舉例來說,其它資源受限設備包括蜂窩式電話、邊界掃描設備、現(xiàn)場編程設備、個人數(shù)字助理(PDA)和傳呼機以及其它微型或小體積設備。本發(fā)明還可用在非資源受限的設備中。
為本說明的目的,術語“處理器”可用于指實體計算機或虛擬機。
現(xiàn)在轉(zhuǎn)向圖4A,提出了用于說明根據(jù)本發(fā)明的一個實施例,對在資源受限設備上所執(zhí)行的算術表達式進行轉(zhuǎn)換的方框圖。編譯器獲得用高級語言62所編寫的并將操作數(shù)擴展到更大整數(shù)類型的算術表達式60,生成更大基數(shù)類型的指令64以便在典型臺式機66上執(zhí)行。該更大基數(shù)類型指令64被優(yōu)化到語義相等的較小基數(shù)類型的指令68,以便在資源受限設備70上執(zhí)行。例如用短整數(shù)類型加指令來運算短整數(shù)類型操作數(shù),而結果是短整數(shù)類型。
根據(jù)本發(fā)明另一實施例,優(yōu)化到語義相等的較小基數(shù)類型的指令是適時(just-in-time)代碼生成器的一部分。就在第一次執(zhí)行一組指令之前,未優(yōu)化的指令被優(yōu)化為語義相等的較小基數(shù)類型的指令,以便在資源受限設備上執(zhí)行。隨后使用這組優(yōu)化指令來執(zhí)行同一組指令。
根據(jù)本發(fā)明另外一個實施例,當要求較大類型的指令64來保存算術指令的語義,而目標處理機不支持較大類型的指令時,該算術表達式即因不受支持而被拒絕。
現(xiàn)在轉(zhuǎn)向圖4B,提出了用于說明根據(jù)本發(fā)明的一個實施例對指令進行轉(zhuǎn)換的方框圖。JavaTM類文件72通過Java CardTM類文件轉(zhuǎn)換器74而被接收,該JavaTM類文件72包含具有32位操作數(shù)的指令。轉(zhuǎn)換器74生成優(yōu)化的指令76以在資源受限設備上執(zhí)行。所述優(yōu)化包括,舉例說明,提供較少的堆棧使用量、較小的程序長度以及更快的執(zhí)行。
目標機支持n型算術運算符。JavaTM虛擬機支持整數(shù)類型的運算符,而JavaTM虛擬機支持短整數(shù)類型的運算符并選擇性地支持整數(shù)類型的運算符。其它設備可能僅支持字節(jié)類型的算術運算,或所有的字節(jié)類型、短整數(shù)類型、整數(shù)類型的運算。通常在8位或16位處理器上執(zhí)行16位運算需要相對少的時間,而在相同處理器上執(zhí)行32位運算需要相對較多的時間。
因為在優(yōu)化時期內(nèi)不知道在算術操作中所使用的實際數(shù)值,優(yōu)化必須為每個操作數(shù)假定一個最壞情況的數(shù)值。根據(jù)輸入操作數(shù)的類型來確定每個操作數(shù)的最壞情況的數(shù)值。較小類型的運算可具有要求較大類型的表示或溢出到較大類型的結果。因此,根據(jù)本發(fā)明,算術運算符被分類成受溢出作用的運算符和具有產(chǎn)生溢出可能性的運算符。為了公開這個目的,溢出包括負值的下溢(underflow)。如果產(chǎn)生結果的運算符屬于可能會生成溢出到較大類型表示的一組運算符時,較小類型的運算結果被認為可能進位溢出。只要中間數(shù)值不被用作屬于受溢出作用的一組運算符的操作數(shù),即允許中間數(shù)值可能進位溢出。
具有產(chǎn)生溢出可能性的運算符包括加法、減法、乘法、除法、求反及左移位。表1給出了這些運算符的JavaTM字節(jié)碼。表1-具有溢出可能性的運算
表2給出了受溢出作用的運算符。受溢出作用的算術運算符包括除法、求余、求反、右移位及無符號右移位。受溢出作用的非算術運算符包括數(shù)組運算、轉(zhuǎn)換運算及比較運算。
表2-受溢出作用的運算
當表1的運算優(yōu)化為較小類型時,結果可溢出為較大類型。如果表達式的一個操作數(shù)是中間數(shù)值并包含可能溢出的數(shù)據(jù),那么在表2中具有一個運算符的表達式的結果會失去精確性。為了實現(xiàn)優(yōu)化并保存高級源代碼的語義,當結果輸入到表2中的一個運算時,必須利用明確的源級類型轉(zhuǎn)換(cast)來將可能的溢出校正為結果的類型。
如果表2中的任意一個運算的輸入操作數(shù)是表1中運算的結果并且不存在明確的高級源代碼類型轉(zhuǎn)換,則不可能發(fā)生優(yōu)化。這樣的錯誤優(yōu)化不能保證語義相等的結果。換句話說,為在資源受限設備上執(zhí)行而生成的被優(yōu)化代碼提供了與為臺式計算機而生成的非優(yōu)化代碼不同的結果。例如,溢出數(shù)據(jù)可存在于操作數(shù)的JavaTM32位表示中,但是不存在于Java CardTM16位表示中。
如果使用了具有較小類型的運算符,那么具有表1所列運算符的運算結果可導致溢出。圖5A-8B提供了將目標為臺式計算機平臺的指令優(yōu)化到目標為資源受限設備平臺的這些相關問題的例子。這些例子假定臺式計算機基于32位體系結構并具有相對充足的內(nèi)存。資源受限設備被假定基于具有相對較少內(nèi)存的16位體系結構。本領域普通技術人員可認識到本發(fā)明可用于具有不同體系結構的計算平臺。
圖5A-8B還使用帶符號數(shù)值。本領域普通技術人員也可認識到不管數(shù)值是帶符號還是不帶符號,溢出都可發(fā)生。
現(xiàn)在轉(zhuǎn)向圖5B,提出了一個代碼例子,該例子說明了在臺式計算機上對兩個短整數(shù)類型數(shù)值進行相加。數(shù)值“a”包括可由16位帶符號短整數(shù)類型所表示的最大數(shù)值。如上所述,即使數(shù)值是16位短整數(shù)類型數(shù)值,也使用整數(shù)類型加法。因此,在結果數(shù)值中存在從16位區(qū)域到32位區(qū)域的溢出,并且溢出的結果是生成了較大的32位正值。
現(xiàn)在轉(zhuǎn)向圖5B,提出了一個代碼例子,該例子說明了在如圖5A所示的資源受限設備上對相同的數(shù)值進行相加。因為運行是在資源受限設備上執(zhí)行的并且兩個數(shù)值都是16位短整數(shù)類型,對指令進行優(yōu)化以使用短整數(shù)類型加法,從而使用較少堆??臻g。然而,因為用16位加法代替了32位加法,加法在符號位產(chǎn)生溢出。盡管臺式計算機計算出數(shù)值32768,在資源受限設備實例中計算出的結果是-32768,一個負值。這個結果是不可接受的,因為它與臺式計算機的結果不同,阻止了跨多計算機平臺的互用性。
現(xiàn)在轉(zhuǎn)向圖6A,提出了一個代碼例子,該例子說明了對兩個相同的數(shù)值進行相加并立即對出現(xiàn)的結果進行類型轉(zhuǎn)換。這個例子與圖5A的例子相同,除了相加的結果被轉(zhuǎn)換為短整數(shù)類型。將類型轉(zhuǎn)換為短整數(shù)類型是對最重要的16位進行舍位(truncate),使之成為一個短整數(shù)類型數(shù)值并且符號延伸至32位數(shù)值。可能進位溢出的運算(加法運算)的結果經(jīng)類型轉(zhuǎn)換而成為短整數(shù)類型,從而消除了任何可能的溢出問題。圖6B說明了在資源受限設備上對圖6A所示的兩個相同的數(shù)值進行相加,這兩個相同的數(shù)值被表示為16位數(shù)值。臺式計算機和資源受限設備的結果數(shù)值相同。
現(xiàn)在轉(zhuǎn)向圖7A,提出了一個代碼例子,該例子說明了在臺式計算機上對三個短整數(shù)類型的數(shù)值進行相加。在這個例子中,整數(shù)類型加法被用于使16位的數(shù)值“a”和“b”相加,并將結果加到“c”上。最后的結果經(jīng)類型轉(zhuǎn)換成為短整數(shù)類型。
現(xiàn)在轉(zhuǎn)向圖7B,提出了一個代碼例子,該例子說明了在資源受限設備上執(zhí)行不受操作數(shù)溢出作用的運算的代碼例子,該操作數(shù)是由可能進位溢出的運算生成的。因為此例中所有數(shù)值都是16位短整數(shù)類型,短整數(shù)類型加法被用于所有的中間數(shù)值加法。如表1所示,加法運算符可能產(chǎn)生溢出,但是不受溢出的作用。因此“a”和“b”相加生成了可能進位溢出的數(shù)值。該數(shù)值被加到“c”上,生成了另一個可能進位溢出的數(shù)值。盡管第二個加運算包含可能進位溢出的一個操作數(shù)(a+b結果),該加運算不受進位溢出的操作數(shù)的作用。最后的結果經(jīng)類型轉(zhuǎn)換成為短整數(shù)類型,除去了來自加法運算的可能溢出。這樣,臺式計算機和資源受限設備的結果數(shù)值相同。
現(xiàn)在轉(zhuǎn)向圖8A,提出了一個代碼例子,該例子說明了在臺式計算機上對兩個短整數(shù)類型的數(shù)值進行相加并將結果除以短整數(shù)類型的數(shù)值。因為運行是在臺式計算機上執(zhí)行的,使用了整數(shù)類型運算。利用整數(shù)類型加法將數(shù)值“a”和“b”相加。中間數(shù)值除以“c”。
現(xiàn)在轉(zhuǎn)向圖8B,提出一個代碼例子,該例子說明了在資源受限設備上執(zhí)行受操作數(shù)溢出作用的運算的代碼例子,該操作數(shù)是由可能進位溢出的運算生成的。因為運行是在資源受限設備上執(zhí)行的,使用短整數(shù)類型運算。利用短整數(shù)類型加法將數(shù)值“a”和“b”相加。中間數(shù)值除以“c”。與圖7B中所用的加法運算符不一樣,這里運算符受到溢出作用,如表2所示。16位數(shù)值被認為是負值,因為設置了最高位。這樣,臺式計算機和資源受限設備實例即提供了不同結果,該結果未經(jīng)如圖6A-7B中所示程序的類型轉(zhuǎn)換修正。
根據(jù)本發(fā)明,根據(jù)操作數(shù)的類型,利用最佳的類型指令對算術表達式進行優(yōu)化。優(yōu)化處理一直進行,直到遇見可能溢出的問題。此時,算術表達式的輸入操作數(shù)被再次訪問并被轉(zhuǎn)換到下一級更大類型的指令。該處理重復執(zhí)行,直到選擇了指令的合適類型,使得臺式計算機上的算術表達式提供與具有優(yōu)化指令集的資源受限設備相同的結果。
在轉(zhuǎn)換處理期間保持幾個關系。這些關系涉及指令以及在目標機上執(zhí)行指令時所產(chǎn)生的數(shù)值。關系數(shù)據(jù)包括數(shù)值的實際上的和所希望的類型。關系數(shù)據(jù)還包括源指令,一旦在目標機上執(zhí)行該指令,則其將在目標機上產(chǎn)生數(shù)值。每個指令還被鏈接到其操作數(shù)關系數(shù)據(jù)。此外,結果的關系數(shù)據(jù)被鏈接到使用該結果的指令。每個關系數(shù)據(jù)還被鏈接到如在目標機上執(zhí)行則可導致溢出的指令(如果有的話)。該指令被稱為返回點。因為當可能進位溢出的數(shù)值由被對溢出敏感的運算符使用時會產(chǎn)生錯誤的最后結果,當轉(zhuǎn)換處理不能進一步進行時,將所生成的數(shù)值鏈接到可引起溢出的指令,這提供了返回到引起溢出問題的指令的途徑。
可進一步使用一個中間數(shù)值,作為后繼指令的操作數(shù)。如果中間數(shù)值可能進位溢出,則返回指令也在結果中傳播。在轉(zhuǎn)換表達式期間對此重復執(zhí)行。返回動作總是作用于中間數(shù)值(和操作數(shù)),并且返回到其中要求重新轉(zhuǎn)換的指令。以下討論用于確定返回指令的方法以及優(yōu)化的其它細節(jié)。
現(xiàn)在轉(zhuǎn)向圖9,提出了用于說明根據(jù)本發(fā)明的一個實施例對n基數(shù)型算術表達式進行優(yōu)化的方法流程圖。在附圖標記80,接收要轉(zhuǎn)換的指令。在附圖標記82,判斷是否任一個輸入操作數(shù)可能進位溢出。如果至少一個操作數(shù)可能進位溢出,在附圖標記84處判斷被轉(zhuǎn)換的指令是否對溢出敏感。在此所用的JAVATM字節(jié)碼列于表2。本領域普通技術人員會認識到,所列的受溢出作用的運算符隨不同的高級語言而變化,并且本發(fā)明同樣適用于其它語言。
在附圖標記86,如果被轉(zhuǎn)換的指令對溢出敏感,則轉(zhuǎn)換處理返回到為問題源的指令,并利用具有較寬基數(shù)的類型來轉(zhuǎn)換該指令。例如,8位字節(jié)類型可被加寬到16位字(word)類型,16位字類型可被加寬到32位字類型。將操作數(shù)加寬到更寬類型需要將后續(xù)操作數(shù)的指令加以轉(zhuǎn)換,以使用對應于更大類型的指令。
如果被轉(zhuǎn)換的指令不對溢出敏感,或者沒有輸入操作數(shù)可能進位溢出,在附圖標記88指令被轉(zhuǎn)換到最優(yōu)類型,以便在資源受限設備上執(zhí)行。在附圖標記90,判斷是否尚有更多指令要進行轉(zhuǎn)換。如果留有更多的指令,下一指令的轉(zhuǎn)換開始于附圖標記80。當最后的指令已經(jīng)轉(zhuǎn)換,則轉(zhuǎn)換處理在附圖標記90結束。
現(xiàn)在轉(zhuǎn)向圖10,提出了一個詳細的流程圖,該流程圖說明了根據(jù)本發(fā)明一個實施例對n基數(shù)型算術表達式進行優(yōu)化。在附圖標記100,產(chǎn)生轉(zhuǎn)換未完成的指示。在附圖標記102,產(chǎn)生應執(zhí)行第一指令轉(zhuǎn)換的指示。在附圖標記104,判斷指令轉(zhuǎn)換是否已完成。如果指令轉(zhuǎn)換已完成,在附圖標記106結束執(zhí)行。如果轉(zhuǎn)換沒有完成,在附圖標記108產(chǎn)生轉(zhuǎn)換完成的指示。在附圖標記110,獲得第一指令。在附圖標記112,判斷指令是否應被轉(zhuǎn)換。
如果指令應被轉(zhuǎn)換,在附圖標記114和116分別產(chǎn)生轉(zhuǎn)換未結束的指示和當前指令不應再次轉(zhuǎn)換的指示。在附圖標記118,指令被轉(zhuǎn)換為另一個被優(yōu)化的指令,以便用于具有較小基數(shù)類型的目標機。在附圖標記120,判斷在附圖標記118的轉(zhuǎn)換是否觸發(fā)了返回。如果返回被觸發(fā),在附圖標記122獲得返回點的指令并在附圖標記104重新開始返回點的指令的轉(zhuǎn)換。如果返回沒有被觸發(fā),在附圖標記124結果類型和所需類型進行匹配。在附圖標記126,轉(zhuǎn)換指令被傳播給每一控制路徑的后繼指令。
在附圖標記128,判斷是否留存更多指令。如果留存更多的指令,在附圖標記130獲得下一指令并在附圖標記112繼續(xù)執(zhí)行。當最后的指令已被轉(zhuǎn)換時轉(zhuǎn)換處理結束。
現(xiàn)在轉(zhuǎn)向圖11,提出了一個流程圖,該流程圖說明了根據(jù)本發(fā)明的一個實施例來轉(zhuǎn)換指令。在附圖標記140,判斷當前指令是否是算術指令。如果是算術指令,它在附圖標記142被轉(zhuǎn)換。類似地,在附圖標記146、150、154和158,分別進行堆棧處理、目標、類型轉(zhuǎn)換及轉(zhuǎn)換初值指令的轉(zhuǎn)換。在圖11中根據(jù)指令是否是算術、堆棧操作、類型轉(zhuǎn)換或初值指令的指令分類僅用于說明目的。本領域普通技術人員會認識到本發(fā)明可適用于許多其它的指令類型或分類。
現(xiàn)在轉(zhuǎn)向圖12A,提出了一個流程圖,該流程圖說明了根據(jù)本發(fā)明的一個實施例來轉(zhuǎn)換目標指令的方法。在JavaTM虛擬機指令集中,目標指令包括分支、轉(zhuǎn)換、數(shù)組存取、數(shù)組建立和變量存儲/輸入指令,以及計算機語言中的堆棧處理、類型轉(zhuǎn)換、初值指令或算術表達式之外的其它類型的敏感的非算術指令。
在附圖標記160,判斷所需的指令操作數(shù)的類型。在附圖標記162,判斷目標機所使用的操作數(shù)是否具有比所需的目標指令類型更小的類型。如果操作數(shù)具有比所需的更小的類型,在附圖標記164,返回具有較小類型的操作數(shù)的轉(zhuǎn)換處理。如果操作數(shù)不具有比所需的更小的類型,在附圖標記166,判斷操作數(shù)是否可能進位溢出。如果操作數(shù)由表1所列出的一個操作數(shù)來生成,或如果其由在操作數(shù)中傳播溢出的運算符來生成,則該操作數(shù)可能進位溢出。舉例來說,傳播溢出的運算符包括“與”、“或”及“異或”(xor)運算符。如果沒有可能進位溢出的操作數(shù),則在附圖標記167優(yōu)化指令。如果至少一個操作數(shù)可能進位溢出,在附圖標記164,返回具有較小類型的操作數(shù)的轉(zhuǎn)換處理。
現(xiàn)在轉(zhuǎn)向圖12B,提出了一個流程圖,該流程圖說明了根據(jù)本發(fā)明的一個實施例來轉(zhuǎn)換初值指令的方法。初值指令的例子包括取/載入指令及其它載入變量的指令。初值指令還包括方法調(diào)用(methodinvocation)指令,該指令返回方法結果(method result)。這些指令被稱為“初值”指令,因為該指令所產(chǎn)生的數(shù)值不是中間計算的結果。在附圖標記168,接收變量、返回的數(shù)值及常量的類型。在附圖標記169,根據(jù)變量或常量的類型來優(yōu)化初值指令。例如,為載入短類型的局部變量,iload指令被優(yōu)化為sload。
現(xiàn)在轉(zhuǎn)向圖13,提出了一個流程圖,該流程圖說明了根據(jù)本發(fā)明的一個實施例來轉(zhuǎn)換類型轉(zhuǎn)換指令的方法。類型轉(zhuǎn)換指令可將操作數(shù)轉(zhuǎn)換為更大類型或更小類型。例如,將32位整數(shù)類型轉(zhuǎn)換為16位短整數(shù)類型是將操作數(shù)轉(zhuǎn)換為較小的類型。類似地,將8位字節(jié)類型轉(zhuǎn)換為32位整數(shù)類型是將操作數(shù)轉(zhuǎn)換為較大的類型。在后面的類型轉(zhuǎn)換中,字節(jié)類型被稱為操作數(shù)類型,而整數(shù)類型被稱為目標類型。
在附圖標記170接收指令。在附圖標記172和174分別確定操作數(shù)類型及目標類型。如果操作數(shù)類型大于目標類型,則在附圖標記178將操作數(shù)類型變窄為目標類型。如果操作數(shù)類型小于目標類型,在附圖標記180判斷操作數(shù)是否可能進位溢出。如果操作數(shù)可能進位溢出,則在附圖標記182使轉(zhuǎn)換處理返回以修正類型。如果操作數(shù)進位不可能溢出,則在附圖標記184將操作數(shù)加寬到目標類型。
現(xiàn)在轉(zhuǎn)向圖14,提出了一個流程圖,該流程圖說明了根據(jù)本發(fā)明的一個實施例來轉(zhuǎn)換堆棧處理指令的方法。在JavaTM虛擬機指令集中,堆棧處理指令包括“復制”、“交換”及“彈出”指令。在附圖標記190接收指令。在附圖標記192判斷指令是否為復制指令。如果是復制指令,在附圖標記194判斷是否存在用于初始堆棧入口的返回點。如果初始堆棧入口不具有返回點,則在附圖標記196將用于復制的堆棧入口的返回點設置為初始堆棧入口的返回點。如果初始堆棧入口具有返回點,在附圖標記198,將用于復制的堆棧入口的返回點設置為初始堆棧入口的源指令。在附圖標記200,指令被轉(zhuǎn)換。
現(xiàn)在轉(zhuǎn)向圖15,提出了一個流程圖,該流程圖說明了根據(jù)本發(fā)明的一個實施例來轉(zhuǎn)換算術表達式的方法。在附圖標記210,判斷操作數(shù)是否可能進位溢出。如果操作數(shù)進位不可能溢出,在附圖標記212產(chǎn)生操作數(shù)不具有溢出可能的指示。如果操作數(shù)可能進位溢出,在附圖標記214判斷指令是否受溢出作用。如果指令不受溢出作用,在附圖標記216產(chǎn)生操作數(shù)具有溢出可能的指示。如果指令受溢出作用,在附圖標記218轉(zhuǎn)換返回到具有溢出的第一操作數(shù)。如果轉(zhuǎn)換沒有被返回,在附圖標記220確定優(yōu)化的指令類型,在附圖標記222優(yōu)化指令并在附圖標記224確定結果類型和結果溢出。
現(xiàn)在轉(zhuǎn)向圖16,提出了一個流程圖,該流程圖說明了根據(jù)本發(fā)明的一個實施例來確定優(yōu)化的指令類型的方法。在附圖標記230,接收至少一個操作數(shù)。在附圖標記232,所需的指令類型被設置為與操作數(shù)相關的最大類型。在附圖標記234,判斷任一個操作數(shù)是否具有比所需指令類型更小的類型。如果至少一個操作數(shù)具有比所需類型更小的類型,則在附圖標記236將該較小類型的操作數(shù)返回以修正類型。
現(xiàn)在轉(zhuǎn)向圖17,提出了一個流程圖,該流程圖說明了根據(jù)本發(fā)明的一個實施例來確定結果類型和結果溢出的方法。在附圖標記240,結果類型被設置為指令類型。在表3至10總結了Java CardTM結果類型和所返回的溢出指示。每一個表表示基于一個或多個操作數(shù)類型的結果類型和溢出指示。
表3-加法,乘法,減法
表4-除法
表5-左移位
表6-右移位
表7-求反
表8-無符號右移
表9-求余
表10-和、或、異或
圖17中使用Java CardTM結果類型和溢出指示僅用于說明目的。本領域普通技術人員會認識到本發(fā)明還適用于其它的具有其它類型的高級語言。
在附圖標記244,判斷是否可能由于使用更加優(yōu)化的指令而導致結果進位溢出。如果結果進位不可能溢出,在附圖標記246判斷任意操作數(shù)是否傳播溢出。如至少一個操作數(shù)傳播溢出或如結果可能進位溢出,在附圖標記248記錄結果的返回點并且在附圖標記250產(chǎn)生結果具有溢出可能的指示。
現(xiàn)在轉(zhuǎn)向圖18,提出了一個流程圖,該流程圖說明了根據(jù)本發(fā)明的一個實施例來記錄返回點的方法。在附圖標記260,判斷第一操作數(shù)是否具有與其有關的返回點。如果第一操作數(shù)具有與其相關的返回點,在附圖標記262將當前指令的返回點設置為該第一操作數(shù)的返回點。如果第一操作數(shù)不具有與其相關的返回點,在附圖標記264判斷第二操作數(shù)是否具有與其相關的返回點。如果第二操作數(shù)具有與其相關的返回點,在附圖標記266將指令的返回點設置為該第二操作數(shù)的返回點。如果兩者都不具有與其相關的返回點,則在附圖標記268將指令的返回點設置到用于第一操作數(shù)的源指令。
根據(jù)本發(fā)明的特定實施例,如圖18所示,“第一操作數(shù)”是指第一個被生成的操作數(shù)。將返回點設置為較老操作數(shù)的源指令可避免必須執(zhí)行較新操作數(shù)的額外的返回操作,因為修正與較老操作數(shù)相關的類型可修正被較新操作數(shù)隨后使用的類型。
現(xiàn)在轉(zhuǎn)向圖19,提出了一個流程圖,該流程圖說明了根據(jù)本發(fā)明的一個實施例來返回轉(zhuǎn)換處理的方法。在附圖標記270,優(yōu)先取得當前指令的轉(zhuǎn)換。在附圖標記272,判斷操作數(shù)是否具有返回點。如果操作數(shù)不具有返回點,在附圖標記276將返回指令設置為生產(chǎn)操作數(shù)的源指令。如果操作數(shù)具有返回點,在附圖標記274將返回指令設置到同一個返回點。在附圖標記278加寬返回指令的所需類型。在附圖標記280,產(chǎn)生返回點指令應被轉(zhuǎn)換的指示。在附圖標記282,在返回指令處重新進行轉(zhuǎn)換操作。在附圖標記284,根據(jù)新的所需類型而轉(zhuǎn)換返回指令。
現(xiàn)在轉(zhuǎn)向圖20,提出了一個流程圖,該流程圖說明了根據(jù)本發(fā)明的一個實施例來傳播指令優(yōu)化的結果。在附圖標記290,獲得后繼的指令。后繼指令是與當前指令處于相同控制路徑上的指令,并且在當前指令之后立即出現(xiàn)。本領域普通技術人員知道單一指令可以是許多控制路徑的一部分。
在附圖標記292,判斷后繼指令是否在轉(zhuǎn)換處理中經(jīng)過預先訪問。如果后繼指令曾經(jīng)被預先訪問,則在附圖標記294將用于后繼指令的轉(zhuǎn)換信息設置為與當前指令的轉(zhuǎn)換信息相等,并在附圖標記296產(chǎn)生后繼指令應被轉(zhuǎn)換的指示。該轉(zhuǎn)換信息可包括當前轉(zhuǎn)換點的運行狀態(tài)。例如,由當前或先前的指令所生成的數(shù)值尚未被使用。該數(shù)值將被用作控制路徑中后繼指令的操作數(shù)。對于每一個數(shù)值都記錄類型、源指令及返回點。如果后繼路徑已被預先訪問,在附圖標記298,記錄在后繼指令中的先前的轉(zhuǎn)換信息與當前的轉(zhuǎn)換信息合并。在附圖標記298,判斷該合并信息內(nèi)的數(shù)值是否已在附圖標記300被修改。如果數(shù)值已被修改,在附圖標記296產(chǎn)生后繼指令應被轉(zhuǎn)換的指示。對每一個后繼指令重復進行這一處理。
現(xiàn)在轉(zhuǎn)向圖21,提出了一個流程圖,該流程圖說明了根據(jù)本發(fā)明的一個實施例來合并不同控制路徑的轉(zhuǎn)換信息。在附圖標記310,比較兩個控制路徑的相應輸入,在附圖標記312,判斷相應輸入的類型是否不相同。如果類型不相同,在附圖標記314返回具有較小類型的輸入。對每個操作數(shù)重復進行這一處理。
現(xiàn)在轉(zhuǎn)向圖22,提出了一個流程圖,該流程圖說明了根據(jù)本發(fā)明的一個實施例的指令轉(zhuǎn)換。這表明本發(fā)明適用于可被優(yōu)化的算術表達式。圖22A說明了用于JavaTM表達式的轉(zhuǎn)換處理短整數(shù)c=(short)((short)(a+b)/c)其中數(shù)值a、b和c是短整數(shù)類型。在附圖標記316給出了這一表達式的JavaTM字節(jié)碼序列。
指令轉(zhuǎn)換開始于iload_a指令。與第一個、較小的類型相關的指令被用于載入指令和加指令。如表1所指定的,加法指令產(chǎn)生可能的溢出,但是在源級經(jīng)顯式(explicit)類型轉(zhuǎn)換成為短整數(shù)類型而消除了溢出的可能性。DIV 330指令受圖2所示的溢出的作用。然而,因為該顯式類型轉(zhuǎn)換,所以不存在可能的溢出。因此,不會有必要“返回”到加法操作以生成一個較大的類型。
為了進一步有助于理解本發(fā)明,參考圖10至21,對以上討論的實施例做更加詳細的說明。
iload是一個源指令。在附圖標記160,“a”操作數(shù)的所需類型是短整數(shù)類型。在附圖標記162,操作數(shù)“a”是短整數(shù)類型。在附圖標記166,操作數(shù)進位不可能溢出,因為它們被直接載入并因此而不會由生成溢出的運算所產(chǎn)生。因此,在附圖標記167,短整數(shù)類型指令被用于將iload指令轉(zhuǎn)換成sload_a指令。類似地,iload_b指令被轉(zhuǎn)換成sload_b指令。
接下來,處理iadd指令。因為iadd是可產(chǎn)生溢出的指令,在附圖標記210進行檢查以判斷其操作數(shù)是否可能進位溢出。直接載入兩個操作數(shù)以使其進位不可能溢出。此后在附圖標記220判斷優(yōu)化的結果類型。在附圖標記232,指令類型被設置為最大操作數(shù)類型。在這個實例中,最大操作數(shù)類型是短整數(shù)類型,因為操作數(shù)“a”和操作數(shù)“b”是短整數(shù)類型。因為兩個操作數(shù)的類型相同于指令類型,在附圖標記238返回作為指令類型的短整數(shù)類型。
接下來,在附圖標記222優(yōu)化指令。因為指令類型是短整數(shù)類型,優(yōu)化指令是“sadd”。接下來,在附圖標記224判斷結果類型和溢出指示。在附圖標記240,結果類型被設置為短整數(shù)類型,該類型為指令類型。此外,根據(jù)表3產(chǎn)生結果具有可能溢出的指示。因為結果包含可能的溢出,在附圖標記248記錄用于(a+b)結果的返回點。兩個操作數(shù)都沒有返回點時,使得在附圖標記268將用于結果的返回點設置為用于操作數(shù)“a”(第一操作數(shù))的源指令。在附圖標記250,產(chǎn)生結果具有可能溢出的指示。
接下來,處理i2s指令。在附圖標記176,將操作數(shù)類型(短整數(shù))與目標類型相比較(短整數(shù))。因為兩者類型相同,在附圖標記178將類型變窄為短整數(shù)類型,消除可能的溢出。
最后,處理istore_c指令。因為所需的類型是短整數(shù)類型并且操作數(shù)進位不會溢出,在附圖標記187將istore_c指令優(yōu)化到sstore_c指令。在附圖標記318給出了所轉(zhuǎn)換的字節(jié)碼。
現(xiàn)在轉(zhuǎn)向圖22B,提出了一個流程圖,該流程圖說明了根據(jù)本發(fā)明的一個實施例的指令轉(zhuǎn)換。這表明本發(fā)明適用于不可被優(yōu)化的算術表達式。經(jīng)轉(zhuǎn)換的代碼與未經(jīng)轉(zhuǎn)換的代碼仍然在語義上相等。圖22說明了用于JavaTM表達式的轉(zhuǎn)換處理短整數(shù)c=(short)((short)(a+b)/c)其中數(shù)值a、b和c是短整數(shù)類型。在附圖標記316給出了該表達式的JavaTM字節(jié)碼序列。
指令轉(zhuǎn)換開始于iload_a指令,如附圖標記322所示。與第一個較小的類型相關的指令被用于載入指令322、324和加指令326。如表1所指定的,加法指令326產(chǎn)生了可能的溢出,但是不需利用第二個較大的類型。然而,DIV 330指令受溢出的作用,表2表明了這點。因此,必須修正產(chǎn)生溢出問題的指令。通過“返回”到附圖標記322并使用第二個較大類型的用于操作數(shù)“a”的指令來解決這個問題。
在附圖標記332,第二次進行指令轉(zhuǎn)換,直到確定操作數(shù)“b”也必須被轉(zhuǎn)換成較大類型,需要再次返回為止。在附圖標記334指令轉(zhuǎn)換隨后第三次進行,直到確定用于操作數(shù)“c”的指令必須使用較大的類型為止。第三次執(zhí)行返回,在附圖標記336,操作數(shù)“c”的類型被修正并且在繼續(xù)進行了第四次轉(zhuǎn)換處理之后,結束該轉(zhuǎn)換處理。
為了進一步有助于理解本發(fā)明,參考附圖10至21,對以上所討論的圖22B的實例做更加詳細的說明。
iload_a、iload_b和iadd指令的初始轉(zhuǎn)換如前面實施例中所描述的進行。接下來在附圖標記167,iload_c指令被轉(zhuǎn)換成sload_c指令。隨后處理idiv指令。如表2所指定的,idiv是受溢出作用的指令?!癮+b”運算符具有溢出可能,因為它是由運算符“+”所生成的并且該運算符可產(chǎn)生如表1所示的溢出。因為至少一個運算符具有溢出可能,在附圖標記218執(zhí)行返回到具有溢出的第一操作數(shù)。
在附圖標記270,先取得當前指令的轉(zhuǎn)換。在附圖標記274,溢是與a+b操作數(shù)相關聯(lián),所以將返回點設置為a+b操作數(shù)的返回點。在附圖標記278,所需的返回指令的類型被從短整數(shù)類型加寬到整數(shù)類型。在附圖標記280,產(chǎn)生對返回指令進行轉(zhuǎn)換的指示。在附圖標記282,在iload_a指令處恢復轉(zhuǎn)換處理,該iload_a指令在先前被轉(zhuǎn)換成sload_a指令。在附圖標記284,轉(zhuǎn)換iload_a指令。
作為返回的結果,在附圖標記338處理iload_a指令。在附圖標記124,使結果類型和所需的類型進行匹配。因為結果類型是短整數(shù)類型而所需類型是整數(shù)類型,類型不匹配。于是,生成S2I指令以將短整數(shù)類型提升為整數(shù)類型。對iload_b指令和iadd指令繼續(xù)進行處理。在附圖標記210,iadd的操作數(shù)進位不可能溢出,所以在附圖標記220判斷優(yōu)化的結果類型。在附圖標記234,比較操作數(shù)類型。因為“a”操作數(shù)現(xiàn)在是整數(shù)類型而“b”操作數(shù)仍然是短整數(shù)類型,執(zhí)行“b”操作數(shù)的返回。在附圖標記276,返回指令被設置為iload_b指令340。在附圖標記278,所需的指令類型被設置為整數(shù)。在附圖標記280,產(chǎn)生轉(zhuǎn)換當前指令的指示。在附圖標記283和284,在iload_b指令處恢復轉(zhuǎn)換處理并且指令被轉(zhuǎn)換。
在附圖標記124,使結果類型和所需類型進行匹配。因為結果類型是短整數(shù)類型而所需類型是整數(shù)類型,類型不匹配。于是生成S2I指令以將短整數(shù)類型提升為整數(shù)類型。
接下來處理iadd指令。在第二次返回之后,沒有一個操作數(shù)具有溢出的可能。因此在附圖標記210產(chǎn)生操作數(shù)不可能進位溢出的指示并在附圖標記220確定優(yōu)化的指令類型。在附圖標記232,指令類型被設置為最大操作數(shù)類型。因為a+b操作數(shù)是整數(shù)類型并且“c”操作數(shù)是短整數(shù)類型,指令類型被設置為整數(shù)。因為“c”操作數(shù)類型不同于指令類型,在附圖標記236處執(zhí)行“c”操作數(shù)的返回。在附圖標記278,將返回指令的所需類型從短整數(shù)類型加寬到整數(shù)類型。在iload_c指令342處繼續(xù)轉(zhuǎn)換處理。
在附圖標記124,將結果類型和所需類型進行匹配。因為結果類型是短整數(shù)類型而所需類型是整數(shù)類型,類型不匹配。于是生成S21指令以將短整數(shù)類型提升為整數(shù)類型。
接下來,處理idiv指令。在附圖標記238,將優(yōu)化指令類型設置為整數(shù),因為兩個操作數(shù)都是整數(shù)類型。在附圖標記222,選擇整數(shù)類型指令(idiv)。圖22的附圖標記344表示最后的指令序列。
盡管以上就整數(shù)類型而對本發(fā)明進行了描述,但是本領域普通技術人員會認識到本發(fā)明還可應用于浮點算術表達式。另外,雖然就JavaCardTM技術而對本發(fā)明進行了說明,但本領域普通技術人員會認識到本發(fā)明還可適用于許多其它平臺。這些平臺包括,舉例來說,K虛擬機(KVM)技術,在太陽微系統(tǒng)公司(Sun Microsystem,Inc.)1999年6月8日出版的“K虛擬機(KVM)-白皮書”中描述了KVM技術。
本發(fā)明還可以用軟件或固件來實現(xiàn)。它也可用其它處理器以及可編程門陣列設備、專用集成電路(ASIC)、及其它硬件來實現(xiàn),這樣就描述了用于算術表達式的自適應優(yōu)化的新方法。統(tǒng)一類型的指令被轉(zhuǎn)換成語義相等的第二個較小的整數(shù)類型(具有較少的位數(shù))的類型指令,以便在資源受限設備上執(zhí)行,從而提供了相對高效的堆棧利用率并提高了執(zhí)行速度。盡管顯示并描述了本發(fā)明的實施例及應用,對受益于本說明的本領域普通技術人員來說顯而易見,在不脫離本發(fā)明基本原理的情況下能夠進行比以上所述更多的修改。因此本發(fā)明僅僅為所附權利要求的精神所限定。
權利要求
1.一種用于優(yōu)化算術表達式的方法,包括接收為為具有第一基數(shù)的第一處理器所定義的第一指令,所述指令包括一個運算符和至少一個操作數(shù);當所述至少一個操作數(shù)不可能進位溢出超出第二基數(shù)時,或當所述運算符對溢出不敏感時,將所述第一指令轉(zhuǎn)換成為具有該第二基數(shù)的第二處理器所優(yōu)化的第二指令,所述第二基數(shù)小于所述第一基數(shù);當所述至少一個操作數(shù)可能進位溢出超出所述第二基數(shù)時,并且當所述運算符對溢出敏感時,轉(zhuǎn)換成更寬基數(shù)的第三指令,該第三指令是與所述至少一個操作數(shù)相關的可能溢出的源,所述第三指令在先前已被優(yōu)化,所述更寬基數(shù)大于所述第二基數(shù)而小于或等于所述第一基數(shù)。
2.如權利要求1的方法,其中所述轉(zhuǎn)換成更寬基數(shù)進一步包括在所述轉(zhuǎn)換到更寬基數(shù)之前舍棄(discard)所述第三指令的先前轉(zhuǎn)換結果。
3.如權利要求1的方法,進一步包括拒絕(reject)不能在所述第二處理器上被優(yōu)化為較小基數(shù)的表達式。
4.如權利要求1的方法,其中所述轉(zhuǎn)換成更寬基數(shù)進一步包括當所述第二處理器不支持所述更寬基數(shù)時,拒絕所述第一指令。
5.如權利要求1的方法,其中所述第一指令是運算。
6.如權利要求1的方法,其中所述第一指令包括一個非運算的類型敏感型(rype-sensitive)指令。
7.如權利要求5的方法,進一步包括在對所述第一指令進行所述轉(zhuǎn)換之后,返回接收所述第一指令,直到為所述第一處理器所定義的全部指令被轉(zhuǎn)換為止。
8.如權利要求7的方法,進一步包括將每一個指令鏈接到所有控制路徑上的后繼的指令。
9.如權利要求8的方法,其中對所述第一指令進行的所述轉(zhuǎn)換進一步包括將每一個指令的結果鏈接到使用所述結果的所有指令上;如果所述轉(zhuǎn)換包括生成一個數(shù)值,則將所述數(shù)值鏈接到產(chǎn)生所述數(shù)值的指令;及如果所述數(shù)值可能進位溢出,則將所述數(shù)值鏈接到最初導致所述溢出的指令。
10.如權利要求1的方法,包括所述第一處理器包括JavaTM虛擬機;以及所述第二處理器包括JaVa CardTM虛擬機。
11.如權利要求1的方法,包括所述第一基數(shù)被所述第一處理器使用以執(zhí)行至少一個數(shù)據(jù)類型的算術運算,所述至少一個數(shù)據(jù)類型具有比所述第一基數(shù)的長度更小的長度;以及所述第二基數(shù)被第二處理器使用以執(zhí)行至少一個數(shù)據(jù)類型的算術運算,所述第二基數(shù)具有與所述至少一個數(shù)據(jù)類型相同的大小。
12.如權利要求1的方法,其中所述第一處理器由32位處理器構成;以及所述第二處理器由資源受限的(resorce-constrained)16位處理器構成。
13.如權利要求9的方法,其中所述第一基數(shù)被所述第一處理器使用以執(zhí)行至少一個數(shù)據(jù)類型的算術運算,所述至少一個數(shù)據(jù)類型具有比所述第一基數(shù)的長度更小的長度;以及所述第二基數(shù)被所述第二處理器使用以執(zhí)行至少一個數(shù)據(jù)類型的算術運算,所述第二基數(shù)具有比所述至少一個數(shù)據(jù)類型的長度更大的長度。
14.如權利要求13的方法,其中所述第一處理器由32位處理器構成;以及所述第二處理器由資源受限的16位處理器構成。
15.一種機器可讀的程序存儲設備,具體實施為可通過機器執(zhí)行的指令程序,用以執(zhí)行算術表達式的優(yōu)化,包括接收為具有第一基數(shù)的第一處理器所定義的第一指令,所述第一指令包括一個運算符和至少一個操作數(shù);當所述至少一個操作數(shù)不可能進位溢出超出第二基數(shù)時,或當所述運算符對溢出不敏感時,將所述第一指令轉(zhuǎn)換成為具有該第二基數(shù)的第二處理器所優(yōu)化的第二指令,所述第二基數(shù)小于所述第一基數(shù);以及當所述至少一個操作數(shù)可能進位溢出超出所述第二基數(shù)時,并且當所述運算符對溢出敏感時,轉(zhuǎn)換成更寬基數(shù)的第三指令,該第三指令是與所述至少一個操作數(shù)相關的可能溢出的源,所述第三指令在先前已被優(yōu)化,所述更寬基數(shù)大于所述第二基數(shù)而小于或等于所述第一基數(shù)。
16.如權利要求15的程序存儲設備,其中所述轉(zhuǎn)換成更寬基數(shù)進一步包括在所述轉(zhuǎn)換到更寬基數(shù)之前舍棄所述第三指令的先前轉(zhuǎn)換結果。
17.如權利要求15的程序存儲設備,進一步包括拒絕不能在所述第二處理器上被優(yōu)化為較小基數(shù)的表達式。
18.如權利要求15的程序存儲設備,其中所述轉(zhuǎn)換成更寬基數(shù)進一步包括當所述第二處理器不支持所述更寬基數(shù)時,拒絕所述第一指令。
19.如權利要求15的程序存儲設備,其中所述第一指令是運算。
20.如權利要求15的程序存儲設備,其中所述第一指令包括一個非運算的類型敏感型指令。
21.如權利要求19的程序存儲設備,進一步包括在對所述第一指令進行所述轉(zhuǎn)換之后,返回接收所述第一指令,直到為所述第一處理器所定義的全部指令被轉(zhuǎn)換為止。
22.如權利要求21的程序存儲設備,進一步包括將每一個指令鏈接到所有控制路徑上的后繼的指令。
23.如權利要求22的程序存儲設備,其中對所述第一指令進行的所述轉(zhuǎn)換進一步包括將每一個指令的結果鏈接到使用所述結果的所有指令上;如果所述轉(zhuǎn)換包括生成一個數(shù)值,則將所述數(shù)值鏈接到產(chǎn)生所述數(shù)值的指令;及如果所述數(shù)值可能進位溢出,則將所述數(shù)值鏈接到最初導致所述溢出的指令。
24.如權利要求15的程序存儲設備,其中所述第一處理器包括JavaTM虛擬機;以及所述第二處理器包括Java CardTM虛擬機。
25.如權利要求15的程序存儲設備,其中所述第一基數(shù)被所述第一處理器使用以執(zhí)行至少一個數(shù)據(jù)類型的算術運算,所述至少一個數(shù)據(jù)類型具有比所述第一基數(shù)的長度更小的長度;以及所述第二基數(shù)被第二處理器使用以執(zhí)行至少一個數(shù)據(jù)類型的算術運算,所述第二基數(shù)具有與所述至少一個數(shù)據(jù)類型相同的大小。
26.如權利要求15的程序存儲設備,其中所述第一處理器由32位處理器構成;以及所述第二處理器由資源受限的16位處理器構成。
27.如權利要求23的程序存儲設備,其中所述第一基數(shù)被所述第一處理器使用以執(zhí)行至少一個數(shù)據(jù)類型的算術運算,所述至少一個數(shù)據(jù)類型具有比所述第一基數(shù)的長度更小的長度;以及所述第二基數(shù)被所述第二處理器使用以執(zhí)行至少一個數(shù)據(jù)類型的算術運算,所述第二基數(shù)具有比所述至少一個數(shù)據(jù)類型的長度更大的長度。
28.一種用于算術表達式優(yōu)化的設備,包括至少一個具有程序指令的存儲器;以及至少一個處理器,其設置為使用該程序指令以執(zhí)行以下操作接收為具有第一基數(shù)的第一處理器所定義的第一指令,所述第一指令包括一個運算符和至少一個操作數(shù);當所述至少一個操作數(shù)不可能進位溢出超出第二基數(shù)時,或當所述運算符對溢出不敏感時,將所述第一指令轉(zhuǎn)換成為具有該第二基數(shù)的第二處理器所優(yōu)化的第二指令,所述第二基數(shù)小于所述第一基數(shù);以及當所述至少一個操作數(shù)可能進位溢出超出所述第二基數(shù)時,并且當所述運算符對溢出敏感時,轉(zhuǎn)換成更寬基數(shù)的第三指令,該第三指令是與所述至少一個操作數(shù)相關的可能溢出的源,所述第三指令在先前已被優(yōu)化,所述更寬基數(shù)大于所述第二基數(shù)而小于或等于所述第一基數(shù)。
29.如權利要求28的設備,其中所述至少一個處理器進一步被設置為使用該程序指令以在轉(zhuǎn)換到更寬基數(shù)之前舍棄所述第三指令的先前轉(zhuǎn)換結果。
30.一種用于算術表達式優(yōu)化的設備,包括裝置,用于接收為具有第一基數(shù)的第一處理器所定義的第一指令,所述第一指令包括一個運算符和至少一個操作數(shù);裝置,用于當所述至少一個操作數(shù)不可能進位溢出超出第二基數(shù)時,或當所述運算符對溢出不敏感時,將所述第一指令轉(zhuǎn)換成為具有該第二基數(shù)的第二處理器所優(yōu)化的第二指令,所述第二基數(shù)小于所述第一基數(shù);以及裝置,用于當所述至少一個操作數(shù)可能進位溢出超出所述第二基數(shù)時,并且當所述運算符對溢出敏感時,轉(zhuǎn)換成更寬基數(shù)的第三指令,該第三指令是與所述至少一個操作數(shù)相關的可能溢出的源,所述第三指令在先前已被優(yōu)化,所述更寬基數(shù)大于所述第二基數(shù)而小于或等于所述第一基數(shù)。
31.如權利要求30的設備,其中用于轉(zhuǎn)換成更寬基數(shù)的裝置進一步包括裝置,用于在所述轉(zhuǎn)換到更寬基數(shù)之前舍棄所述第三指令的先前轉(zhuǎn)換結果。
32.如權利要求30的設備,進一步包括裝置,用于將每一個指令鏈接到所有控制路徑上的后繼指令。
33.一種使用應用軟件程序的方法,該應用軟件程序包括對至少一個指令的算術表達式進行優(yōu)化,該至少一個指令以具有第一基數(shù)的處理器為目標,所述方法包括在一處理器上接收該軟件程序;以及在該處理器上執(zhí)行所述指令的序列。
34.如權利要求33的方法,進一步包括將至少一個指令存儲在資源受限設備(resource-constrained device)上。
35.一種具有嵌入其中的微控制器的智能卡,該智能卡包括由微控制器所操作的虛擬機,該虛擬機執(zhí)行包括多個先前被優(yōu)化的指令的軟件應用程序,所述虛擬機包括用于接收優(yōu)化指令的設備,該優(yōu)化指令在先前受到優(yōu)化以便在資源受限設備上執(zhí)行,以及用于執(zhí)行所述指令的設備。
全文摘要
用于優(yōu)化算術表達式的方法,包括接收為具有第一基數(shù)的第一處理器所定義的第一指令(80),第一指令(80)包括一個運算符和至少一個操作數(shù),當所有操作數(shù)進位不可能溢出(82)時或運算符對溢出不敏感時,將所述第一指令(80)轉(zhuǎn)換成為具有第二基數(shù)的第二處理器所優(yōu)化的第二指令(88),第二基數(shù)小于第一基數(shù),并且當至少一個操作數(shù)可能進位溢出并且運算符對溢出敏感時,轉(zhuǎn)換成更寬基數(shù)的第三指令(86),第三指令是溢出源。用于對算術表達式進行優(yōu)化的裝置包括至少一個具有程序指令的存儲器以及至少一個處理器,被設置為使用程序指令以接收為具有第一基數(shù)的第一處理器所定義的第一指令(80),第一指令(80)包括一個運算符和至少一個操作數(shù),當所述所有運算符進位不可能溢出(82)時或當運算符對溢出不敏感時,將所述第一指令(80)轉(zhuǎn)換成為具有第二基數(shù)的第二處理器所優(yōu)化的第二指令(88),第二基數(shù)小于第一基數(shù),并且當至少一個操作數(shù)可能進位溢出(84)時并且當運算符對溢出敏感時,轉(zhuǎn)換成更寬基數(shù)的第三指令(86),第三指令是溢出源。
文檔編號G06F9/45GK1421001SQ00818195
公開日2003年5月28日 申請日期2000年11月10日 優(yōu)先權日1999年11月12日
發(fā)明者陳志群, J·施瓦貝 申請人:太陽微系統(tǒng)公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
青铜峡市| 汉寿县| 县级市| 汉源县| 梅州市| 黄浦区| 秦安县| 无棣县| 建始县| 云南省| 瑞丽市| 遂平县| 怀来县| 古蔺县| 潜山县| 西盟| 西城区| 六盘水市| 滨海县| 长乐市| 溆浦县| 色达县| 吉林市| 福安市| 神木县| 佛坪县| 嘉鱼县| 确山县| 南陵县| 常山县| 鄯善县| 武义县| 东平县| 赞皇县| 老河口市| 久治县| 琼结县| 祥云县| 赤壁市| 枣强县| 白银市|