專利名稱:基于標(biāo)記的鏈接的制作方法
技術(shù)領(lǐng)域:
本發(fā)明一般涉及用于資源受限裝置如智能卡等的面向?qū)ο蟆⒔Y(jié)構(gòu)中性的程序。
背景技術(shù):
虛擬機(jī)是一種通過處理器執(zhí)行的軟件應(yīng)用程序或指令序列產(chǎn)生的抽象計(jì)算機(jī)。術(shù)語“結(jié)構(gòu)中性”指的是例如用JavaTM編程語言寫的程序,它們可以在具有各種不同計(jì)算機(jī)結(jié)構(gòu)的各種計(jì)算機(jī)平臺(tái)上通過虛擬機(jī)來執(zhí)行。這樣,例如在基于WindowsTM的個(gè)人計(jì)算機(jī)系統(tǒng)上執(zhí)行的虛擬機(jī)將使用與如在基于UNIXTM的計(jì)算機(jī)系統(tǒng)上執(zhí)行的虛擬機(jī)相同的指令組。虛擬機(jī)的指令序列的獨(dú)立平臺(tái)編碼的結(jié)果是一個(gè)或多個(gè)字節(jié)代碼流,其中每一個(gè)例如是一個(gè)字節(jié)長的數(shù)字代碼。
已經(jīng)在包括例如與網(wǎng)絡(luò)瀏覽器有關(guān)的應(yīng)用程序的許多應(yīng)用程序中使用了Java編程語言。
Java編程語言是面向?qū)ο蟮摹T谝粋€(gè)面向?qū)ο蟮南到y(tǒng)中,“類”描述了數(shù)據(jù)的集合和操作該數(shù)據(jù)的方法。與數(shù)據(jù)和方法一起的標(biāo)記描述了對(duì)象的狀態(tài)和性能。
Java編程語言也是可檢驗(yàn)的,以便在執(zhí)行以Java編程語言編寫的應(yīng)用程序之前,可以確定是否程序中的指令序列試圖處理那些用于字節(jié)代碼的類型不正確的數(shù)據(jù)或者是否程序的字節(jié)代碼指令的執(zhí)行將引起操作數(shù)堆棧的下溢或上溢。
JavaTM虛擬機(jī)執(zhí)行Java編程語言寫的虛擬機(jī)代碼并且被設(shè)計(jì)用于32位的結(jié)構(gòu)。然而,許多資源受限裝置如智能卡具有8位或16位的結(jié)構(gòu)。
智能卡也稱為智能便攜式數(shù)據(jù)攜帶卡,一般由塑料或金屬制成并且具有電子芯片,該芯片中包括用于執(zhí)行程序的嵌入式微處理器以及用于存儲(chǔ)程序和數(shù)據(jù)的存儲(chǔ)器。這種大小可與信用卡相似的裝置通常具有有限的存儲(chǔ)容量。例如,一些智能卡具有小于1千字節(jié)(1K)的隨機(jī)存取存儲(chǔ)器(RAM)以及有限的只讀存儲(chǔ)器(ROM),和/或非易失性存儲(chǔ)器如電擦除可編程只讀存儲(chǔ)器(EEPROM)。
一般地,在智能卡處理器上運(yùn)行的程序確定了該卡所提供的服務(wù)。隨著時(shí)間流逝,卡上的程序可能需要更新,例如為了增加新的功能或改進(jìn)現(xiàn)有的功能。為此,該卡應(yīng)該能夠接受可以替代其它程序的新程序。
執(zhí)行字節(jié)代碼的虛擬機(jī)(例如,完全的Java虛擬機(jī))通常要求相當(dāng)大的存儲(chǔ)量以加載字節(jié)代碼和解析標(biāo)識(shí)(reference)。特別地,在Java虛擬機(jī)中,符號(hào)標(biāo)識(shí)用于指出諸如類、方法和字段之類的程序元素。通過使用它的符號(hào)名來定位該元素可以解析這些程序元素的標(biāo)識(shí)。這種操作要求相當(dāng)大的隨機(jī)存取存儲(chǔ)器(RAM)。在只有較小RAM的環(huán)境中,這可能是不方便的。因?yàn)橹悄芸▽?duì)于成本是敏感的,它們依靠便宜的、低性能處理器和低容量存儲(chǔ)器裝置。因?yàn)槌杀竞凸β实脑蚴沟迷谶@種資源受限的計(jì)算機(jī)中配置低功率和低容量處理器以及存儲(chǔ)器組件,在這種資源受限裝置上操作Java虛擬機(jī)的能力是困難的但仍然是需要的。
發(fā)明概述一方面,一種方法將代碼下載到資源受限計(jì)算機(jī)。該代碼可分成具有至少一個(gè)可標(biāo)識(shí)項(xiàng)的至少一個(gè)包。該方法包括形成包;形成可標(biāo)識(shí)項(xiàng)到相應(yīng)標(biāo)記的映射;以及提供包和映射。
第二方面,一種方法將下載的代碼鏈接到資源受限計(jì)算機(jī)。該方法包括接收包;接收可標(biāo)識(shí)項(xiàng)到相應(yīng)標(biāo)記的映射;以及使用映射來鏈接包。
本發(fā)明的優(yōu)點(diǎn)可以包括下面的一個(gè)或多個(gè)。本發(fā)明通過唯一的標(biāo)記標(biāo)識(shí)符使用較小的存儲(chǔ)空間以有效地使用資源受限裝置上的資源。另外,本發(fā)明能夠鏈接和判定資源受限裝置上輸出項(xiàng)的標(biāo)識(shí)。經(jīng)過元數(shù)據(jù)文件如輸出文件,本發(fā)明允許將輸出元素公開。然而,能夠進(jìn)行的這種公開不能暴露專用的或?qū)S械脑睾托?yīng)用程序(applet)以及相關(guān)庫的細(xì)節(jié)。因此,許多分開的改進(jìn)的應(yīng)用程序可以加載到資源受限裝置并且相互共享它們的組件而不用考慮專用的保密信息。
另外,結(jié)構(gòu)中性的語言如Java的優(yōu)點(diǎn)是能夠在資源受限裝置上實(shí)現(xiàn),同時(shí)保留它的語義。標(biāo)記也可以用于內(nèi)部的或?qū)S玫脑?。這樣,標(biāo)記可以分配給專用的和包可視實(shí)例(instance)字段以及包可視虛擬方法。本發(fā)明在分配標(biāo)記上施加較少的限制,并且對(duì)于特定的應(yīng)用程序可以進(jìn)一步定義或優(yōu)化該標(biāo)記種類。這樣,本發(fā)明支持一次寫入并且可以在任何地方,甚至在資源限制裝置如具有有限存儲(chǔ)容量的智能卡上運(yùn)行的便攜的、結(jié)構(gòu)中性代碼。
圖1示出了將獨(dú)立于硬件平臺(tái)的代碼轉(zhuǎn)換和加載到智能卡。
圖2示出與圖1所示的智能卡進(jìn)行通訊的計(jì)算機(jī)系統(tǒng)。
圖3是說明內(nèi)部包相關(guān)性的示意圖。
圖4A和4B是說明兩個(gè)轉(zhuǎn)換器操作的示意圖。
圖5是說明解析靜態(tài)標(biāo)識(shí)的兩個(gè)包和包登記的示意圖。
圖6是結(jié)合圖5的包說明鏈接處理的流程圖。
圖7A-7I是說明不同的類、字段和方法標(biāo)識(shí)的示意圖。
圖8A-8I是說明用于分配標(biāo)記和支持表格的處理的流程圖。
圖9A-9C是說明用于判定實(shí)例字段和方法的標(biāo)記的處理流程圖。
詳細(xì)說明本發(fā)明描述了一種采用壓縮、保密格式表示用于面向?qū)ο蟪绦虻逆溄有畔⒌姆椒ā@眠@種方法,能夠在資源受限裝置上下載、鏈接和執(zhí)行所述程序。資源受限裝置一般認(rèn)為是在存儲(chǔ)器和/或計(jì)算功率或速度上受限制的裝置。雖然下面參照智能卡描述了特定的實(shí)現(xiàn),本發(fā)明也可以用于其它的資源受限裝置,包括但不限于蜂窩式電話、邊界掃描裝置、字段可編程裝置、個(gè)人數(shù)據(jù)輔助(PDA)和尋呼機(jī)、以及其它小型或微型裝置。在某些情況下,資源受限裝置可以具有小到1K的RAM或小到16K的ROM。類似地,某些資源受限裝置基于為小于32位設(shè)計(jì)的結(jié)構(gòu)。例如,能夠使用本發(fā)明的某些資源受限裝置基于8位或16位結(jié)構(gòu),而不是32位結(jié)構(gòu)。
參照圖1,對(duì)于資源受限裝置如智能卡40的小應(yīng)用程序的開發(fā)以類似于Java程序開發(fā)的方式開始。換句話說,開發(fā)器編寫一個(gè)或多個(gè)Java類并且采用Java編譯器來編譯源碼以產(chǎn)生一個(gè)或多個(gè)類文件10。例如在工作站上能夠使用模擬工具運(yùn)行、測試和調(diào)試小應(yīng)用程序以模仿卡40的環(huán)境。當(dāng)準(zhǔn)備將小應(yīng)用程序下載到卡40上時(shí),類文件10被轉(zhuǎn)換器14轉(zhuǎn)換成一個(gè)經(jīng)轉(zhuǎn)換的小應(yīng)用程序(CAP)文件16。轉(zhuǎn)換器14可以是由臺(tái)式計(jì)算機(jī)執(zhí)行的Java應(yīng)用程序。除了被轉(zhuǎn)換的類文件10以外,轉(zhuǎn)換器14可以接受一個(gè)或多個(gè)輸出文件12作為其輸入。輸出文件12包含用于通過轉(zhuǎn)換的類輸入的其它包內(nèi)容的命名或鏈接信息。
一般地,CAP文件16包括在單個(gè)Java包中定義的所有類和接口并且由一個(gè)8位字節(jié)流表示。所有的16位和32位參數(shù)都是分別通過讀取兩個(gè)或四個(gè)連續(xù)的8位字節(jié)來構(gòu)造的。除此以外,CAP文件16包括常數(shù)池組件(或“常數(shù)池”)18,該組件與方法組件20分開打包。常數(shù)池18可以包括不同類型的常數(shù),這些常數(shù)包括程序被鏈接或下載到智能卡40時(shí)或在智能卡執(zhí)行時(shí)判定的方法和字段標(biāo)識(shí)。方法組件20指定了下載到智能卡40并且隨后由智能卡執(zhí)行的應(yīng)用程序指令。
在轉(zhuǎn)換之后,CAP文件16可以存儲(chǔ)在計(jì)算機(jī)可讀介質(zhì)17上,如硬盤、軟盤、光存儲(chǔ)介質(zhì)、閃速(flash)設(shè)備或某些其它適當(dāng)?shù)慕橘|(zhì)上?;蛘哂?jì)算機(jī)可讀介質(zhì)可以采用載波形式,例如網(wǎng)絡(luò)數(shù)據(jù)傳輸或射頻(RF)數(shù)據(jù)鏈接。
然后CAP文件16可以通過外圍設(shè)備的卡接收裝置(CAD)24復(fù)制或傳送到終端22如臺(tái)式計(jì)算機(jī)。CAD 24允許在智能卡40上寫入和檢索信息。CAD 24包括一個(gè)可以插入智能卡40的卡插口(未示出)。一旦插入,連接器的觸點(diǎn)緊壓在智能卡40的表面連接區(qū)域上以提供功率并且允許與智能卡通訊,不過在其它實(shí)施方式中,也可以使用無接觸的通訊。終端22還包括安裝工具26,它將用于傳輸?shù)腃AP文件16加載到卡40上。智能卡40具有可以包括一組觸點(diǎn)的輸入/輸出(I/O)端口42,經(jīng)過這些觸點(diǎn)提供程序、數(shù)據(jù)和其它通訊。卡40還包括安裝工具46,用于接收CAP文件16的內(nèi)容和準(zhǔn)備在卡40上執(zhí)行的小應(yīng)用程序。安裝工具46可以例如通過Java程序?qū)崿F(xiàn)并且可以在卡40上執(zhí)行???0還具有存儲(chǔ)器,包括易失性存儲(chǔ)器如RAM50???0還具有ROM 52和非易失性存儲(chǔ)器如EEPROM 54。通過控制器44準(zhǔn)備的小應(yīng)用程序可被存儲(chǔ)在EEPROM 54中。
在一個(gè)特定實(shí)施方式中,小應(yīng)用程序通過在微處理器48上運(yùn)行的虛擬機(jī)49來執(zhí)行??杀环Q為Java卡虛擬機(jī)的虛擬機(jī)49不需要加載或操作CAP文件16。而是Java卡虛擬機(jī)49執(zhí)行先前作為CAP文件16部分存儲(chǔ)的小應(yīng)用程序代碼。Java卡虛擬機(jī)49和安裝工具46之間的功能劃分允許虛擬機(jī)和安裝工具都保持相對(duì)較小。
一般地,為資源受限平臺(tái)如智能卡40而編寫的實(shí)施方式和小應(yīng)用程序遵循Java平臺(tái)包的標(biāo)準(zhǔn)規(guī)則。在T.Lindholm等人的“Java虛擬機(jī)規(guī)范(1997)”和K.Arnold等人的“Java編程語言第二版(1998)”中描述了Java虛擬機(jī)和Java編程語言,在此將它們整個(gè)作為參考。用于智能卡平臺(tái)的應(yīng)用程序編程接口(API)類可以作為包括包標(biāo)示的Java源文件來寫,這里一個(gè)包包括了許多編譯單元并且具有唯一的名稱。包機(jī)構(gòu)用于識(shí)別和控制對(duì)于類、字段和方法的存取。Java卡API允許對(duì)于一個(gè)Java卡使能平臺(tái)所寫的應(yīng)用程序可以運(yùn)行在任何其它Java卡使能平臺(tái)上。另外,Java卡API兼容于正式的國際標(biāo)準(zhǔn)如ISO 7816以及業(yè)界特定的標(biāo)準(zhǔn)如Europay/MasterCard/Visa(EMV)。
雖然已將運(yùn)行在微處理器48上的虛擬機(jī)49作為一個(gè)在智能卡40上執(zhí)行字節(jié)代碼的實(shí)施例進(jìn)行了描述,但在其它實(shí)施例中,也可以使用專用集成電路(ASIC)或硬件和固件的組合來代替。
參照圖1,控制器44使用安裝工具46來接收CAP文件16的內(nèi)容和準(zhǔn)備處理器48執(zhí)行的小應(yīng)用程序。安裝工具46可以作為例如已經(jīng)適當(dāng)?shù)乇晦D(zhuǎn)換在智能卡40上執(zhí)行的Java程序來實(shí)現(xiàn)。在下面的描述中,假設(shè)控制器44包括在微處理器48上運(yùn)行的虛擬機(jī)程序49。虛擬機(jī)49不需要加載或操作CAP文件16。而是虛擬機(jī)49執(zhí)行CAP文件16中的小應(yīng)用程序代碼。虛擬機(jī)49和安裝工具46之間的功能劃分允許虛擬機(jī)和安裝工具都保持相對(duì)較小。在其它實(shí)施例中,控制器44可以是硬連線的,例如作為專用集成電路(ASIC)或者它可以作為硬件和固件的組合來實(shí)現(xiàn)。
可以用于其它資源受限裝置的智能卡平臺(tái)也支持動(dòng)態(tài)創(chuàng)建的對(duì)象,包括類實(shí)例和數(shù)組。一個(gè)類作為單個(gè)已有類的擴(kuò)展或子類被實(shí)現(xiàn)并且它的成員是方法以及稱為字段的變量。一種方法聲明(declare)將可以被調(diào)用和傳遞固定數(shù)量的值的可執(zhí)行代碼作為變元。類也可以實(shí)現(xiàn)Java接口。接口是標(biāo)識(shí)類型,它的成員是常數(shù)和抽象方法。虛擬機(jī)49可以包括解釋器或提供對(duì)運(yùn)行期(runtime)系統(tǒng)存取的本地實(shí)現(xiàn),該系統(tǒng)包括Java卡API和支持功能。
如圖2所示,計(jì)算機(jī)22備有用于接收圖1的卡40的卡接受裝置24。計(jì)算機(jī)22可以連接到與多個(gè)其它計(jì)算裝置,如服務(wù)器47通訊的網(wǎng)絡(luò)45。它可以使用卡配備裝置經(jīng)過網(wǎng)絡(luò)45將數(shù)據(jù)和軟件加載到智能卡上。這種特性的下載可以包括加載到智能卡的小應(yīng)用程序或其它程序以及根據(jù)電子商務(wù)和其它應(yīng)用所使用的數(shù)字兌付和其它信息。用于控制卡接受裝置和智能卡的處理元素的指令和數(shù)據(jù)可以存儲(chǔ)在易失性或非易失性存儲(chǔ)器或者可以經(jīng)過通訊鏈路例如作為包含指令和/或數(shù)據(jù)的載波直接接收。另外,例如網(wǎng)絡(luò)45可以是LAN或WAN如互聯(lián)網(wǎng)或其它網(wǎng)絡(luò)。
圖3是說明加載到智能卡40的一組程序包(包括應(yīng)用程序接口(API)和小應(yīng)用程序)之間典型的分層相關(guān)性的示意圖。應(yīng)用程序可以遞增地加載到智能卡40和鏈接到卡上執(zhí)行,使得除了出廠時(shí)所編的功能以外可以采用另外的性能來更新智能卡40的功能。在示意圖中,Java語言框架50和Java卡框架52存在于Java卡API級(jí)別上。在Java卡API級(jí)別以上是具有一個(gè)或多個(gè)定制框架54的定制API級(jí)別。定制框架54可以通過一個(gè)或多個(gè)加值提供者經(jīng)過不同的軟件開發(fā)包(SDK)來提供以擴(kuò)展現(xiàn)有的框架或其它的API。最高級(jí)是應(yīng)用級(jí),這里駐留不同的小應(yīng)用程序56、58和60。
如圖3所示,一個(gè)包可能取決于相同API級(jí)別的其它包或較低API級(jí)別的那些包。例如,小應(yīng)用程序58可以表示小應(yīng)用程序58中的程序元素并且Java卡框架52可以具有與Java語言框架50的相關(guān)性。另外,在定制API級(jí)別的定制框架54和小應(yīng)用程序58和60可以具有取決于Java卡框架52的標(biāo)識(shí)。接下來,小應(yīng)用程序56和58可以具有取決于定制框架54的標(biāo)識(shí)。小應(yīng)用程序56和定制框架54也可以取決于Java語言框架50。雖然圖3的例子示出了線性相關(guān)性,也可以使用適當(dāng)?shù)霓D(zhuǎn)換器14和安裝工具46來支持非線性相關(guān)性,如圓形的相關(guān)性。
從例如Java應(yīng)用程序到CAP文件74的一個(gè)類文件集合的轉(zhuǎn)換一般可能發(fā)生在臺(tái)式計(jì)算機(jī)上以備在智能卡40上安裝。臺(tái)式計(jì)算機(jī)22一般不像典型的智能卡40一樣是資源受限的。另外,轉(zhuǎn)換操作也可以在其它適當(dāng)?shù)钠脚_(tái)上進(jìn)行。
圖4A示出了用于轉(zhuǎn)換一個(gè)包的系統(tǒng),它可以定義一個(gè)準(zhǔn)備下載到智能卡40的小應(yīng)用程序或庫。轉(zhuǎn)換器72接收從一個(gè)或多個(gè)類文件70輸入的數(shù)據(jù),該文件定義小應(yīng)用程序的功能。轉(zhuǎn)換器72接著產(chǎn)生適用于下載的Java卡CAP文件74。
如下面更詳細(xì)描述的,CAP文件74包含輸出組件82用于判定其包中元素的標(biāo)識(shí),這里這些元素可以通過其它包來標(biāo)識(shí)。輸出組件82包含用于靜態(tài)項(xiàng)如類、方法和字段的入口。對(duì)于動(dòng)態(tài)項(xiàng)如實(shí)例字段、虛擬方法和接口方法的標(biāo)識(shí)不要求出現(xiàn)在輸出組件中,但可以根據(jù)下面描述的處理進(jìn)行控制。
在資源受限裝置中,為了表示項(xiàng)而使用的單代碼(Unicode)串占用了存儲(chǔ)器和處理器資源。代替這些單代碼串,輸出組件82將標(biāo)記、或簡單的唯一數(shù)值映射到CAP文件74中其它組件定義的特定元素上。用于表示輸出組件中這些元素的標(biāo)記值匹配于在相應(yīng)輸出文件80中公開的那些值。
更詳細(xì)地說,CAP文件74還具有標(biāo)題組件76、常數(shù)池78、方法組件80以及輸出組件82。常數(shù)池78通常包括一個(gè)或多個(gè)類、字段和方法標(biāo)識(shí),從而可以通過包的常數(shù)池78間接地進(jìn)行對(duì)程序元素或項(xiàng)的一般標(biāo)識(shí)。方法組件80包含由CAP文件74所表示的小應(yīng)用程序包實(shí)現(xiàn)的所有方法。方法標(biāo)識(shí)判定位于方法組件中的方法。類和靜態(tài)字段標(biāo)識(shí)分別判定在類組件和靜態(tài)字段組件中的位置。
輸出組件82包括一個(gè)或多個(gè)具有標(biāo)記值84和相應(yīng)的程序元素鏈接信息86的入口,該信息描述了在CAP文件A74定義的包中可以找到特定的程序元素。鏈接信息專用于CAP文件74的內(nèi)容,而不是特定卡上的內(nèi)部表示。因此,這個(gè)組件不描述專用卡的個(gè)人或保密信息。
轉(zhuǎn)換器72還可以在類文件轉(zhuǎn)換到CAP文件74期間產(chǎn)生輸出文件80。每個(gè)CAP文件產(chǎn)生一個(gè)輸出文件。輸出文件80典型地具有一個(gè)或多個(gè)具有用于CAP文件74中特定程序元素的符號(hào)名90及其相應(yīng)標(biāo)記值92的入口。輸出文件80提供關(guān)于類文件包的每個(gè)外部可存取程序元素的信息和可以通過第二個(gè)包參照(輸入)到第二CAP文件(下面進(jìn)一步描述)的CAP文件74中的程序信息。例如,輸出文件80包含一個(gè)Java包中定義的所有公共類和接口的標(biāo)識(shí)、以及在這些類和接口中定義的所有公開和受保護(hù)的字段和方法的標(biāo)識(shí)。輸出文件80還包含這些程序元素或項(xiàng)到標(biāo)記的映射,這些標(biāo)記可以隨后用于在包轉(zhuǎn)換期間將輸入項(xiàng)的名稱映射到標(biāo)記。輸出文件不暴露小應(yīng)用程序和相關(guān)庫的專用或?qū)S屑?xì)節(jié)。因此,不同的單獨(dú)開發(fā)的應(yīng)用程序可以加載到資源受限裝置并且相互共享它們的組件而不用考慮專用的保密信息。輸出文件80不暴露小應(yīng)用程序和相關(guān)庫的專用和專有元素和細(xì)節(jié),單獨(dú)開發(fā)的應(yīng)用程序可以加載到卡40并且相互共享它們的輸出元素而不用考慮專用的保密信息。
參照圖3和圖4A,如果一系列包含javacard.framework API 52的類文件70被轉(zhuǎn)換,則在轉(zhuǎn)換期間產(chǎn)生的輸出文件80允許其它被單獨(dú)轉(zhuǎn)換的小應(yīng)用程序知道使用哪個(gè)標(biāo)記來外部參照javacard.framework API 52的項(xiàng)。例如,如果小應(yīng)用程序參照框架類PIN,用于javacard.framework的輸出文件80包含用于類javacard.framework.PIN與它相應(yīng)標(biāo)記的入口。轉(zhuǎn)換器72將這個(gè)標(biāo)記放在新的小應(yīng)用程序的CAP文件的常數(shù)池中,以表示對(duì)一個(gè)框架中該類的未判定標(biāo)識(shí)。如下面進(jìn)一步解釋的,在小應(yīng)用程序執(zhí)行期間,該標(biāo)記可以用于定位框架API包的輸出組件78的標(biāo)識(shí)項(xiàng)以檢索元素鏈接信息。例如,一種方法的鏈接信息可以提供用于定位該包的方法組件80中包含的適當(dāng)方法的信息。
圖4B示出轉(zhuǎn)換類文件94第二個(gè)包的轉(zhuǎn)換器72,這里這些類文件94輸入來自第一個(gè)包70的類文件的元素(圖4A)。例如,第二個(gè)包可以是一組小應(yīng)用程序類,它例如取決于在先前轉(zhuǎn)換的javacard.framework庫包中包含的某些類(如上面參照圖4A描述的)。轉(zhuǎn)換器72接收從類文件94和從先前轉(zhuǎn)換包的一個(gè)或多個(gè)輸出文件80輸入的數(shù)據(jù)。轉(zhuǎn)換器72產(chǎn)生適用于下載到例如智能卡40的CAP文件100。
用于第二個(gè)包的CAP文件B 100包括具有小應(yīng)用程序類參照的所有包清單的輸入組件104。每個(gè)這種外部包標(biāo)識(shí)包括用于該包的內(nèi)部包標(biāo)記和外部唯一應(yīng)用程序標(biāo)識(shí)符(AID)之間的映射106。每個(gè)包標(biāo)記在CAP文件100的其它組件中用于以簡明的方式識(shí)別一個(gè)特定標(biāo)識(shí)的外部包,因此減少了表示小應(yīng)用程序的腳印(footprint)尺寸。
CAP文件100中還具有標(biāo)題組件102、輸入組件104和常數(shù)池108。常數(shù)池108包括一個(gè)或多個(gè)類標(biāo)識(shí)110,它采用相應(yīng)的包標(biāo)記和類標(biāo)記映射每個(gè)類標(biāo)識(shí),因此將特定的類映射到它相應(yīng)的外部包和該包內(nèi)的類上。下面進(jìn)一步描述這些標(biāo)記的使用。常數(shù)池108也可以包括一個(gè)或多個(gè)方法標(biāo)識(shí)112,它類似于采用相應(yīng)的包標(biāo)記、類標(biāo)記和方法標(biāo)記來映射每個(gè)方法標(biāo)識(shí)。常數(shù)池108還包括一個(gè)或多個(gè)字段標(biāo)識(shí)114,每個(gè)分別具有其包標(biāo)記、類標(biāo)記和字段標(biāo)記。
一般地,可以通過每個(gè)包的常數(shù)池108間接進(jìn)行對(duì)程序元素或項(xiàng)的標(biāo)識(shí)。對(duì)其它包中的項(xiàng)的標(biāo)識(shí)被稱為外部的,并且根據(jù)標(biāo)記來表示。對(duì)相同CAP文件中的項(xiàng)的標(biāo)識(shí)被稱為內(nèi)部的,并且可以根據(jù)標(biāo)記或以不同的內(nèi)部格式(如對(duì)于CAP文件內(nèi)位置的指針)來表示。例如,對(duì)于類的外部標(biāo)識(shí)110包括包標(biāo)記和類標(biāo)記。同時(shí),這些標(biāo)記規(guī)定某一外部包中的某一類。對(duì)于一個(gè)類的內(nèi)部標(biāo)識(shí)可以是對(duì)于CAP文件內(nèi)類結(jié)構(gòu)位置的指針。另一方面,外部標(biāo)記系統(tǒng)也可以內(nèi)部使用。外部標(biāo)識(shí)112-114表示靜態(tài)的類成員,字段或方法,具有包標(biāo)記、類標(biāo)記、以及用于靜態(tài)字段或靜態(tài)方法的標(biāo)記。對(duì)于靜態(tài)類成員的內(nèi)部標(biāo)識(shí)可以是對(duì)于CAP文件中項(xiàng)的位置的指針,但也可以使用標(biāo)記系統(tǒng)。對(duì)于實(shí)例字段、虛擬方法和接口方法的標(biāo)識(shí)包括類標(biāo)識(shí)和適當(dāng)類型的標(biāo)記。類標(biāo)識(shí)表明該標(biāo)識(shí)是外部的還是內(nèi)部的。
CAP文件的外部標(biāo)識(shí)可以在卡上從標(biāo)記形式解析為由Java卡虛擬機(jī)使用的內(nèi)部表示。標(biāo)記可以僅僅通過定義的包的上下文來判定。正如輸出文件從包的外部可視名稱映射到標(biāo)記,對(duì)卡上的每個(gè)包來說,都有一組用于從標(biāo)記映射到解析標(biāo)識(shí)的鏈接信息。以這種方式,轉(zhuǎn)換器97處理類文件92和輸出文件94,創(chuàng)建適用于將小應(yīng)用程序下載到資源受限裝置的圖像并解析對(duì)第一個(gè)包的標(biāo)識(shí)(鏈接)。
在圖4A和圖4B完成預(yù)處理之后,圖4B的CAP文件可以下載到智能卡40或包含圖4A的CAP文件的資源受限裝置上。圖5和圖6進(jìn)一步說明了基于標(biāo)記的鏈接如何用于智能卡40或小裝置上的靜態(tài)元素。靜態(tài)元素包括的元素的精確表示在轉(zhuǎn)換處理期間可以由轉(zhuǎn)換器識(shí)別。
在圖5中,包P2的圖像200已經(jīng)從例如CAP文件B 100加載到卡40上并且在執(zhí)行之前或執(zhí)行期間連接到先前的包P1。包P2 200的程序元素可以包括對(duì)外部包P1中的方法和其它數(shù)據(jù)的標(biāo)識(shí),該外部包P1已經(jīng)作為(CAP文件A 74的)卡40上的圖像174存在。除此以外,圖像174還包括標(biāo)題組件176、常數(shù)池178、方法組件180以及包含了對(duì)所有輸出靜態(tài)項(xiàng)185的標(biāo)記清單的輸出組件182。為了幫助解決對(duì)于外部包的標(biāo)識(shí),在卡40上創(chuàng)建包登記120以提供用于定位一個(gè)或多個(gè)外部包的信息,包括包P1的圖像174,它包含包P2的圖像200所需的特定方法。
除此以外,包P2的圖像200包括標(biāo)題組件202、輸入組件204、常數(shù)池208以及方法組件216,所有都對(duì)應(yīng)于CAP文件B 100中的相應(yīng)組件102、104、108和116。上面相對(duì)于CAP文件描述了這些組件的一般構(gòu)成。通常,方法組件216將包括程序標(biāo)識(shí)如“new”(218)、“invokestatic”(220)和“getstatic_b”(222)以及它們各自調(diào)用的類標(biāo)識(shí)、方法標(biāo)識(shí)和字段標(biāo)識(shí)。
圖6示出對(duì)圖5中的包P2 200的鏈接處理140。當(dāng)方法組件216中的執(zhí)行方法調(diào)用一種特定方法例如位于外部包(包1)的方法組件180中的方法T時(shí),要求鏈接(步驟142)。利用作為操作數(shù)提供給指令的索引,處理140定位和檢索常數(shù)池208中匹配的方法標(biāo)識(shí)212(步驟144)。如下面描述的,方法標(biāo)識(shí)包括用于定位外部包中該特定方法的包標(biāo)記、類標(biāo)記以及方法標(biāo)記。接著,處理140檢驗(yàn)輸入組件204以根據(jù)檢索的包標(biāo)記找出外部包P1唯一的AID(步驟146)。然后對(duì)包登記120進(jìn)行檢驗(yàn)以根據(jù)AID找出包P1的位置(步驟148)。一旦從包登記120中找到包P1的圖像174,就搜索圖像174的輸出組件182以定位具有特定的類標(biāo)記的類(步驟150)。然后通過搜索與步驟150找出的特定類有關(guān)的方法清單來找出所需方法例如方法T的程序鏈接信息,以定位具有特定的方法標(biāo)記的方法(這里方法標(biāo)記Y對(duì)應(yīng)于包P1 174的方法T)(步驟152)。最后,根據(jù)提供給輸出組件182中的方法的鏈接信息,確定方法組件180中特定的方法例如方法T的位置(步驟154)。
使用圖6的處理,可以將包下載到卡上并且準(zhǔn)備由虛擬機(jī)執(zhí)行。這個(gè)處理過程被稱為“安裝”??梢允褂锰幚砗玩溄硬僮鞔涡虿煌牟煌惭b處理(當(dāng)在卡上接收數(shù)據(jù)時(shí)和當(dāng)存儲(chǔ)它時(shí))。這些安裝處理可以根據(jù)卡上可利用的資源來優(yōu)化。在一個(gè)實(shí)施例中,沒有鏈接產(chǎn)生,這樣,當(dāng)數(shù)據(jù)被接收時(shí),它被立刻存儲(chǔ)。在代碼的解釋或執(zhí)行期間,發(fā)生外部標(biāo)識(shí)的解析。這樣,這個(gè)實(shí)施方式被用于較大的(較少限定)小裝置,因?yàn)樗械呐R時(shí)鏈接信息被永久地存儲(chǔ)在這個(gè)卡上。
如上面討論的,代替在Java類文件中使用的單代碼串,使用標(biāo)記來識(shí)別CAP文件的項(xiàng)和解析資源有限裝置上的標(biāo)識(shí)。API的標(biāo)記由API的開發(fā)器分配并且在用于該API的包輸出文件中公開。因?yàn)楣_了名稱到標(biāo)記的映射,API開發(fā)器可以選擇本發(fā)明限制內(nèi)的任何標(biāo)記序列。
同時(shí),圖5和圖6描述了對(duì)于靜態(tài)項(xiàng)即類、靜態(tài)字段和靜態(tài)方法的標(biāo)識(shí)的解析。這些項(xiàng)的實(shí)施方式在編譯和轉(zhuǎn)換期間是完全可定位的。相反,在編譯和轉(zhuǎn)換期間,對(duì)于實(shí)例字段、虛擬方法和接口方法的標(biāo)識(shí)并不靜態(tài)地限制于特定的實(shí)施方式。這些項(xiàng)要求僅僅在運(yùn)行時(shí)參照實(shí)例可用的附加信息。參照圖9A-9C描述了這些類型的標(biāo)識(shí)解析。
虛擬方法的標(biāo)記分配保留了面向?qū)ο蟮念悓哟蝺?nèi)的關(guān)系。虛擬方法和接口方法的標(biāo)記分別用作到虛擬方法表和接口方法表的索引。特定卡的平臺(tái)可以將標(biāo)記解析成對(duì)資源受限裝置VM的實(shí)現(xiàn)最為有用的內(nèi)部表示。
一些標(biāo)記可被解析為索引。例如,實(shí)例字段標(biāo)記可被解析為對(duì)類實(shí)例的索引。在這種情況下,標(biāo)記值可以與解析的索引值不同并且無關(guān)。
包中每一類型的項(xiàng)都具有其對(duì)該類型的標(biāo)記的不相關(guān)范圍。下面列出對(duì)于每一類型標(biāo)識(shí)的樣本標(biāo)記區(qū)域和分配規(guī)則。也可以制定其它的標(biāo)記區(qū)域和分配規(guī)則。
圖7A-7I是說明標(biāo)識(shí)表示的示意圖。圖7A-7C描述了輸入元素的標(biāo)識(shí),而圖7D-7I描述了內(nèi)部項(xiàng)的標(biāo)識(shí),其中一些也使用標(biāo)記。
圖7A示出了一個(gè)對(duì)外部類180的類標(biāo)識(shí)。圖7A的類標(biāo)識(shí)包括包標(biāo)記和類標(biāo)記。圖7B示出外部字段標(biāo)識(shí)的表示。外部字段標(biāo)識(shí)182包括包標(biāo)記、類標(biāo)記和字段標(biāo)記。圖7C示出外部方法標(biāo)識(shí)184的表示。外部標(biāo)識(shí)184包括包標(biāo)記、類標(biāo)記和方法標(biāo)記。應(yīng)該注意對(duì)于虛擬方法將方法標(biāo)記的高位設(shè)置為“0”。高位的設(shè)置表示該方法在定義的包之外是可存取的。高位可以是最高有效位,如一個(gè)字節(jié)的第7位、一個(gè)字的第15位或一個(gè)三字節(jié)單位的第23位。
設(shè)置包標(biāo)記的高位來表示一個(gè)輸入包。這用于區(qū)別外部和內(nèi)部標(biāo)識(shí)。如圖7D-7I所示,對(duì)內(nèi)部元素的標(biāo)識(shí)使其高位被設(shè)置為“0”。圖7D-7I的格式是在選定的情況下將標(biāo)記擴(kuò)展使用到內(nèi)部項(xiàng)的例子。
圖7D示出內(nèi)部類標(biāo)識(shí)186的表示。內(nèi)部類標(biāo)識(shí)186包括對(duì)于類組件中類信息結(jié)構(gòu)的偏置。圖7E示出用于內(nèi)部字段的靜態(tài)字段標(biāo)識(shí)188的表示。這樣,靜態(tài)字段標(biāo)識(shí)188包括一個(gè)被設(shè)置為“0”的字段和用于包括相對(duì)于靜態(tài)字段圖像中靜態(tài)字段的偏置的字段。圖7F是用于內(nèi)部方法的靜態(tài)方法標(biāo)識(shí)190的表示。靜態(tài)方法標(biāo)識(shí)190包括被設(shè)置為“0”的填充字段,以使該標(biāo)識(shí)具有與輸入方法標(biāo)識(shí)的大小相同的大小。靜態(tài)方法標(biāo)識(shí)190還包括提供與偏置相關(guān)的信息到方法組件的靜態(tài)方法的字段。
圖7G示出用于內(nèi)部字段的實(shí)例字段標(biāo)識(shí)192的表示。在圖7G中,實(shí)例字段標(biāo)識(shí)192包括對(duì)類組件中類信息結(jié)構(gòu)的偏置以及字段標(biāo)記。圖7H示出用于內(nèi)部方法的對(duì)公用或受保護(hù)方法的虛擬方法標(biāo)識(shí)194。虛擬方法標(biāo)識(shí)194包括對(duì)類組件中類信息結(jié)構(gòu)的偏置、一個(gè)被清零以表示外部可存取的虛擬方法和符合圖7C格式的字段。虛擬方法標(biāo)識(shí)194還包括方法標(biāo)記。
最后,圖7I示出對(duì)用于內(nèi)部方法的包可視方法的虛擬方法標(biāo)識(shí)196的表示。虛擬方法標(biāo)識(shí)196包括一個(gè)對(duì)于類信息結(jié)構(gòu)和類組件的偏置,一個(gè)被設(shè)置為“1”以表示標(biāo)識(shí)的范圍位于該包內(nèi)部的字段。標(biāo)識(shí)196還包括方法標(biāo)記。
圖8A-8I是說明用于分配標(biāo)記以及構(gòu)造虛擬方法表和接口方法表的處理流程圖。如上面討論的,這些處理可以由轉(zhuǎn)換器72完成?,F(xiàn)在參照圖8A,示出用于分配包標(biāo)記的處理230。一般地,來自CAP文件內(nèi)的包標(biāo)識(shí)被分配僅在CAP文件中使用的標(biāo)記。
處理230首先包含輸入包(步驟231)的清單。該清單可以是任何順序的。接著,處理230檢查輸入的包數(shù)量是否超過預(yù)定的閾值如127(步驟232)。在這種情況下,使用127這個(gè)限制來表示一個(gè)8位包標(biāo)記,其高位被保留。如果輸入包的數(shù)量超過預(yù)定的閾值如127,則處理失敗(步驟205)。
可替換地,處理230將當(dāng)前標(biāo)記值初始化為“0”(步驟233)。接著,處理230將當(dāng)前包初始化為清單中的第一個(gè)包(步驟234)。然后處理230檢查當(dāng)前的包是否為空(步驟235)。如果不是,則處理230將當(dāng)前標(biāo)記分配給當(dāng)前包(步驟236)。接著,處理230將當(dāng)前標(biāo)記值加1(步驟237),以及設(shè)置當(dāng)前包為清單中的下一個(gè)包(步驟238)。
從步驟235開始,在當(dāng)前包為空的情況下,表示沒有更多的輸入包,處理230將標(biāo)記記錄在輸入組件中(步驟239)并退出。對(duì)于輸入包中項(xiàng)的標(biāo)識(shí)使用記錄在輸入組件中的標(biāo)記值。
現(xiàn)在轉(zhuǎn)到圖8B,示出了用于分配類和接口標(biāo)記的處理240。處理240首先獲得一個(gè)公共類和接口的任意排序的清單(步驟241)。接著,它檢查是否類和接口的數(shù)量超過預(yù)定值如256,256是可以用8位表示的最大的類數(shù)量(步驟242)。如果是這樣,處理240失敗(步驟205)??商鎿Q地,處理240將當(dāng)前標(biāo)記值初始化為“0”(步驟243)。它也將當(dāng)前項(xiàng)初始化到在步驟241獲得的清單中的第一類或接口(步驟244)。接著,處理240確定當(dāng)前項(xiàng)是否為空,即表示不再有類或接口保留在清單中(步驟245)。如果不是,處理240分配當(dāng)前標(biāo)記值給當(dāng)前項(xiàng),當(dāng)前項(xiàng)可以是一個(gè)類或一個(gè)接口項(xiàng)(步驟246)。接著,在返回步驟245之前,處理240將當(dāng)前標(biāo)記值加1(步驟247)并且設(shè)置當(dāng)前項(xiàng)為清單中的下一類或接口(步驟248)。從步驟245開始,在當(dāng)前項(xiàng)為空的情況下,即表示在清單中沒有類或接口存在,處理240將標(biāo)記值記錄在輸出組件表中(步驟249)。另外,處理240公開輸出文件中的標(biāo)記值(步驟251)并退出。
圖8C-1和圖8C-2處理靜態(tài)字段標(biāo)記,圖8C-2是內(nèi)嵌編譯時(shí)間常數(shù)的圖8C-1的最佳版本。包中的外部可視靜態(tài)字段被分配公開標(biāo)記。包可視的和專用的靜態(tài)字段沒有被分配標(biāo)記。圖8C-2描述了處理250優(yōu)化的處理280。在這個(gè)優(yōu)化中,沒有為被初始化成編譯時(shí)間常數(shù)的最后靜態(tài)字段分配標(biāo)記。在這種情況下,字段沒有鏈接到卡上。
現(xiàn)在轉(zhuǎn)到圖8C-1,示出了用于分配公共類或接口中的靜態(tài)字段標(biāo)記的處理250。處理250首先獲得公共類或接口中的公共和保護(hù)靜態(tài)字段的任意排序清單(步驟252)。然后處理250設(shè)置當(dāng)前標(biāo)記值為“0”(步驟254)并且將當(dāng)前字段初始化為清單中的第一個(gè)靜態(tài)字段(步驟256)。然后處理225確定當(dāng)前字段是否為空,即表示沒有剩余字段(258)。如果不是,處理250將當(dāng)前標(biāo)記值分配給當(dāng)前字段(步驟260)并且將當(dāng)前標(biāo)記值加1(步驟262)。然后在處理250返回步驟258之前,它設(shè)置當(dāng)前字段為清單中的下一個(gè)靜態(tài)字段(步驟264)。
從步驟258開始,在當(dāng)前字段為空,即表示沒有剩余字段的情況下,處理250確定是否當(dāng)前標(biāo)記大于預(yù)定的值如255,255是可以用8位表示的最大的標(biāo)記數(shù)(步驟266)。如果是這樣,處理250失敗(步驟205)。可替換地,如果將生成輸出組件,處理250將標(biāo)記值記錄在輸出組件表中(步驟268)。最后,處理250公開輸出文件中的標(biāo)記值(步驟270)。
現(xiàn)在參照圖8C-2,示出了對(duì)公共類或接口中靜態(tài)字段標(biāo)記的分配優(yōu)化的處理280。通過去除編譯時(shí)間常數(shù)和將標(biāo)識(shí)代替直接插入在字節(jié)代碼中的常數(shù),該最優(yōu)化減少了存儲(chǔ)器占用。處理280獲得公共類或接口中公共和保護(hù)靜態(tài)字段的清單(步驟282)。然后處理280設(shè)置當(dāng)前的標(biāo)記值為“0”(步驟284)并且將當(dāng)前字段初始化為清單中第一個(gè)靜態(tài)字段(步驟286)。然后處理280檢查是否當(dāng)前字段是空的(沒有字段)(步驟288)。如果不是,處理280確定是否當(dāng)前字段是編譯時(shí)間常數(shù)(步驟290)。如果是這樣,處理280分配一個(gè)值如0xFF的值作為當(dāng)前字段的標(biāo)記值(步驟296)。另一方面,如果當(dāng)前字段不是編譯時(shí)間常數(shù),則處理280將當(dāng)前標(biāo)記值分配給當(dāng)前字段(步驟292)并且將當(dāng)前標(biāo)記值加1(步驟294)。從步驟294和296開始,在循環(huán)回步驟288以繼續(xù)處理標(biāo)記之前,處理280隨后設(shè)置當(dāng)前字段為清單中下一個(gè)靜態(tài)字段(步驟298)。
從步驟288開始,在當(dāng)前字段是空的(沒有字段)情況下,該處理檢查是否當(dāng)前標(biāo)記超過預(yù)定的閾值如255,該值是使用8位能夠表示的最大數(shù)(步驟300)。如果是這樣,處理280失敗(步驟205)。另一方面,如果輸出,則處理280將標(biāo)記值記錄在輸出組件上(步驟302)。然后該處理公開具有編譯的時(shí)間常數(shù)的輸出文件的標(biāo)記值(步驟304)使得標(biāo)識(shí)包能夠在退出之前直接插入相應(yīng)的值。
現(xiàn)在轉(zhuǎn)到圖8D,示出了用于分配公共類中靜態(tài)方法標(biāo)記的處理310。處理310首先獲得公共類中公共和保護(hù)靜態(tài)方法以及構(gòu)造器的清單(步驟312)。然后處理310檢查是否靜態(tài)方法的數(shù)量超過預(yù)定值如256(步驟314)。如果沒有,該處理設(shè)置標(biāo)記值為“0”(步驟316)并且將當(dāng)前方法初始化為清單的第一個(gè)靜態(tài)方法(步驟318)。接著,處理310檢查是否當(dāng)前方法是空的(沒有方法)(步驟320)。如果不是,處理310將當(dāng)前標(biāo)記值分配給當(dāng)前靜態(tài)方法(步驟322)并且將當(dāng)前標(biāo)記值加1(步驟324)。然后在環(huán)返回步驟320之前,處理310設(shè)置當(dāng)前方法為清單中下一個(gè)靜態(tài)方法(步驟326)。
從步驟320開始,如果當(dāng)前方法是空的(沒有方法),則該處理將標(biāo)記值記錄在輸出組件(步驟328)并且在退出之前公開輸出文件中的標(biāo)記值(步驟330)。
圖8E-1和圖8E-2涉及實(shí)例字段分配方案。圖8E-1示出分配字段標(biāo)記的一般處理,而圖8E-2是一個(gè)優(yōu)化的處理,它將標(biāo)記分配擴(kuò)展到內(nèi)部(或包可視和專用的)字段、類型標(biāo)識(shí)的組字段并且允許將標(biāo)記容易地映射到實(shí)例內(nèi)的偏置。
現(xiàn)在轉(zhuǎn)到圖8E-1,示出了用于分配公共類中實(shí)例字段標(biāo)記的處理340。首先,處理340獲得公共類中公共和保護(hù)實(shí)例字段的清單(步驟342)。然后它檢查是否實(shí)例字段的數(shù)量超過預(yù)定的值如256(步驟344),如果是這樣,則處理失敗(步驟205)。另一方面,處理340設(shè)置當(dāng)前標(biāo)記值為“0”(步驟346)并且將當(dāng)前字段初始化為清單中第一個(gè)字段(步驟348)。接著,處理340檢查是否當(dāng)前字段是空的(步驟350)。如果不是,處理340將當(dāng)前標(biāo)記值分配給當(dāng)前實(shí)例字段(步驟352)并且將當(dāng)前標(biāo)記值加1(步驟354)。從步驟354開始,在循環(huán)回到步驟350之前,該處理設(shè)置當(dāng)前字段為清單中下一個(gè)實(shí)例字段(步驟360)。從步驟350開始,在當(dāng)前字段是空的情況下,處理340公開輸出文件中的標(biāo)記值(步驟362)并且退出。
在優(yōu)化圖8E-1的一般方法中可以考慮各種因素。一般地,標(biāo)記的排序是靈活的,使得標(biāo)記安排可以適用于特定的實(shí)現(xiàn)。圖8E-2描述了如下面例子中示出的限定分配方案
現(xiàn)在參照圖8E-2,示出了用于上面實(shí)例字段標(biāo)記分配優(yōu)化的處理370。如上所述,處理370獲得類中所有實(shí)例字段的清單(步驟372)。接著,處理370檢查是否編號(hào)的實(shí)例字段超過預(yù)定的值如256(步驟374)。如果是這樣,處理370失敗(步驟205),而如果不是這樣,處理370將清單分類為包括首先是公共和保護(hù)原語類型、其次是公共和保護(hù)標(biāo)識(shí)類型、再其次是包和原語標(biāo)識(shí)類型、最后是包和專用的原語類型的種類(category)(步驟376)。標(biāo)記值被設(shè)置為“0”(步驟378)并且當(dāng)前字段被初始化為清單的第一個(gè)實(shí)例字段(步驟380)。接著,處理370檢查是否當(dāng)前字段是空的(步驟382)。如果不是,該處理將當(dāng)前標(biāo)記值分配給當(dāng)前字段(步驟384)并且將當(dāng)前標(biāo)記值加1(步驟386)。然后處理370確定是否當(dāng)前字段是整數(shù)類型(步驟388)。整數(shù)類型占用兩個(gè)時(shí)隙以允許標(biāo)記容易地映射到實(shí)例。如果是這樣,當(dāng)前標(biāo)記值加1(步驟390)。從步驟388或從步驟390開始,在循環(huán)回步驟382之前,處理370將當(dāng)前字段設(shè)置為清單中下一個(gè)實(shí)例字段(步驟392)。
從步驟382開始,如果當(dāng)前字段是空的,則在退出之前處理370公開輸出文件中公共和保護(hù)實(shí)例字段的標(biāo)記值(步驟394)。
圖8F-1和圖8F-2分配虛擬方法的標(biāo)記。圖8F-1示出用于虛擬方法標(biāo)記分配的一般方案,而圖8F-2將標(biāo)記分配擴(kuò)展到包可視虛擬方法。
現(xiàn)在參照圖8F-1和圖8F-2,示出了用于分配虛擬方法標(biāo)記的處理。一般地,在包中定義的虛擬方法被分配為可輸出的或內(nèi)部標(biāo)記??奢敵龅臉?biāo)記分配給公共和保護(hù)的虛擬方法;在這種情況下,該標(biāo)記的高位是“0”。內(nèi)部標(biāo)記分配給包可視虛擬方法;在這種情況下標(biāo)記的高位是“1”。因?yàn)楦呶槐槐A?,所以這些標(biāo)記的區(qū)域范圍從0到127。
用于類中外部可視引入的虛擬方法的可輸出標(biāo)記是從大于該類的超級(jí)類(superclass)的最高編號(hào)的可輸出虛擬方法標(biāo)記的那一個(gè)開始連續(xù)編號(hào)的。如果一種方法優(yōu)于該類的超級(jí)類中實(shí)現(xiàn)的方法,則該方法使用如超級(jí)類中相應(yīng)方法的相同的標(biāo)記號(hào),使得該占優(yōu)的方法可以被識(shí)別為相關(guān)于它們優(yōu)于的方法。
內(nèi)部虛擬方法標(biāo)記的分配不同于可輸出的虛擬方法標(biāo)記。如果在相同包中定義一個(gè)類和它的超級(jí)類,則用于該類中包可視的引入虛擬方法的標(biāo)記從大于該類的超級(jí)類的最高編號(hào)的內(nèi)部虛擬方法標(biāo)記的那一個(gè)開始連續(xù)編號(hào)。如果在不同的包中定義該類和它的超級(jí)類,則用于該類中包可視引入虛擬方法的標(biāo)記從“0”開始連續(xù)編號(hào)。如果該方法優(yōu)于類的超級(jí)類中實(shí)現(xiàn)的方法,則該方法使用如超級(jí)類中相應(yīng)的方法的相同標(biāo)記號(hào)碼。對(duì)于背景信息,Java編程語言的定義規(guī)定如果在相同的包中定義類和它的超級(jí)類,則優(yōu)于包可視虛擬方法才是可能的。包含虛擬方法標(biāo)記的字節(jié)的高位總是被設(shè)置為“1”,以表示它是內(nèi)部標(biāo)記。沒有規(guī)定類中引入的包虛擬方法標(biāo)記的排序。
在圖8F-1中,處理400首先獲得一個(gè)類中公共和保護(hù)虛擬方法的清單(步驟402)。然后處理400檢查是否該類具有超級(jí)類(步驟404)。如果是這樣,處理400進(jìn)一步檢查是否超級(jí)類在相同的包中(步驟406)。從步驟406開始,在超級(jí)類在相同包中的情況下,該處理找出超級(jí)類(步驟408)并且獲得該超級(jí)類的虛擬方法和標(biāo)記(步驟412)。虛擬方法的集合包括定義該類所有超級(jí)類的那些內(nèi)容。從步驟406開始,在超級(jí)類不在相同包的情況下,處理400在輸入包的輸出文件中找出超級(jí)類(步驟410)并且隨后轉(zhuǎn)到步驟412。從步驟412開始,處理400將當(dāng)前標(biāo)記值初始化為最大的超級(jí)類虛擬方法標(biāo)記并且將它的值加1(步驟414),以確保在該體系內(nèi)沒有標(biāo)記沖突。
從步驟404開始,在該類不具有超級(jí)類的情況下,處理400將當(dāng)前標(biāo)記值初始化為“0”(步驟416)。從步驟414或步驟416開始,處理400將當(dāng)前方法初始化為清單中第一個(gè)虛擬方法(步驟418)。接著,處理400確定是否當(dāng)前方法是空的(步驟420)。如果不是,則該處理確定是否當(dāng)前虛擬方法由超級(jí)類定義(步驟422)。如果是這樣,則在循環(huán)回步驟420之前,該方法是占優(yōu)的方法并且將相同的標(biāo)記值分配給當(dāng)前方法作為分配給超級(jí)類中占優(yōu)方法的標(biāo)記值(步驟424)。
從步驟422開始,在當(dāng)前虛擬方法沒有被超級(jí)類定義的情況下,它是一種引入的方法。在這種情況下,超級(jí)類400將當(dāng)前標(biāo)記值分配給當(dāng)前方法(步驟426)并且將當(dāng)前標(biāo)記值加1(步驟428)。然后在循環(huán)回步驟420之前,處理400設(shè)置當(dāng)前方法為清單中下一個(gè)方法(步驟430)。從步驟420開始,在當(dāng)前方法是空的情況下,處理400檢查是否當(dāng)前標(biāo)記值超過預(yù)定值如127(步驟432)。如果是這樣,則處理400失敗(步驟205)。另一方面,如果標(biāo)記值不大于127,則在退出之前,處理400公開輸出文件中的標(biāo)記值以及繼承的方法和它們的標(biāo)記值(步驟434)。圖8F-1的處理也可以用于分配標(biāo)記到如圖8F-2所示的包可視類中的公共和保護(hù)虛擬方法。
在圖8F-2中,示出了用于將標(biāo)記分配擴(kuò)展到類中包可視虛擬方法的處理440。處理440首先獲得該類中包可視虛擬方法的清單(步驟442)。接著,它檢查是否該類具有超級(jí)類(步驟444)。如果是這樣,則該處理檢查是否超級(jí)類在相同的包中(步驟446)。如果是這樣,則處理440找出相同包中的超級(jí)類(步驟448),獲得超級(jí)類的包可視虛擬方法和標(biāo)記(步驟450)并且將當(dāng)前標(biāo)記值初始化為最大的超級(jí)類虛擬方法標(biāo)記加1(步驟452)以避免包范圍的體系內(nèi)的標(biāo)記沖突。這確保先前在超級(jí)類內(nèi)分配的標(biāo)記值不再用于引入的方法。應(yīng)該注意步驟450可以遞歸地達(dá)到相同包的超級(jí)類。
從步驟444開始,在一個(gè)類不具有超級(jí)類的情況下,或者從步驟446開始,在超級(jí)類不在相同包的情況下,處理440設(shè)置當(dāng)前標(biāo)記值為“0”(步驟454)。特別地,如果超級(jí)類不在相同包中,則該超級(jí)類的包可視虛擬方法是不可以使用的并且因此不包括在步驟454中。如上面圖9D-2和圖9D-3中描述的,這些可能的方法用于解釋何時(shí)判定虛擬方法的標(biāo)識(shí)。
從步驟452或步驟454開始,處理440將當(dāng)前方法初始化為清單中第一個(gè)虛擬方法(步驟456)。接著,處理440檢查是否當(dāng)前方法是空的(步驟458)。如果不是,處理440檢查是否當(dāng)前虛擬方法由超級(jí)類定義(步驟460)。在這種情況下,該方法是占優(yōu)的方法。如果是這樣,在循環(huán)回步驟458之前,處理440如分配給超級(jí)類中占優(yōu)方法一樣來分配相同的標(biāo)記值給當(dāng)前方法(步驟462)。
從步驟460開始,如果當(dāng)前虛擬方法沒有被它的超級(jí)類定義,則它是一種引入的方法。在這種情況下,處理440分配當(dāng)前標(biāo)記值給當(dāng)前方法并且設(shè)置高位為“1”(步驟464)。虛擬方法標(biāo)記的高位用于確定是否它是公共或?qū)S锰摂M方法標(biāo)記。接著,在循環(huán)回步驟458之前,處理440將當(dāng)前標(biāo)記值加1(步驟466)并且設(shè)置當(dāng)前方法為清單中下一個(gè)方法(步驟468)。
在步驟458,在當(dāng)前方法是空的情況下,在步驟470,處理440確定是否當(dāng)前標(biāo)記值超過一個(gè)值如127(它是用8位可以表示的最大的數(shù),高位被保留)。如果是這樣,則處理440失敗(步驟205)。另一方面,在當(dāng)前標(biāo)記值在區(qū)域內(nèi)的情況下,處理440退出。注意用于包可視虛擬方法的標(biāo)記被內(nèi)部使用并且不輸出。
虛擬方法標(biāo)識(shí)僅可以在執(zhí)行期間判定。虛擬方法表允許該卡確定哪種方法根據(jù)該方法的類的標(biāo)記以及實(shí)例來調(diào)用。標(biāo)記值用作到虛擬方法表的索引。圖8G-1示出用于構(gòu)造類中公共虛擬方法表的處理480。首先,獲得該類中公共和保護(hù)虛擬方法的清單(步驟482)。接著,處理480獲得超級(jí)類的虛擬方法和標(biāo)記(步驟484)。步驟484是遞歸的,包括類中所有的超級(jí)類。然后處理480創(chuàng)建一個(gè)表,通過標(biāo)記值對(duì)虛擬方法排序(步驟486)并且去除重復(fù)的虛擬方法。對(duì)于占優(yōu)的方法產(chǎn)生重復(fù)。在這種情況下,在方法表中表示在當(dāng)前類中定義的方法來代替超級(jí)類中定義的那一個(gè)。然后在退出之前,處理480在步驟488設(shè)置對(duì)于最大虛擬方法標(biāo)記類的計(jì)數(shù)并且將表格和計(jì)數(shù)記錄在類組件中(步驟490)。
現(xiàn)在轉(zhuǎn)到圖8G-2,示出了優(yōu)化類中公共虛擬方法表的結(jié)構(gòu)的處理500。處理500通過去除超級(jí)類的虛擬方法表中疊加的元素來減小存儲(chǔ)虛擬方法表所需的尺寸。
處理500首先獲得類中公共和保護(hù)虛擬方法的清單(步驟502)。接著,獲得超級(jí)類的虛擬方法和標(biāo)記(步驟504)。步驟504是遞歸的,包括該類中所有的超級(jí)類。接著,處理500通過標(biāo)記值將在步驟502和步驟504獲得的虛擬方法排序來初始化一個(gè)表格(步驟506)。這個(gè)處理假定該處理具有至少一個(gè)入口。然后處理500將計(jì)數(shù)初始化為最大的虛擬方法標(biāo)記加上1(步驟508)。處理500還設(shè)置基本計(jì)數(shù)為“0”(步驟510)。接著,處理500檢查是否該計(jì)數(shù)是正的(步驟512)。如果是這樣,該處理檢查是否表中第一個(gè)入口由當(dāng)前類定義(步驟514)。如果不是,該處理從表格中去除該方法并且將表中剩余的方法移上來(步驟518)。然后在循環(huán)回步驟512之前,處理500將計(jì)數(shù)減“1”(步驟520)并且將基本計(jì)數(shù)加“1”(步驟522)。
從步驟514開始,在當(dāng)前類中定義第一個(gè)入口的情況下,或者在步驟512該計(jì)數(shù)是“0”的情況下,在退出之前,處理500轉(zhuǎn)到將表格、計(jì)數(shù)和基數(shù)記錄在類組件中(步驟516)。
圖8H-1和圖8H-2示出用于分配公共接口中接口方法標(biāo)記的處理524。特別地,圖8H-2更詳細(xì)地示出圖8H-1的步驟526。
現(xiàn)在參照圖8H-1,處理524分配公共接口中的接口方法標(biāo)記。處理524初始地獲得公共接口中一組接口方法(步驟525)。接著,處理524獲得接口的超級(jí)接口(superinterface)的清單(步驟526)。這個(gè)操作在圖8H-2中更詳細(xì)地定義。然后處理524將由接口和它的超級(jí)接口定義的方法集合和并(步驟527)。接著,處理524檢查是否有大于256個(gè)方法存在(步驟529)。如果是這樣,則處理524失敗(步驟205)。否則,如果存在小于256個(gè)方法,則處理524將當(dāng)前標(biāo)記值設(shè)置為“0”(步驟530)并且將當(dāng)前方法初始化為方法集合的方法中第一個(gè)方法(步驟532)。接著,處理524檢查是否當(dāng)前方法是空的(步驟533)。如果不是,處理524將當(dāng)前標(biāo)記值分配給當(dāng)前接口方法(步驟534),將當(dāng)前標(biāo)記值加1(步驟535),以及在循環(huán)回步驟533之前設(shè)置當(dāng)前方法為集合中下一個(gè)方法(步驟536)。
從步驟533開始,如果當(dāng)前方法是空的,處理524公開輸出文件中與接口相關(guān)的超級(jí)接口清單和方法標(biāo)記值(步驟537)并且退出。
現(xiàn)在參照圖8H-2,它更詳細(xì)地示出圖8H-1的步驟526。首先,圖8H-2的處理選擇一個(gè)接口(步驟682)。接著,它獲得該接口繼承的接口清單(步驟684)并且將當(dāng)前接口設(shè)置為清單中第一個(gè)接口(步驟686)。接著,圖8H-2的處理將結(jié)果集合初始化為空集合(步驟688)。從步驟688開始,圖8H-2的處理迭代地將接口加到結(jié)果集合中。通過首先檢查是否當(dāng)前接口是空的,即表示沒有其他接口需要處理來完成這一點(diǎn)(步驟690)。如果不是,該處理獲得一個(gè)當(dāng)前接口的超級(jí)接口集合(步驟692)。步驟692遞歸地調(diào)用處理526。
一旦完成步驟692,圖8H-2的處理將超級(jí)接口集合加到結(jié)果集合(步驟694)以及將當(dāng)前接口加到結(jié)果集合(步驟696)。然后該處理設(shè)置當(dāng)前接口為下一個(gè)接口(步驟698)并且循環(huán)回步驟690以繼續(xù)處理所有的接口。從步驟690開始,在當(dāng)前接口是空的情況下,圖8H-2的處理通過返回結(jié)果集合而退出。
接口表包含一個(gè)入口,用于類直接實(shí)現(xiàn)的每個(gè)接口以及用于直接實(shí)現(xiàn)接口的所有超級(jí)接口。接口表中每個(gè)入口包含接口的識(shí)別和接口方法表。該表格將接口方法的宣布映射到類的實(shí)現(xiàn)中。
圖8I-1和圖8I-2示出用于構(gòu)造類的接口表的處理700。特別地,圖8I-2更詳細(xì)地示出圖8I-1的步驟708。
圖8I-1示出了用于構(gòu)造接口表的處理700。首先,處理700獲得接口的清單,包括超級(jí)接口,(見處理526)它通過當(dāng)前類實(shí)現(xiàn)(步驟702)。接著,處理700將當(dāng)前接口設(shè)置為這個(gè)集合中第一個(gè)接口(步驟704)。然后處理700檢查是否當(dāng)前接口是空的,這表示它已經(jīng)完成(步驟706)。如果不是,處理700轉(zhuǎn)到構(gòu)造用于類的當(dāng)前接口的接口方法表(步驟708),如圖8I-2更詳細(xì)示出。接著,在循環(huán)回步驟706之前,處理700設(shè)置當(dāng)前接口為下一個(gè)接口(步驟710)。
從步驟706開始,在當(dāng)前接口是空的情況下,在退出之前,處理700將具有它們接口方法表的接口記錄在類組件中(步驟712)。
現(xiàn)在參照圖8I-2,它更詳細(xì)地示出步驟708。這個(gè)處理首先獲得該類的虛擬方法表(步驟722)以及用于接口的接口方法和標(biāo)記,包括繼承的方法(步驟724)。接著,圖8I-2的處理通過用它們的標(biāo)記值將方法排序來初始化接口方法表(步驟726)。然后該處理將當(dāng)前方法設(shè)置為接口方法表的第一個(gè)方法(步驟728)。從步驟728開始,該處理檢查是否當(dāng)前方法是空的即表示它已經(jīng)完成(步驟730)。如果不是,圖8I-2的處理找出虛擬方法表中接口方法的一個(gè)實(shí)現(xiàn)(步驟732)。接著,該處理將接口方法表的虛擬方法的標(biāo)記值記錄在當(dāng)前方法的位置(步驟734)。然后在循環(huán)回步驟730之前,它將當(dāng)前方法設(shè)置為當(dāng)前接口的下一個(gè)方法(步驟736)。從步驟730開始,在當(dāng)前方法是空的情況下,圖8I-2的處理退出。
下面在圖9A-9C中討論執(zhí)行期間元素的動(dòng)態(tài)結(jié)合,它將標(biāo)識(shí)判定描述為動(dòng)態(tài)元素。在編譯期間,不能對(duì)于特定的實(shí)現(xiàn)判定出轉(zhuǎn)換和標(biāo)記分配、對(duì)實(shí)例字段的標(biāo)識(shí)、虛擬方法和接口方法,而僅僅能夠判定出該項(xiàng)的抽象描述。
在實(shí)例字段的情況下,在定義類的范圍內(nèi)分配標(biāo)記。該類的一個(gè)實(shí)例包含不僅由類定義,而且由所有它的超級(jí)類定義的所有字段。該標(biāo)記不表示該實(shí)例內(nèi)字段的位置,因?yàn)樗鼈儾环从吃搶?shí)例的特定安排并且不能解釋由超級(jí)類定義的專用和包可視字段的位置。
在虛擬方法的情況下,在編譯和轉(zhuǎn)換期間,名稱和類型特征標(biāo)記以及實(shí)現(xiàn)這樣一種方法的體系內(nèi)的類是公知的。然而,當(dāng)根據(jù)調(diào)用的方法可能確定實(shí)例的特定類時(shí),直到執(zhí)行為止才能知道精確的實(shí)現(xiàn)。例如,類A和它的超級(jí)類B實(shí)現(xiàn)方法定義M。直到執(zhí)行為止才能知道是否編譯時(shí)類型B的實(shí)例的方法M的調(diào)用將導(dǎo)致執(zhí)行類A或類B的實(shí)現(xiàn)。
為了在執(zhí)行期間提供適當(dāng)?shù)貍魉吞摂M方法調(diào)用的手段,虛擬方法標(biāo)記分配在類體系的范圍內(nèi)。即優(yōu)于超級(jí)類繼承鏈中先前引入方法的子類的方法必須具有如它優(yōu)于的方法的相同標(biāo)記值。同時(shí),引入的方法(不優(yōu)于超級(jí)類中定義方法的那些方法)必須具有在繼承鏈內(nèi)唯一的標(biāo)記值。對(duì)于每個(gè)類定義虛擬方法表以提供將虛擬方法標(biāo)記映射到特定的實(shí)現(xiàn)的手段。
接口方法類似于虛擬方法,這在于直到執(zhí)行時(shí)才可以知道特定的實(shí)現(xiàn),但它們的不同在于接口方法不能從多個(gè)接口繼承。接口的多個(gè)繼承引起一個(gè)問題,即虛擬方法標(biāo)記分配的方式。優(yōu)于多個(gè)接口引入的方法的類的方法不需要具有如它優(yōu)于的方法相同的標(biāo)記值,因?yàn)槎鄠€(gè)定義可以都具有不同的值。因此,對(duì)于一個(gè)特定接口的每組方法被分配標(biāo)記值,而不用考慮任何其他接口的方法標(biāo)記值。
因?yàn)楦鹘涌诓还蚕順?biāo)記值,需要另外的信息來將接口方法調(diào)用傳送到特定的方法實(shí)現(xiàn)。因?yàn)榻涌诜椒?biāo)記在接口范圍內(nèi)是唯一的,需要接口方法標(biāo)記和接口的識(shí)別來確定執(zhí)行時(shí)由實(shí)例的類實(shí)現(xiàn)的方法。對(duì)于將接口識(shí)別映射到接口方法表的每個(gè)類定義一個(gè)接口表。該接口方法表對(duì)于該接口將接口方法標(biāo)記映射到該類的方法實(shí)現(xiàn)。
圖9A-9C是說明在執(zhí)行期間用于判定標(biāo)記的處理流程圖?,F(xiàn)在參照圖9A,示出了用于判定實(shí)例字段標(biāo)識(shí)的處理580。首先,處理580獲得包含來自運(yùn)行時(shí)堆棧的字段的實(shí)例(步驟582)。接著,處理580確定與該字段相關(guān)的標(biāo)記并且將該標(biāo)記映射到索引(步驟584)。從標(biāo)記到索引的映射可以要求檢驗(yàn)實(shí)例字段類型信息。另外,該操作可以要求通過超級(jí)類的實(shí)例的大小調(diào)節(jié)標(biāo)記值。最后,在退出之前處理580使用索引以找出實(shí)例中字段的表示(步驟586)。
在圖9B-1中,示出了對(duì)于公共或保護(hù)虛擬方法判定標(biāo)識(shí)的處理620。首先,處理620從運(yùn)行時(shí)堆棧獲得類的實(shí)例(步驟621)并且確定實(shí)例的類(步驟622)。接著,處理620存取類的公共虛擬方法表(步驟624)并且使用該方法標(biāo)記作為索引獲得方法表入口(步驟626)。最后,處理620根據(jù)虛擬方法表的入口內(nèi)容找出并且執(zhí)行該方法(步驟628)以及退出。
現(xiàn)在轉(zhuǎn)到圖9B-2,示出了對(duì)于任何虛擬方法(包括包可視的)判定標(biāo)識(shí)的處理600。首先,處理600從運(yùn)行時(shí)堆棧獲得類的實(shí)例(步驟601)并且確定該實(shí)例的類(步驟602)。接著,處理600確定是否該方法標(biāo)記的高位被設(shè)置為“1”(步驟604)。如果不是,處理600獲得公共虛擬方法表(步驟606)并且使用方法標(biāo)記作為到虛擬方法表的索引(步驟608)。從步驟604開始,在方法標(biāo)記的高位等于“1”的情況下,處理600將高位設(shè)置為“0”(步驟610)并且在轉(zhuǎn)到步驟608之前獲得包虛擬方法表(步驟612)。最后,根據(jù)虛擬方法表的入口內(nèi)容,處理600找出并且執(zhí)行該方法(步驟614)以及退出。
圖9B-3示出使用如圖8G-2描述的優(yōu)化虛擬方法表,用于判定對(duì)任何虛擬方法的標(biāo)識(shí)的優(yōu)化處理670。首先,處理670從運(yùn)行時(shí)堆棧獲得類的實(shí)例(步驟671)并且將當(dāng)前類設(shè)置為實(shí)例的類(步驟672)。一個(gè)方法表索引被初始化為方法標(biāo)記值(步驟674)。然后處理670確定是否該方法標(biāo)記的高位等于“1”(步驟676)。如果不是,處理670對(duì)于當(dāng)前類的公共方法表的基數(shù)設(shè)置一個(gè)基數(shù)值(步驟678)。接著,該方法表被設(shè)置為當(dāng)前類的公共虛擬方法表(步驟680)。然后處理670檢查是否該方法表索引小于該基數(shù)值(步驟682),如果是這樣,則將當(dāng)前類設(shè)置為當(dāng)前類的超級(jí)類(步驟684)。從步驟684開始,處理670循環(huán)回步驟676以繼續(xù)處理。
在步驟676,如果高位等于“1”,則處理670將方法表索引的高位設(shè)置為“0”(步驟690)。在繼續(xù)步驟682之前,它設(shè)置基數(shù)值為當(dāng)前類的包方法表基數(shù)(步驟692)并且將該方法表設(shè)置為當(dāng)前類的包虛擬方法表(步驟694)。
從步驟682開始,如果該方法表索引大于該基數(shù),處理670使用方法表索引加上基數(shù)值獲得一個(gè)方法表入口(步驟686)。然后處理670根據(jù)當(dāng)前類的方法表中入口的內(nèi)容找到該方法(步驟688)。接著,處理670退出。
現(xiàn)在參照圖9C,示出了判定接口方法標(biāo)識(shí)的處理650。首先,處理650從運(yùn)行時(shí)堆棧獲得類的實(shí)例(步驟651)并且將當(dāng)前類設(shè)置為實(shí)例的類(步驟652)。接著,處理650搜索當(dāng)前類的接口表中規(guī)定的接口(步驟654)。然后該處理確定是否接口已經(jīng)被發(fā)現(xiàn)(步驟656)。如果不是,則在循環(huán)回步驟654之前,該處理將當(dāng)前類設(shè)置為當(dāng)前類的超級(jí)類(步驟660)。
從步驟656開始,在找到規(guī)定接口的情況下,處理650獲得當(dāng)前類中相應(yīng)的接口方法表(步驟662)。然后它從表格的入口獲得虛擬方法標(biāo)記,該表格的索引等于接口方法標(biāo)記(步驟664)。然后處理650獲得實(shí)例的類的公共虛擬方法表(步驟666)。處理650從與虛擬方法標(biāo)記相關(guān)的表格入口獲得虛擬方法位置(步驟668)。然后處理650根據(jù)虛擬方法表中入口的內(nèi)容定位方法(步驟669)。一旦完成這一點(diǎn),處理650退出。
雖然相對(duì)于智能卡實(shí)現(xiàn)說明了本發(fā)明,但是本發(fā)明也可以應(yīng)用于具有小腳印的其它裝置,如在存儲(chǔ)器或計(jì)算功率或速度中被相對(duì)限定或限制的裝置。除此之外,這種資源受限裝置可以包括邊界掃描裝置、字段可編程裝置、尋呼機(jī)和蜂窩式電話。當(dāng)在它們之間存在共享對(duì)象可以使用服務(wù)器小應(yīng)用程序(servlet)時(shí),本發(fā)明可以證明是有益的。某些臺(tái)式機(jī)系統(tǒng)也可以利用本發(fā)明的技術(shù)。
本發(fā)明還涉及用于完成這些操作的設(shè)備。這種設(shè)備可以特別地構(gòu)造用于所需的目的或者它可以包括通用計(jì)算機(jī),作為由存儲(chǔ)在計(jì)算機(jī)中的計(jì)算機(jī)程序選擇地激活或重新配置。這里表現(xiàn)的過程并不固有地相關(guān)于特定的計(jì)算機(jī)或其它設(shè)備。不同的通用機(jī)可以使用根據(jù)這里的技術(shù)所寫的程序,或者它可以更加方便地構(gòu)造更特定的設(shè)備來完成所需的方法步驟。由上面給出的描述表現(xiàn)了對(duì)于這些不同的機(jī)器所需的結(jié)構(gòu)。另外,應(yīng)該理解符合本發(fā)明的虛擬機(jī)能夠提供早期虛擬機(jī)沒有的功能,如JavaTM虛擬機(jī)規(guī)范中描述的虛擬機(jī)。
JavaTM編程語言和平臺(tái)適用于本發(fā)明,同時(shí)具有某些特性的語言或平臺(tái)也將適用于實(shí)現(xiàn)本發(fā)明。這些特性包括類型安全、指針安全、面向?qū)ο蟆?dòng)態(tài)鏈接以及基于虛擬機(jī)。并不是所有這些特性需要出現(xiàn)在特定的實(shí)現(xiàn)中。在某些實(shí)施例中,可以使用缺少這些特性中一個(gè)或多個(gè)的語言或平臺(tái)?!疤摂M機(jī)”能夠用位(虛擬機(jī))或硅片(實(shí)際的/物理機(jī)/專用集成電路)實(shí)現(xiàn)。同樣,雖然說明的本發(fā)明表明是逐個(gè)對(duì)象安全的,但是本發(fā)明也可以使用其他的方法如逐個(gè)類安全的。
本發(fā)明的系統(tǒng)可以用硬件或計(jì)算機(jī)程序?qū)崿F(xiàn)。每個(gè)這樣的計(jì)算機(jī)程序可以存儲(chǔ)在存儲(chǔ)介質(zhì)或裝置中(例如,CD-ROM,硬盤或磁盤),當(dāng)存儲(chǔ)介質(zhì)或裝置由計(jì)算機(jī)讀出以實(shí)現(xiàn)描述的過程時(shí),它可以由通用或?qū)S每删幊逃?jì)算機(jī)讀出用于配置和操作計(jì)算機(jī)。該系統(tǒng)也可以作為計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)實(shí)現(xiàn),采用計(jì)算機(jī)程序來配置,這里這樣配置存儲(chǔ)介質(zhì)使得計(jì)算機(jī)以特定的和預(yù)定的方式工作。
這里的程序一般用導(dǎo)致所需結(jié)果的自相容序列步驟。這些步驟要求實(shí)際參數(shù)的實(shí)際操作。雖然通常不需要,但是這些參數(shù)采用電或磁的信號(hào)形式,能夠存儲(chǔ)、傳送、組合、比較以及進(jìn)行其他操作。它常常證明是方便的,主要是公共使用的原因,將這些信號(hào)表示為位、值、元素、符號(hào)、字符、項(xiàng)、數(shù)字等。然而,應(yīng)該注意所有的這些和類似的項(xiàng)與適當(dāng)?shù)膶?shí)際參數(shù)有關(guān)并且只是方便應(yīng)用于這些參數(shù)的標(biāo)號(hào)。
盡管參照實(shí)施例示出和描述了本發(fā)明,但是本領(lǐng)域的技術(shù)人員應(yīng)該理解在形式上和細(xì)節(jié)上的變化并沒有背離下面權(quán)利要求書的精神和范圍。
其他的實(shí)施例也在下面權(quán)利要求書的范圍內(nèi)。
權(quán)利要求
1.一種用于將代碼下載到資源受限計(jì)算機(jī)的方法,代碼可分離為至少一個(gè)具有至少一個(gè)可標(biāo)識(shí)項(xiàng)的包,包括形成包;形成可標(biāo)識(shí)項(xiàng)到相應(yīng)標(biāo)記的映射;以及提供包和映射。
2.如權(quán)利要求1所述的方法,其中映射步驟還包括產(chǎn)生一個(gè)或多個(gè)標(biāo)記類型,其中一個(gè)標(biāo)記類型是與包、類、靜態(tài)字段、靜態(tài)方法、實(shí)例字段和虛擬方法之一相關(guān)的內(nèi)部標(biāo)記類型。
3.如權(quán)利要求1所述的方法,其中映射步驟還包括產(chǎn)生一個(gè)或多個(gè)標(biāo)記類型,其中一個(gè)標(biāo)記類型是與實(shí)例字段、虛擬方法和接口方法之一相關(guān)的外部標(biāo)記類型。
4.如前面任一權(quán)利要求所述的方法,其中該包包括一個(gè)或多個(gè)標(biāo)識(shí)類型。
5.如權(quán)利要求4所述的方法,其中標(biāo)識(shí)類型中的一個(gè)選自一個(gè)組,該組包括用于一個(gè)輸入類的類標(biāo)識(shí);用于一個(gè)輸入字段的字段標(biāo)識(shí);用于一個(gè)輸入方法的方法標(biāo)識(shí);用于一個(gè)內(nèi)部類的類標(biāo)識(shí);用于一個(gè)內(nèi)部字段的靜態(tài)字段標(biāo)識(shí);用于一個(gè)內(nèi)部方法的靜態(tài)方法標(biāo)識(shí);用于一個(gè)內(nèi)部字段的實(shí)例字段標(biāo)識(shí);虛擬方法標(biāo)識(shí);對(duì)一個(gè)包可視方法的虛擬方法標(biāo)識(shí)。
6.如前面任一權(quán)利要求所述的方法還包括分配包標(biāo)記、類標(biāo)記、接口標(biāo)記、靜態(tài)字段標(biāo)記、靜態(tài)方法標(biāo)記、實(shí)例字段標(biāo)記、公共虛擬方法標(biāo)記以及接口方法標(biāo)記中的一個(gè)。
7.如權(quán)利要求6所述的方法,其中不向靜態(tài)字段標(biāo)記分配常數(shù)。
8.如權(quán)利要求6所述的方法,其中當(dāng)分配的標(biāo)記是實(shí)例字段標(biāo)記時(shí),該方法還包括確定一個(gè)類的實(shí)例字段清單和將該清單分為一個(gè)或多個(gè)種類。
9.如權(quán)利要求8所述的方法,其中清單被分成多個(gè)種類,其中至少兩個(gè)種類選自一個(gè)組,該組包括公共和受保護(hù)的原語類型、受保護(hù)的標(biāo)識(shí)類型、一個(gè)包、一個(gè)專用標(biāo)識(shí)類型、以及一個(gè)專用原語類型。
10.如權(quán)利要求1所述的方法,還包括為一個(gè)類接口構(gòu)造接口表和接口方法表中的一個(gè)。
11.如權(quán)利要求1所述的方法,還包括產(chǎn)生一個(gè)輸出文件,該文件包括至少一個(gè)元數(shù)據(jù)及一個(gè)或多個(gè)標(biāo)記。
12.如權(quán)利要求1所述的方法,其中通過元數(shù)據(jù)來描述可標(biāo)識(shí)項(xiàng)并且該元數(shù)據(jù)與包、類、字段和方法中的一個(gè)相關(guān)。
13.如權(quán)利要求1所述的方法,其中該包包括標(biāo)識(shí)一個(gè)或多個(gè)項(xiàng)的可執(zhí)行組件;以及用于解析對(duì)一個(gè)或多個(gè)項(xiàng)的標(biāo)識(shí)的輸出組件。
14.一種用于產(chǎn)生CAP文件的方法,包括解析對(duì)CAP文件中一個(gè)或多個(gè)項(xiàng)的標(biāo)識(shí),至少一個(gè)項(xiàng)屬于一個(gè)類;產(chǎn)生與CAP文件相關(guān)的輸出組件;以及構(gòu)造該類的接口表。
15.如權(quán)利要求50所述的方法,其中該表包含與虛擬方法、接口和字段中一個(gè)相關(guān)的信息。
16.一種用于鏈接下載的代碼到資源受限計(jì)算機(jī)的方法,該代碼被分成至少一個(gè)包,該包具有至少一個(gè)對(duì)于外部項(xiàng)的標(biāo)識(shí),該方法包括接收包;接收可標(biāo)識(shí)項(xiàng)到相應(yīng)標(biāo)識(shí)項(xiàng)的標(biāo)記的映射;以及使用該映射來鏈接包。
17.一種智能卡包括一個(gè)處理器;連接到處理器的存儲(chǔ)器;連接到處理器并且能夠下載包含字節(jié)代碼的第一個(gè)包的接口,該字節(jié)代碼使用標(biāo)記來標(biāo)識(shí)第二個(gè)包中的項(xiàng);存儲(chǔ)在存儲(chǔ)器中的安裝器,用于解析對(duì)該項(xiàng)的標(biāo)識(shí)和鏈接第一個(gè)和第二個(gè)包的字節(jié)代碼;以及虛擬機(jī),用于執(zhí)行鏈接的字節(jié)代碼。
18.資源受限裝置包括一個(gè)處理器;連接到處理器并且能夠存儲(chǔ)包含代碼的第一個(gè)包的存儲(chǔ)設(shè)備,該代碼使用標(biāo)記來標(biāo)識(shí)第二個(gè)包中的項(xiàng);安裝器,用于使用標(biāo)記來解析對(duì)該項(xiàng)的標(biāo)識(shí)并且鏈接第一個(gè)和第二個(gè)包的代碼;以及虛擬機(jī),用于執(zhí)行鏈接的代碼。
19.如權(quán)利要求17或18所述的智能卡,其中利用一個(gè)表格中所表示的類接口來標(biāo)識(shí)該項(xiàng)。
20.如權(quán)利要求17-19中任一所述的智能卡,其中項(xiàng)是一個(gè)方法。
21.如權(quán)利要求17-20中任一所述的智能卡,還包括由處理器執(zhí)行的操作系統(tǒng)。
22.如權(quán)利要求17-21中任一所述的智能卡,其中包是一個(gè)庫和一個(gè)小應(yīng)用程序之一。
23.如權(quán)利要求17或18所述的智能卡,還包括在遠(yuǎn)端處理器上執(zhí)行的轉(zhuǎn)換器,用于將一個(gè)小應(yīng)用程序轉(zhuǎn)換成適于通過接口發(fā)送的一個(gè)或多個(gè)包。
24.一種用于鏈接被下載到資源受限計(jì)算機(jī)上的結(jié)構(gòu)中性代碼的方法,該代碼被分成一個(gè)或多個(gè)具有一個(gè)或多個(gè)可標(biāo)識(shí)項(xiàng)的包,包括將一個(gè)或多個(gè)可標(biāo)識(shí)項(xiàng)映射為相應(yīng)的一個(gè)或多個(gè)標(biāo)記;相應(yīng)于運(yùn)行時(shí)間模式將標(biāo)記排序;將包下載到資源受限計(jì)算機(jī);以及利用經(jīng)排序的標(biāo)記將包鏈接到可執(zhí)行代碼中。
25.如權(quán)利要求24所述的方法,還包括在一個(gè)存儲(chǔ)在遠(yuǎn)端計(jì)算機(jī)上的輸出文件中描述映射;以及根據(jù)輸出文件在遠(yuǎn)端計(jì)算機(jī)上生成包。
26.如權(quán)利要求25所述的方法,還包括為每個(gè)包分配一個(gè)標(biāo)記。
27.如權(quán)利要求25所述的方法,還包括為一個(gè)或多個(gè)公共接口類和接口分配標(biāo)記。
28.如權(quán)利要求27所述的方法,還包括為下述每一個(gè)分配一個(gè)標(biāo)記公共靜態(tài)字段、靜態(tài)方法、實(shí)例字段、虛擬方法、以及接口方法。
29.如權(quán)利要求25所述的方法,還包括公開輸出文件中的標(biāo)記。
30.如權(quán)利要求27所述的方法,還包括將一個(gè)接口方法標(biāo)記映射到一個(gè)實(shí)現(xiàn)方法標(biāo)記。
31.如權(quán)利要求30所述的方法,其中項(xiàng)是一個(gè)類接口,還包括為在類中實(shí)現(xiàn)的每個(gè)接口產(chǎn)生一個(gè)接口方法清單。
32.如權(quán)利要求31所述的方法,還包括定位類或其超級(jí)類中方法的實(shí)現(xiàn);獲得與該方法相關(guān)的標(biāo)記;以及使接口方法標(biāo)記與實(shí)現(xiàn)方法標(biāo)記相關(guān)。
33.如權(quán)利要求25所述的方法,其中產(chǎn)生步驟還包括將類文件和輸出文件轉(zhuǎn)換為可下載的文件,其中可下載文件是經(jīng)轉(zhuǎn)換的小應(yīng)用程序文件和庫文件中的一個(gè)。
34.如權(quán)利要求33所述的方法,還包括安裝該包。
35.如權(quán)利要求24所述的方法,其中在下載步驟期間執(zhí)行鏈接步驟。
36.如權(quán)利要求35所述的方法,其中鏈接步驟包括部分鏈接。
37.如權(quán)利要求24所述的方法,其中以一個(gè)連續(xù)的操作執(zhí)行鏈接步驟。
38.如權(quán)利要求24所述的方法,還包括以運(yùn)行時(shí)間模式執(zhí)行可執(zhí)行代碼。
39.如權(quán)利要求38所述的方法,其中在執(zhí)行步驟之前執(zhí)行鏈接步驟。
40.如權(quán)利要求38所述的方法,其中同時(shí)執(zhí)行執(zhí)行步驟和鏈接步驟。
41.一個(gè)用于鏈接下載的結(jié)構(gòu)中性代碼到資源受限計(jì)算機(jī)的載波傳送指令,該代碼被分成一個(gè)或多個(gè)具有一個(gè)或多個(gè)可標(biāo)識(shí)項(xiàng)的包,該載波包括用于將一個(gè)或多個(gè)可標(biāo)識(shí)項(xiàng)映射到相應(yīng)的一個(gè)或多個(gè)標(biāo)記上的指令;用于相應(yīng)運(yùn)行時(shí)間模式將標(biāo)記排序的指令;用于將包下載到資源受限計(jì)算機(jī)的指令;以及用于利用經(jīng)排序的標(biāo)記將包鏈接到可執(zhí)行代碼的指令。
42.一個(gè)用于鏈接下載的結(jié)構(gòu)中性代碼到資源受限計(jì)算機(jī)的計(jì)算機(jī)實(shí)現(xiàn)系統(tǒng),該代碼被分成一個(gè)或多個(gè)具有一個(gè)或多個(gè)可標(biāo)識(shí)項(xiàng)的包,該系統(tǒng)包括用于將一個(gè)或多個(gè)可標(biāo)識(shí)項(xiàng)映射到相應(yīng)的一個(gè)或多個(gè)標(biāo)記上的指令;用于相應(yīng)運(yùn)行時(shí)間模式將標(biāo)記排序的指令;用于將包下載到資源受限計(jì)算機(jī)的指令;以及用于利用經(jīng)排序的標(biāo)記將包鏈接到可執(zhí)行代碼的指令。
全文摘要
一個(gè)系統(tǒng)將下載的結(jié)構(gòu)中性代碼鏈接到資源受限計(jì)算機(jī)。該代碼可以分離為一個(gè)或多個(gè)具有一個(gè)或多個(gè)可標(biāo)識(shí)項(xiàng)的包。該系統(tǒng)將一個(gè)或多個(gè)可標(biāo)識(shí)項(xiàng)映射為相應(yīng)的一個(gè)或多個(gè)標(biāo)記;相應(yīng)于運(yùn)行時(shí)間模式對(duì)標(biāo)記排序;將包下載到資源受限計(jì)算機(jī);并利用經(jīng)排序的標(biāo)記將包鏈接到一個(gè)可執(zhí)行代碼上。
文檔編號(hào)G06F9/46GK1346465SQ00805900
公開日2002年4月24日 申請日期2000年2月2日 優(yōu)先權(quán)日1999年2月2日
發(fā)明者朱迪思·E·施瓦貝, 喬舒亞·B·舒塞爾 申請人:太陽微電子公司