国产精品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>

      將本機(jī)接口函數(shù)調(diào)用轉(zhuǎn)換為更簡(jiǎn)單操作的方法和系統(tǒng)的制作方法

      文檔序號(hào):6554610閱讀:253來(lái)源:國(guó)知局
      專(zhuān)利名稱(chēng):將本機(jī)接口函數(shù)調(diào)用轉(zhuǎn)換為更簡(jiǎn)單操作的方法和系統(tǒng)的制作方法
      技術(shù)領(lǐng)域
      本發(fā)明涉及改進(jìn)的數(shù)據(jù)處理系統(tǒng)。具體地,本發(fā)明涉及數(shù)據(jù)處理系統(tǒng)中的Java本機(jī)函數(shù)調(diào)用。更具體地,本發(fā)明涉及在數(shù)據(jù)處理系統(tǒng)中將Java本機(jī)接口函數(shù)調(diào)用轉(zhuǎn)換為常數(shù)、內(nèi)部編譯器操作或更簡(jiǎn)單的操作。
      背景技術(shù)
      Java是一種面向?qū)ο蟮木幊陶Z(yǔ)言和環(huán)境,其專(zhuān)注于將數(shù)據(jù)定義為對(duì)象以及可應(yīng)用于這些對(duì)象的方法。Java僅支持單繼承,這意味著每個(gè)類(lèi)在任何給定時(shí)間僅能從一個(gè)其他類(lèi)繼承。Java也允許創(chuàng)建被稱(chēng)為接口的完全抽象的類(lèi),這種類(lèi)允許定義可與若干類(lèi)共享的方法,而不管其他類(lèi)如何處理這些方法。Java提供了分發(fā)軟件和擴(kuò)展Web瀏覽器的能力的機(jī)制,因?yàn)槌绦騿T能編寫(xiě)小應(yīng)用程序一次,而該小應(yīng)用程序能在Web上的任何Java使能的機(jī)器上運(yùn)行。
      Java虛擬機(jī)(JVM)是一種虛擬計(jì)算機(jī)組件。JVM允許Java程序在不同平臺(tái)上被執(zhí)行,而不是僅在為其編譯代碼的一個(gè)平臺(tái)上被執(zhí)行。Java程序是為JVM編譯的。以這種方式,Java能夠支持用于很多類(lèi)型的數(shù)據(jù)處理系統(tǒng)的應(yīng)用,這些數(shù)據(jù)處理系統(tǒng)可包含多種中央處理單元和操作系統(tǒng)體系結(jié)構(gòu)。為了使得Java應(yīng)用能在不同類(lèi)型的數(shù)據(jù)處理系統(tǒng)上執(zhí)行,編譯器通常生成一體系結(jié)構(gòu)中性的文件格式—編譯的代碼可在很多處理器上執(zhí)行,倘若存在Java運(yùn)行時(shí)系統(tǒng)的話。Java編譯器生成非特定于具體計(jì)算機(jī)體系結(jié)構(gòu)的字節(jié)碼指令。字節(jié)碼是由Java編譯器生成并由Java解釋器執(zhí)行的獨(dú)立于機(jī)器的代碼。Java解釋器是JVM中的交替地解碼和執(zhí)行一個(gè)或多個(gè)字節(jié)碼的模塊。這些字節(jié)碼指令被設(shè)計(jì)為易于在任何機(jī)器上解釋?zhuān)⒁子诒粍?dòng)態(tài)地(on the fly)轉(zhuǎn)換為本機(jī)機(jī)器碼。
      可使用開(kāi)發(fā)環(huán)境,例如可從Sun Microsystems公司獲得的Java開(kāi)發(fā)工具包(JDK),來(lái)從Java語(yǔ)言源代碼和庫(kù)構(gòu)建Java字節(jié)碼??蓪⑦@種Java字節(jié)碼存儲(chǔ)為Web服務(wù)器上的Java應(yīng)用或小應(yīng)用程序,可通過(guò)網(wǎng)絡(luò)將該Java應(yīng)用或小應(yīng)用程序從該Web服務(wù)器下載到用戶的機(jī)器并在本地JVM上執(zhí)行。
      Java運(yùn)行時(shí)環(huán)境被特別設(shè)計(jì)為限制Java應(yīng)用可能對(duì)它運(yùn)行于其上的系統(tǒng)造成的損害。這對(duì)于萬(wàn)維網(wǎng)尤其重要,在萬(wàn)維網(wǎng)上當(dāng)用戶訪問(wèn)包含Java小應(yīng)用程序的網(wǎng)頁(yè)時(shí),Java小應(yīng)用程序被自動(dòng)下載和執(zhí)行。一般說(shuō)來(lái),人們不想執(zhí)行任意的程序;它們可能包含病毒,或者它們甚至可能本身就是潛在惡意的,而不僅是無(wú)意地?cái)y帶了不受歡迎的代碼。除非用戶特別地允許它(通過(guò)設(shè)置到JVM的用戶接口中的適當(dāng)標(biāo)志),Java小應(yīng)用程序不能向附加的存儲(chǔ)設(shè)備(除非可能向一特定的、受限制的區(qū)域)讀或?qū)?,它也不能向存?chǔ)器位置(除非向一特定的、受限制的區(qū)域)讀或?qū)憽?br> 不僅Java小應(yīng)用程序是為通過(guò)網(wǎng)絡(luò)下載設(shè)計(jì)的,標(biāo)準(zhǔn)的Java庫(kù)也特別地支持客戶機(jī)-服務(wù)器計(jì)算。Java語(yǔ)言包括用于多線程和用于網(wǎng)絡(luò)通信的規(guī)定。與其他語(yǔ)言(例如C)相比,編寫(xiě)這樣的一對(duì)程序更容易得多,一個(gè)程序在用戶的計(jì)算機(jī)上本地執(zhí)行并處理用戶交互,另一個(gè)在服務(wù)器上遠(yuǎn)程執(zhí)行并可能執(zhí)行更復(fù)雜和處理器密集的工作。
      盡管Java語(yǔ)言被設(shè)計(jì)為是獨(dú)立于平臺(tái)的并主要在安全環(huán)境中執(zhí)行,程序員可通過(guò)Java本機(jī)接口(JNI)使用C風(fēng)格的調(diào)用約定來(lái)使用主機(jī)操作系統(tǒng)上的編譯的本機(jī)二進(jìn)制代碼,從而擴(kuò)展Java應(yīng)用。以這種方式,Java應(yīng)用可具有對(duì)主機(jī)操作系統(tǒng)的完全訪問(wèn)權(quán),包括對(duì)附加的I/O設(shè)備、存儲(chǔ)器等的讀或?qū)?。由于此,Java程序可以成為特定于平臺(tái)的代價(jià)完成通過(guò)JVM通常不允許的任務(wù)。然而,使用設(shè)計(jì)良好的體系結(jié)構(gòu),Java語(yǔ)言程序員可干凈地將獨(dú)立于平臺(tái)的部分隔離,并向其他Java組件呈現(xiàn)一干凈的、獨(dú)立于平臺(tái)的對(duì)象API,而同時(shí)完成特定于平臺(tái)的任務(wù)。
      使用JNI API,位于Java虛擬機(jī)(JVM)內(nèi)的參數(shù)和類(lèi)數(shù)據(jù)以及由JVM提供的服務(wù)可被訪問(wèn)并可被修改。然而,由于JNI暴露了一非常獨(dú)立于平臺(tái)和不透明的JVM的表示、其數(shù)據(jù)和服務(wù),所以存在著開(kāi)銷(xiāo)。JNI API通常是由一指向函數(shù)指針(這些函數(shù)指針指向JNI函數(shù)實(shí)現(xiàn))的表的指針(被稱(chēng)為JNI環(huán)境指針,或JNIEnv)暴露的。雖然該指針對(duì)于JNI的平臺(tái)獨(dú)立性是必需的,該指針也可能是代價(jià)高昂的,因?yàn)樵贘NI函數(shù)調(diào)用期間執(zhí)行額外的分支和表查找。JNI調(diào)用的代價(jià)取決于被調(diào)用的JNI函數(shù)的類(lèi)型。
      例如,為了訪問(wèn)從Java傳遞給本機(jī)代碼的串和數(shù)組參數(shù),需要對(duì)JNI函數(shù)的特殊調(diào)用。這些特殊的調(diào)用造成昂貴的運(yùn)行時(shí)復(fù)制操作以避免觸及JVM的數(shù)據(jù)副本。因此JNI API提供了訪問(wèn)器(accessor)函數(shù),這些函數(shù)試圖增加本機(jī)代碼接收對(duì)底層JVM數(shù)據(jù)的直接引用的機(jī)會(huì)。然而,這些函數(shù)是根據(jù)JVM的決定實(shí)現(xiàn)的,并且這些函數(shù)的使用對(duì)程序員的自由施加了某些限制。
      對(duì)于字段和方法訪問(wèn),也要求JNI函數(shù)調(diào)用來(lái)從本機(jī)代碼修改對(duì)象和訪問(wèn)JVM服務(wù)。例如,為了修改對(duì)象的字段或調(diào)用類(lèi)的方法,必須首先檢索適當(dāng)數(shù)據(jù)的句柄。這種檢索通常被實(shí)現(xiàn)為在JVM的反映(reflective)數(shù)據(jù)結(jié)構(gòu)上的遍歷以及在運(yùn)行時(shí)昂貴的基于串的簽名比較操作。這種遍歷比Java中的直接字段訪問(wèn)慢幾個(gè)數(shù)量級(jí)。此外,如果非異步的JVM正在執(zhí)行阻塞(blocking)工作,則JNI函數(shù)調(diào)用可能停滯(stall)。
      其他JNI函數(shù)具有類(lèi)似于用于字段和方法訪問(wèn)的JNI函數(shù)的唯一的一組開(kāi)銷(xiāo)。這些JNI函數(shù)包括實(shí)例化對(duì)象、管理引用、處理異常、支持同步和反映的函數(shù),以及在Java調(diào)用API中用于將JVM嵌入本機(jī)代碼內(nèi)的函數(shù)。
      已做出了若干嘗試來(lái)最小化JNI調(diào)用的開(kāi)銷(xiāo)。最初的嘗試是基于程序員的優(yōu)化,其形式為當(dāng)編寫(xiě)使用JNI API的本機(jī)代碼時(shí)高效的編碼技術(shù)。JNI規(guī)范也提供了一組可返回對(duì)JVM數(shù)據(jù)和對(duì)象的直接引用的關(guān)鍵函數(shù),并建議了避免調(diào)用JNI API的方法,例如在類(lèi)的靜態(tài)初始化期間緩存字段和方法ID。
      另一種嘗試涉及通過(guò)限制在本機(jī)代碼中可提供的功能的類(lèi)型來(lái)最小化對(duì)JNI API函數(shù)的依賴(lài),從而消除與本機(jī)函數(shù)相關(guān)的開(kāi)銷(xiāo)。然而,這種機(jī)制只能用于被保證不會(huì)要求垃圾收集、異常處理、同步或任何類(lèi)型的安全支持的方法,因?yàn)檫@些是包裝器(wrapper)提供的功能類(lèi)型。
      在又一種最化小JNI函數(shù)調(diào)用的開(kāi)銷(xiāo)的嘗試中,編譯器可使用緊密耦合于VM的專(zhuān)有本機(jī)接口,因?yàn)樵摻涌诰哂嘘P(guān)于VM的內(nèi)部結(jié)構(gòu)的知識(shí)。這種編譯器的一個(gè)例子是Jcc編譯器,這是一種使用專(zhuān)有本機(jī)接口直接編譯到本機(jī)代碼的優(yōu)化編譯器,該專(zhuān)有本機(jī)接口令人聯(lián)想到來(lái)自SunMicrosystems公司的原始的本機(jī)方法接口(NMI)。然而,該NMI已被JNI代替。在Jcc中,被標(biāo)記為“本機(jī)的”Java方法將被當(dāng)作這樣的C方法,該C方法將使用C調(diào)用約定被調(diào)用,并對(duì)每個(gè)Java類(lèi)發(fā)出一C結(jié)構(gòu)。以這種方式,Jcc可內(nèi)嵌短的匯編段以加速本機(jī)調(diào)用。
      盡管上述各嘗試最小化了與JNI函數(shù)調(diào)用相關(guān)的某些開(kāi)銷(xiāo),但并不存在不限制在本機(jī)代碼中實(shí)現(xiàn)的功能的類(lèi)型的(如在上述第二種嘗試中提及的)、或不耦合到特定VM實(shí)現(xiàn)的(如在上述第三種嘗試中提及的)現(xiàn)有的機(jī)制。
      因此,擁有這樣的方法、裝置、和計(jì)算機(jī)指令將是有利的,該方法、裝置和計(jì)算機(jī)指令由即時(shí)(JIT)編譯器使用以將JNI函數(shù)調(diào)用轉(zhuǎn)換為常數(shù)、內(nèi)部編譯器操作或更簡(jiǎn)單的中間表示,從而可改進(jìn)本機(jī)代碼訪問(wèn)JVM數(shù)據(jù)和服務(wù)的性能,而不耦合到特定的VM實(shí)現(xiàn)或犧牲JNI的類(lèi)型安全(type safety)。

      發(fā)明內(nèi)容
      本發(fā)明提供了用于在即時(shí)編譯期間將本機(jī)函數(shù)調(diào)用轉(zhuǎn)換為更簡(jiǎn)單的操作的方法、裝置、和計(jì)算機(jī)指令。在編譯一程序以生成用于多個(gè)Java本機(jī)接口(JNI)函數(shù)調(diào)用的形狀(shape)的列表后,提供一內(nèi)嵌器以識(shí)別用于轉(zhuǎn)換的、在本機(jī)代碼中進(jìn)行的本機(jī)接口函數(shù)或JNI調(diào)用的列表。
      然后,即時(shí)(JIT)編譯器對(duì)該本機(jī)接口函數(shù)調(diào)用列表和被傳遞給這些本機(jī)接口函數(shù)調(diào)用的多個(gè)變?cè)獔?zhí)行定義和使用(def/use)分析。隨后,提供一JIT調(diào)用轉(zhuǎn)換器以使用所述定義和使用分析的結(jié)果將該本機(jī)接口函數(shù)調(diào)用列表的一部分轉(zhuǎn)換為常數(shù)、內(nèi)部即時(shí)編譯器操作或更簡(jiǎn)單的中間表示。
      在本機(jī)函數(shù)調(diào)用的內(nèi)嵌期間,即時(shí)內(nèi)嵌器對(duì)于在內(nèi)嵌的代碼中發(fā)生的每個(gè)本機(jī)接口調(diào)用確定在該調(diào)用中使用的本機(jī)接口環(huán)境變量是否位于與它在代表所有已知的本機(jī)接口調(diào)用的預(yù)定義形狀的列表中所出現(xiàn)的相同的位置。一JNI調(diào)用的形狀包括(1)訪問(wèn)實(shí)際目標(biāo)本機(jī)接口或JNI函數(shù)的手段(以中間表示表示的)(2)每個(gè)實(shí)際變?cè)邮盏降奶幚?同樣以中間表示表示的)。典型的JNI調(diào)用的形狀(當(dāng)構(gòu)建形狀列表時(shí)被創(chuàng)建的)唯一地確定實(shí)際JNI例程。如果在調(diào)用中使用的本機(jī)接口環(huán)境變量位于與在代表本機(jī)接口調(diào)用的預(yù)定義形狀的列表中的形狀之一中相同的位置,則內(nèi)嵌器確定在該形狀和由一內(nèi)嵌的本機(jī)函數(shù)進(jìn)行的JNI調(diào)用的中間表示之間是否存在匹配。
      如果在該形狀和該JNI函數(shù)調(diào)用的中間表示之間存在匹配,則內(nèi)嵌器將該JNI調(diào)用添加到用于當(dāng)前被內(nèi)嵌的本機(jī)方法的JNI函數(shù)調(diào)用的列表中,其中該調(diào)用列表是以在該多個(gè)JNI調(diào)用的中間表示中出現(xiàn)的順序排序的。
      在執(zhí)行了定義和使用分析之后,該即時(shí)調(diào)用轉(zhuǎn)換器對(duì)于該本機(jī)接口函數(shù)調(diào)用列表中的每個(gè)本機(jī)接口函數(shù)調(diào)用確定本機(jī)接口函數(shù)調(diào)用的類(lèi)型,并嘗試根據(jù)每個(gè)JNI函數(shù)調(diào)用的類(lèi)型將該本機(jī)接口函數(shù)調(diào)用替換為常數(shù)值、內(nèi)部即時(shí)編譯器操作、或更簡(jiǎn)單的中間表示。
      因?yàn)樾律傻某?shù)、內(nèi)部即時(shí)編譯器操作、或更簡(jiǎn)單的中間表示不使用JNI而執(zhí)行,它們轉(zhuǎn)而提供了對(duì)Java虛擬機(jī)的服務(wù)和數(shù)據(jù)的直接的和更快的訪問(wèn)。


      在所附權(quán)利要求中提出了相信為本發(fā)明的特點(diǎn)的新穎特征。然而,通過(guò)結(jié)合附圖參照以下對(duì)示例性實(shí)施例的詳細(xì)說(shuō)明可最好地理解本發(fā)明本身以及其優(yōu)選使用方式、其他目標(biāo)和優(yōu)點(diǎn),在這些附圖中圖1是根據(jù)本發(fā)明的一優(yōu)選實(shí)施例可在其中實(shí)現(xiàn)本發(fā)明的數(shù)據(jù)處理系統(tǒng)的圖示;圖2是可在其中實(shí)現(xiàn)本發(fā)明的數(shù)據(jù)處理系統(tǒng)的框圖;圖3是示出了在可實(shí)現(xiàn)本發(fā)明的計(jì)算機(jī)系統(tǒng)內(nèi)運(yùn)行的軟件組件的關(guān)系的框圖;圖4是根據(jù)本發(fā)明的一優(yōu)選實(shí)施例的JVM的框圖;圖5示出了根據(jù)本發(fā)明的一優(yōu)選實(shí)施例由JNI調(diào)用轉(zhuǎn)換器執(zhí)行的JNI函數(shù)調(diào)用轉(zhuǎn)換;圖6示出了根據(jù)本發(fā)明的一優(yōu)選實(shí)施例為JNI函數(shù)調(diào)用生成中間表示;圖7示出了根據(jù)本發(fā)明的一優(yōu)選實(shí)施例用于JNI轉(zhuǎn)換的本機(jī)內(nèi)嵌準(zhǔn)備;圖8的圖示出了根據(jù)本發(fā)明的一優(yōu)選實(shí)施例由編譯器執(zhí)行的示例性def/use分析;以及圖9是根據(jù)本發(fā)明的一優(yōu)選實(shí)施例用于將JNI函數(shù)調(diào)用轉(zhuǎn)換為常數(shù)、內(nèi)部編譯器操作或更簡(jiǎn)單的中間表示的示例性過(guò)程。
      具體實(shí)施例方式
      現(xiàn)參照附圖并具體參照?qǐng)D1,其示出了根據(jù)本發(fā)明的一優(yōu)選實(shí)施例可在其中實(shí)現(xiàn)本發(fā)明的數(shù)據(jù)處理系統(tǒng)的圖示。示出了一計(jì)算機(jī)100,其包括系統(tǒng)單元102、視頻顯示終端104、鍵盤(pán)106、可包括軟盤(pán)驅(qū)動(dòng)器和其他類(lèi)型的永久的和可拆裝的存儲(chǔ)介質(zhì)的存儲(chǔ)設(shè)備108、和鼠標(biāo)110。個(gè)人計(jì)算機(jī)100中還可包括其他輸入設(shè)備,例如游戲桿、觸控板、觸屏、跟蹤球、麥克風(fēng)等??墒褂萌魏芜m當(dāng)?shù)挠?jì)算機(jī),例如位于紐約Armonk的國(guó)際商業(yè)機(jī)器公司的產(chǎn)品IBM eServer計(jì)算機(jī)或IntelliStation計(jì)算機(jī),來(lái)實(shí)現(xiàn)計(jì)算機(jī)100。雖然所示的圖示示出了一計(jì)算機(jī),本發(fā)明的其他實(shí)施例可在其他類(lèi)型的數(shù)據(jù)處理系統(tǒng)例如網(wǎng)絡(luò)計(jì)算機(jī)中實(shí)現(xiàn)。計(jì)算機(jī)100還優(yōu)選地包括圖形用戶界面(GUI),該圖形用戶界面可通過(guò)存在于在計(jì)算機(jī)100中運(yùn)行的計(jì)算機(jī)可讀介質(zhì)中的系統(tǒng)軟件來(lái)實(shí)現(xiàn)。
      現(xiàn)參照?qǐng)D2,其示出了可在其中實(shí)現(xiàn)本發(fā)明的數(shù)據(jù)處理系統(tǒng)的框圖。數(shù)據(jù)處理系統(tǒng)200是一計(jì)算機(jī)例如圖1中的計(jì)算機(jī)100的示例,實(shí)現(xiàn)本發(fā)明的過(guò)程的代碼或指令可位于該計(jì)算機(jī)中。數(shù)據(jù)處理系統(tǒng)200使用外圍部件互連(PCI)局部總線體系結(jié)構(gòu)。盡管所示的示例使用PCI總線,也可使用諸如加速圖形端口(AGP)和工業(yè)標(biāo)準(zhǔn)結(jié)構(gòu)(ISA)的其他總線體系結(jié)構(gòu)。處理器202和主存儲(chǔ)器204通過(guò)PCI橋208連接到PCI局部總線206。PCI橋208也可包括集成的存儲(chǔ)控制器和用于處理器202的高速緩沖存儲(chǔ)器。可通過(guò)直接部件互連或通過(guò)附加連接器進(jìn)行附加的到PCI局部總線的連接。在所示的示例中,局域網(wǎng)(LAN)適配器210、小型計(jì)算機(jī)系統(tǒng)接口(SCSI)主機(jī)總線適配器212、和擴(kuò)展總線接口214通過(guò)直接部件互連連接到PCI局部總線206。相反地,音頻適配器216、圖形適配器218、和音頻/視頻適配器219通過(guò)插入到擴(kuò)展槽中的附加板連接到PCI局部總線206。擴(kuò)展總線接口214提供了用于鍵盤(pán)和鼠標(biāo)適配器220、調(diào)制解調(diào)器222、和附加存儲(chǔ)器224的連接。SCSI主機(jī)總線適配器212提供了用于硬盤(pán)驅(qū)動(dòng)器226、磁帶驅(qū)動(dòng)器228、和CD-ROM驅(qū)動(dòng)器230的連接。典型的PCI局部總線實(shí)現(xiàn)將支持三個(gè)或四個(gè)PCI擴(kuò)展槽或附加連接器。
      操作系統(tǒng)運(yùn)行在處理器202上并用于對(duì)圖2中的數(shù)據(jù)處理系統(tǒng)200中的各部件進(jìn)行協(xié)調(diào)和提供控制。操作系統(tǒng)可以是商業(yè)上可獲得的操作系統(tǒng)例如可從Microsoft公司獲得的Windows XP。面向?qū)ο蟮木幊滔到y(tǒng)例如Java可與操作系統(tǒng)一起運(yùn)行,并提供從在數(shù)據(jù)處理系統(tǒng)200上運(yùn)行的Java程序或應(yīng)用到操作系統(tǒng)的調(diào)用?!癑ava”是Sun Microsystems公司的商標(biāo)。用于操作系統(tǒng)、面向?qū)ο蟮木幊滔到y(tǒng)、和應(yīng)用或程序的指令位于存儲(chǔ)設(shè)備例如硬盤(pán)驅(qū)動(dòng)器226上,并可被加載到主存儲(chǔ)器204中以便由處理器202執(zhí)行。
      本領(lǐng)域的普通技術(shù)人員將理解圖2中的硬件可根據(jù)實(shí)現(xiàn)而變化。作為對(duì)圖2中所示的硬件的附加或替代,可使用其他內(nèi)部硬件或外圍設(shè)備例如快閃只讀存儲(chǔ)器(ROM)、等效的非易失性存儲(chǔ)器、或光盤(pán)驅(qū)動(dòng)器等。此外,可將本發(fā)明的過(guò)程應(yīng)用于多處理器數(shù)據(jù)處理系統(tǒng)。
      例如,數(shù)據(jù)處理系統(tǒng)200如果可選地被配置為網(wǎng)絡(luò)計(jì)算機(jī),則可不包括SCSI主機(jī)總線適配器212、硬盤(pán)驅(qū)動(dòng)器226、磁帶驅(qū)動(dòng)器228、和CD-ROM 230。在這種情況下,將被適當(dāng)?shù)胤Q(chēng)為客戶端計(jì)算機(jī)的該計(jì)算機(jī)包括某種類(lèi)型的網(wǎng)絡(luò)通信接口,例如LAN適配器210、調(diào)制解調(diào)器222等。作為另一個(gè)示例,數(shù)據(jù)處理系統(tǒng)200可以是獨(dú)立的系統(tǒng),其被配置為不依賴(lài)于某種類(lèi)型的網(wǎng)絡(luò)通信接口而可引導(dǎo),不管數(shù)據(jù)處理系統(tǒng)200是否包括某種類(lèi)型的網(wǎng)絡(luò)通信接口。作為進(jìn)一步的示例,數(shù)據(jù)處理系統(tǒng)200可以是個(gè)人數(shù)據(jù)助理(PDA),其被配置為具有ROM和/或快閃ROM,以為存儲(chǔ)操作系統(tǒng)文件和/或用戶生成的數(shù)據(jù)提供非易失性存儲(chǔ)器。
      圖2中所示的示例和以上描述的示例并非意在暗示結(jié)構(gòu)上的限制。例如,數(shù)據(jù)處理系統(tǒng)200除了采取PDA的形式也可以是筆記本計(jì)算機(jī)或手持式計(jì)算機(jī)。數(shù)據(jù)處理系統(tǒng)200也可以是信息站(kiosk)或網(wǎng)絡(luò)電器(webappliance)。
      本發(fā)明的過(guò)程是由處理器202使用計(jì)算機(jī)實(shí)現(xiàn)的指令執(zhí)行的,這些指令可被加載到存儲(chǔ)器例如主存儲(chǔ)器204、存儲(chǔ)器224、或一個(gè)或多個(gè)外圍設(shè)備226-230中。
      現(xiàn)參照?qǐng)D3,該框圖示出了在可實(shí)現(xiàn)本發(fā)明的計(jì)算機(jī)系統(tǒng)內(nèi)運(yùn)行的各軟件組件的關(guān)系。基于Java的系統(tǒng)300包含特定于平臺(tái)的操作系統(tǒng)302,該操作系統(tǒng)為在特定硬件平臺(tái)上執(zhí)行的軟件提供了硬件和系統(tǒng)支持。JVM304是一個(gè)可與操作系統(tǒng)一起執(zhí)行的軟件應(yīng)用。JVM 304提供了Java運(yùn)行時(shí)環(huán)境,該環(huán)境具有執(zhí)行Java應(yīng)用或小應(yīng)用程序306的能力,所述Java應(yīng)用或小應(yīng)用程序是以Java編程語(yǔ)言編寫(xiě)的程序、小服務(wù)程序、或軟件組件。JVM 304在其中運(yùn)行的計(jì)算機(jī)系統(tǒng)可以類(lèi)似于以上描述的數(shù)據(jù)處理系統(tǒng)200或計(jì)算機(jī)100。然而,JVM 304可在具有嵌入的picoJava內(nèi)核的所謂的Java芯片、硅上Java(java-on-silicon)、或Java處理器上的專(zhuān)用的硬件中實(shí)現(xiàn)。
      在Java運(yùn)行時(shí)環(huán)境的中心的是JVM,該JVM支持Java的環(huán)境的所有方面,包括其體系結(jié)構(gòu)、安全特征、跨網(wǎng)絡(luò)的移動(dòng)性、和平臺(tái)獨(dú)立性。
      JVM是一虛擬計(jì)算機(jī),即被抽象地規(guī)定的計(jì)算機(jī)。該規(guī)范定義了每個(gè)JVM必須實(shí)現(xiàn)的某些特征,并具有可取決于JVM被設(shè)計(jì)為在其上執(zhí)行的平臺(tái)的一定范圍的設(shè)計(jì)選擇。例如,所有JVM必須執(zhí)行Java字節(jié)碼,并可使用一系列技術(shù)來(lái)執(zhí)行由字節(jié)碼代表的指令。JVM可完全在軟件中實(shí)現(xiàn)或在某種程度上在硬件中實(shí)現(xiàn)。這種靈活性允許為大型計(jì)算機(jī)和PDA設(shè)計(jì)不同的JVM。
      JVM是實(shí)際執(zhí)行Java程序的虛擬計(jì)算機(jī)組件的名稱(chēng)。Java程序不是直接由中央處理器運(yùn)行的,而是由JVM運(yùn)行的,JVM本身是運(yùn)行在處理器上的一個(gè)軟件。JVM允許Java程序在不同的平臺(tái)上執(zhí)行,而不是僅在為其編譯代碼的一個(gè)平臺(tái)上執(zhí)行。Java程序是為JVM編譯的。以這種方式,Java能夠支持用于很多類(lèi)型的數(shù)據(jù)處理系統(tǒng)的應(yīng)用,這些數(shù)據(jù)處理系統(tǒng)可包含各種中央處理單元和操作系統(tǒng)體系結(jié)構(gòu)。為了使Java應(yīng)用能在不同類(lèi)型的數(shù)據(jù)處理系統(tǒng)上執(zhí)行,編譯器典型地生成體系結(jié)構(gòu)中性的文件格式-編譯的代碼可在很多處理器上執(zhí)行,只要存在Java運(yùn)行時(shí)系統(tǒng)即可。Java編譯器生成非特定于具體計(jì)算機(jī)體系結(jié)構(gòu)的字節(jié)碼指令。字節(jié)碼是由Java編譯器生成并由Java解釋器執(zhí)行的獨(dú)立于機(jī)器的代碼。Java解釋器是交替地解碼和解釋一個(gè)或多個(gè)字節(jié)碼的、JVM的部分。這些字節(jié)碼指令被設(shè)計(jì)為易于在任何計(jì)算機(jī)上執(zhí)行并易于被動(dòng)態(tài)地(on the fly)轉(zhuǎn)換為本機(jī)機(jī)器碼。字節(jié)碼可由即時(shí)編譯器或JIT轉(zhuǎn)換為本機(jī)代碼。
      JVM加載類(lèi)文件并執(zhí)行其中的字節(jié)碼。類(lèi)文件是由JVM中的類(lèi)加載器加載的。類(lèi)加載器從應(yīng)用加載類(lèi)文件并從應(yīng)用所需要Java應(yīng)用編程接口(API)加載類(lèi)文件。執(zhí)行字節(jié)碼的執(zhí)行引擎可隨不同的平臺(tái)和實(shí)現(xiàn)而不同。
      一種類(lèi)型的基于軟件的執(zhí)行引擎是JIT編譯器。使用這種類(lèi)型的執(zhí)行,在成功地滿足用于JIT編譯一方法的標(biāo)準(zhǔn)后,將一方法的字節(jié)碼編譯為本機(jī)機(jī)器碼。然后用于該方法的本機(jī)機(jī)器碼被緩存,并在下次調(diào)用該方法時(shí)被重用。執(zhí)行引擎也可在硬件中實(shí)現(xiàn)并嵌入芯片中,從而字節(jié)碼被本機(jī)地執(zhí)行。JVM通常解釋字節(jié)碼,但JVM也可使用其他技術(shù),例如即時(shí)編譯,來(lái)執(zhí)行字節(jié)碼。
      當(dāng)在特定于平臺(tái)的操作系統(tǒng)上的軟件中實(shí)現(xiàn)的JVM上執(zhí)行應(yīng)用時(shí),Java應(yīng)用可通過(guò)調(diào)用本機(jī)方法來(lái)與主機(jī)操作系統(tǒng)交互。Java方法是在Java語(yǔ)言中編寫(xiě)的,被編譯為字節(jié)碼,并被存儲(chǔ)在類(lèi)文件中。本機(jī)方法是在某種其他語(yǔ)言中編寫(xiě)的,并被編譯為特定處理器的本機(jī)機(jī)器碼。本機(jī)方法被存儲(chǔ)在動(dòng)態(tài)鏈接庫(kù)中,動(dòng)態(tài)鏈接庫(kù)的精確形式是特定于平臺(tái)的。
      現(xiàn)參照?qǐng)D4,其示出了根據(jù)本發(fā)明的一優(yōu)選實(shí)施例的JVM的框圖。JVM 404包括類(lèi)加載器子系統(tǒng)402,該子系統(tǒng)是一用于在給定了類(lèi)型的完全限定名的情況下加載類(lèi)型例如類(lèi)和接口的機(jī)制。JVM 404還包含運(yùn)行時(shí)數(shù)據(jù)區(qū)404、執(zhí)行引擎406、本機(jī)方法接口408、和存儲(chǔ)管理410。執(zhí)行引擎406是一用于執(zhí)行包含在由類(lèi)加載器子系統(tǒng)402加載的類(lèi)的方法中的指令的機(jī)制。執(zhí)行引擎406可以是例如Java解釋器412或即時(shí)編譯器414。本機(jī)方法接口408允許訪問(wèn)底層操作系統(tǒng)中的資源。本機(jī)方法接口408可以是例如Java本機(jī)接口(JNI)。
      運(yùn)行時(shí)數(shù)據(jù)區(qū)404包含本機(jī)方法棧416、Java棧418、PC寄存器420、方法區(qū)422、和堆424。這些不同的數(shù)據(jù)區(qū)代表JVM 404執(zhí)行程序所需要的存儲(chǔ)區(qū)的結(jié)構(gòu)。
      Java棧418用于存儲(chǔ)Java方法調(diào)用的狀態(tài)。當(dāng)發(fā)起新的線程時(shí),JVM為該線程創(chuàng)建一新的Java棧。JVM只直接在Java棧上執(zhí)行兩種操作它推入和彈出幀。一線程的Java棧存儲(chǔ)用于該線程的Java方法調(diào)用的狀態(tài)。Java方法調(diào)用的狀態(tài)包括其局部變量、調(diào)用它所用的參數(shù)、其返回值(如果有的話)、和中間計(jì)算。Java棧由棧幀組成。一棧幀包含單個(gè)Java方法調(diào)用的狀態(tài)。當(dāng)一線程調(diào)用一方法時(shí),JVM將一新的棧幀推入該線程的Java棧。當(dāng)該方法完成時(shí),JVM將用于該方法的幀彈出并丟棄它。JVM沒(méi)有任何用于保存中間值的寄存器;任何需要或產(chǎn)生中間值的Java指令使用該棧來(lái)保存中間值。以這種方式,為多種平臺(tái)體系結(jié)構(gòu)良好地定義了Java指令集。
      程序計(jì)數(shù)器(PC)寄存器420用于指示下一個(gè)要執(zhí)行的指令。每個(gè)實(shí)例化的線程獲得它自己的PC寄存器和Java棧。如果該線程正在執(zhí)行一JVM方法,則該P(yáng)C寄存器的值指示下一個(gè)要執(zhí)行的指令。本機(jī)方法棧416存儲(chǔ)本機(jī)方法的調(diào)用的狀態(tài)。本機(jī)方法調(diào)用的狀態(tài)是以依賴(lài)于實(shí)現(xiàn)的方式存儲(chǔ)在本機(jī)方法棧、寄存器、或其他依賴(lài)于實(shí)現(xiàn)的存儲(chǔ)區(qū)中的。在某些JVM實(shí)現(xiàn)中,本機(jī)方法棧416和Java棧418是結(jié)合在一起的。
      方法區(qū)422包含類(lèi)數(shù)據(jù),而堆424包含所有實(shí)例化的對(duì)象。在這些示例中,常數(shù)池位于方法區(qū)422中。JVM規(guī)范嚴(yán)格地定義了數(shù)據(jù)類(lèi)型和操作。大多數(shù)JVM選擇具有一個(gè)方法區(qū)和一個(gè)堆,每一個(gè)都由運(yùn)行在該JVM例如JVM 404中的所有線程共享。當(dāng)JVM 404加載類(lèi)文件時(shí),它根據(jù)包含在該類(lèi)文件中的二進(jìn)制數(shù)據(jù)分析關(guān)于類(lèi)型的信息。JVM 404將這種類(lèi)型信息放入方法區(qū)。每次創(chuàng)建一類(lèi)實(shí)例或數(shù)組,就從堆424中分配用于該新對(duì)象的存儲(chǔ)空間。JVM 404包括一在用于堆424的存儲(chǔ)區(qū)中分配存儲(chǔ)空間的指令,但不包括用于在該存儲(chǔ)區(qū)中釋放該空間的指令。所示的示例中的存儲(chǔ)管理410管理分配給堆424的存儲(chǔ)區(qū)中的存儲(chǔ)空間。存儲(chǔ)管理410可包括一垃圾收集器,該垃圾收集器自動(dòng)回收由不再被引用的對(duì)象所使用的存儲(chǔ)空間。此外,垃圾收集器也可以移動(dòng)對(duì)象以減少堆的碎片化。
      本發(fā)明提供了在JIT編譯期間用于將JNI函數(shù)調(diào)用轉(zhuǎn)換為更簡(jiǎn)單的編譯器操作(其最終導(dǎo)致生成常數(shù)和更高效的中間表示)的方法、裝置、和計(jì)算機(jī)指令。在一優(yōu)選實(shí)施例中,本發(fā)明利用從內(nèi)嵌的本機(jī)函數(shù)中間表示轉(zhuǎn)換來(lái)的JIT編譯器中間表示。本發(fā)明提供了一JNI調(diào)用轉(zhuǎn)換器,該轉(zhuǎn)換器對(duì)每個(gè)所生成的JIT編譯器中間表示指令執(zhí)行分析,以尋找JNI函數(shù)調(diào)用。然后JNI調(diào)用轉(zhuǎn)換器將同樣多的JNI函數(shù)調(diào)用的中間表示轉(zhuǎn)換為內(nèi)部JIT編譯器操作或常數(shù),以便生成等價(jià)于JNI調(diào)用但不需要調(diào)用JNI函數(shù)的更簡(jiǎn)單的操作。以這種方式,提供了對(duì)JVM服務(wù)和數(shù)據(jù)的更快的訪問(wèn)。
      為了發(fā)現(xiàn)程序打算調(diào)用的實(shí)際JNI方法,JNI調(diào)用轉(zhuǎn)換器首先必須理解每個(gè)JNI函數(shù)調(diào)用的JIT編譯器中間表示的形狀。為了理解每個(gè)形狀,JNI調(diào)用轉(zhuǎn)換器調(diào)用JIT編譯器以依次編譯調(diào)用每個(gè)JNI函數(shù)的不可執(zhí)行的C或C++程序。JNI調(diào)用轉(zhuǎn)換器獲得關(guān)于每個(gè)JNI函數(shù)如何使用JNIEnv變?cè)兔總€(gè)調(diào)用的每個(gè)用戶提供變?cè)氖褂玫闹R(shí),并維護(hù)已知形狀的列表。作為另一種選擇,JIT調(diào)用轉(zhuǎn)換器可在Java程序執(zhí)行的開(kāi)始動(dòng)態(tài)地確定形狀或作為JII編譯器構(gòu)建過(guò)程的一部分確定形狀。作為另一種選擇,可將關(guān)于形狀的知識(shí)硬編碼到JIT編譯器的源代碼中。
      JNI調(diào)用的形狀包括(1)訪問(wèn)實(shí)際目標(biāo)JNI函數(shù)的手段(以中間表示表示的), (2)每個(gè)實(shí)際變?cè)邮盏降奶幚?同樣以中間表示表示的)。典型的JNI調(diào)用的形狀(當(dāng)構(gòu)建形狀列表時(shí)被創(chuàng)建的)唯一地確定實(shí)際JNI例程。在該優(yōu)選實(shí)施例中,構(gòu)建形狀列表(通過(guò)處理特殊的C和C++程序)的過(guò)程發(fā)生在當(dāng)該Java過(guò)程(并因此JIT)開(kāi)始執(zhí)行時(shí)。也可能在構(gòu)造JIT本身時(shí)創(chuàng)建形狀列表。通過(guò)執(zhí)行作為構(gòu)建JIT編譯器的一部分的形狀確定,當(dāng)編譯器被重啟時(shí)確定某一組形狀。這樣,用于每個(gè)JNI函數(shù)的形狀可被靜態(tài)地硬編碼到JIT編譯器中。為了執(zhí)行作為構(gòu)建JIT編譯器的一部分的形狀確定的唯一要求是所使用的中間表示對(duì)于JIT編譯器的當(dāng)前版本和虛擬機(jī)兩者都是正確的。作為該過(guò)程的結(jié)果,生成JNI函數(shù)調(diào)用中間表示形狀的列表。
      一旦形狀被確定,它們將由內(nèi)嵌器使用,該內(nèi)嵌器執(zhí)行這樣的內(nèi)嵌工作,包括將參數(shù)映射為變?cè)喜⒈緳C(jī)編譯器中間表示和JIT編譯器中間表示,控制流圖,和具體化JNIEnv指針從而內(nèi)嵌的語(yǔ)句可使用它來(lái)進(jìn)行對(duì)JNI API的調(diào)用。
      在本機(jī)代碼的內(nèi)嵌期間,內(nèi)嵌器分析內(nèi)嵌的代碼以發(fā)現(xiàn)所生成的代表JNI調(diào)用的中間表示語(yǔ)句。它通過(guò)將內(nèi)嵌的中間表示匹配于從C或C++程序生成的或在JIT構(gòu)建過(guò)程中生成的形狀的列表來(lái)進(jìn)行上述分析。內(nèi)嵌器記錄在內(nèi)嵌的本機(jī)函數(shù)中的、可被傳遞給遞歸內(nèi)嵌的函數(shù)的JNIEnv變量的所有使用。當(dāng)內(nèi)嵌器遇到JNIEnv變量的一使用時(shí),如果該JNIEnv變量未被用于與它在所述形狀列表中的任何形狀中所出現(xiàn)的相同的位置,則內(nèi)嵌過(guò)程繼續(xù)。然而,如果該JNIEnv變量被用于與它在所述形狀列表中的一個(gè)形狀中所顯示的相同的位置,則將該整個(gè)形狀匹配于該JNI函數(shù)調(diào)用點(diǎn)(callsite)的中間表示。如果(一JNI方法調(diào)用的)形狀與形狀列表的一成員相比具有相同數(shù)量的變?cè)?,并且?shí)際調(diào)用中的每個(gè)變?cè)c形狀列表中的該成員中的變?cè)念?lèi)型一致,則該形狀匹配形狀列表中的該成員。如果發(fā)現(xiàn)匹配,這意味著該調(diào)用點(diǎn)對(duì)應(yīng)于一JNI函數(shù)調(diào)用,則該調(diào)用點(diǎn)不適合于內(nèi)嵌,但可適合于轉(zhuǎn)換。
      在這種情況下,JIT編譯器內(nèi)嵌器記錄它確定對(duì)應(yīng)于JNI函數(shù)調(diào)用的調(diào)用點(diǎn)。生成這種JNI函數(shù)調(diào)用的一列表,該列表是按照在用于該內(nèi)嵌方法的中間表示中出現(xiàn)的順序排序的。如果一個(gè)方法調(diào)用使用另一個(gè)方法調(diào)用的結(jié)果,則最內(nèi)的方法在該列表中將出現(xiàn)在該結(jié)果的使用之前。一旦完成了調(diào)用點(diǎn)的分析,則內(nèi)嵌器識(shí)別不可內(nèi)嵌的但可能可轉(zhuǎn)換的JNI函數(shù)調(diào)用的列表。然后JNI調(diào)用轉(zhuǎn)換器使用JNI def/use分析的結(jié)果對(duì)該JNI函數(shù)調(diào)用列表執(zhí)行轉(zhuǎn)換。
      若干JNI函數(shù)調(diào)用被用于識(shí)別通常通過(guò)類(lèi)的常數(shù)池來(lái)識(shí)別的元素。這些JNI函數(shù)的例子包括getObjectClass、getMethodID、和getFieldID。其他JNI函數(shù)調(diào)用可執(zhí)行更具體的動(dòng)作,例如獲得或設(shè)置對(duì)象字段值。然而,在可執(zhí)行優(yōu)化之前必須知道被傳遞給JNI函數(shù)的對(duì)象的特定類(lèi)型。因此,執(zhí)行JNI def/use分析。
      JNI def/use分析類(lèi)似于在優(yōu)化編譯器中經(jīng)常使用的得到深入理解的定義/使用分析,它是通過(guò)跟蹤通過(guò)內(nèi)嵌的代碼被傳遞給內(nèi)嵌的本機(jī)方法的對(duì)象到它們作為變?cè)粋鬟f給JNI函數(shù)的位置來(lái)執(zhí)行的。每個(gè)變?cè)梢唤M可能的對(duì)象代表,該組對(duì)象取決于從內(nèi)嵌的本機(jī)方法的開(kāi)始到JNI函數(shù)的調(diào)用的控制流。該組對(duì)象可包括多于一個(gè)元素,并且這些元素可都來(lái)自相同的類(lèi)。
      def/use分析計(jì)算到達(dá)JNI函數(shù)調(diào)用中的使用的所有可能的類(lèi)、字段和方法。就是說(shuō),當(dāng)它不能在一JNI調(diào)用點(diǎn)處決定性地確定例如一對(duì)象一定是其實(shí)例的類(lèi),則它產(chǎn)生足夠的信息以允許該轉(zhuǎn)換階段考慮該對(duì)象可能是其實(shí)例的所有可能的類(lèi)。
      有可能def/use分析不能計(jì)算甚至有條件的結(jié)果。這將在例如一JNI函數(shù)調(diào)用的變?cè)菑拇鎯?chǔ)器中取出(已由先前的過(guò)程寫(xiě)在那里)以用于隨后的JNI函數(shù)調(diào)用的情況下發(fā)生。
      在JNI def/use分析中,getObjectClass、getSuperClass、findClass、getMethodID、和getFieldID被當(dāng)作定義,并且它們的使用被跟蹤。結(jié)果通??杀晦D(zhuǎn)換為將被使用以代替通常的常數(shù)池索引的常數(shù)值。
      此外,JNI def/use分析也跟蹤findClass、getMethodID、和getFieldID的串變?cè)R赃@種方式,JIT編譯器可確實(shí)地解析(resolve)這些調(diào)用中的某一些,而更天真的實(shí)現(xiàn)將不能這樣做。然而,JNI def/use分析的一個(gè)復(fù)雜之處是NewObjectType JNI調(diào)用的結(jié)果可到達(dá)在JNI函數(shù)調(diào)用的列表中的對(duì)象的多種使用。因此,這些結(jié)果具有一抽象類(lèi)型,該抽象類(lèi)型可在JNI def/use階段期間用作NewObjectType的變?cè)念?lèi)和MethodID變得固定的情況下變得具體。
      如上所述,JNI調(diào)用轉(zhuǎn)換器使用JNI def/use分析的結(jié)果對(duì)JNI函數(shù)調(diào)用列表執(zhí)行轉(zhuǎn)換。在轉(zhuǎn)換期間,JNI調(diào)用轉(zhuǎn)換器對(duì)JNI函數(shù)調(diào)用列表進(jìn)行迭代,并將JNI函數(shù)調(diào)用替換為常數(shù)值,或生成新的更簡(jiǎn)單的JIT編譯器中間表示并將JNI函數(shù)調(diào)用替換為該新的JIT編譯器中間表示。
      取決于JNI函數(shù)調(diào)用的類(lèi)型,該轉(zhuǎn)換過(guò)程的可能結(jié)果可以是不同的。例如,如果到達(dá)getObjectClass的所有可能的定義是同一類(lèi)的,則該調(diào)用被替換為適當(dāng)?shù)某?shù)。如下所述,在def/use分析產(chǎn)生包括關(guān)于到達(dá)getObjectClass的多個(gè)不兼容的(對(duì)象的)類(lèi)的信息的已知結(jié)果的情況下,使用條件邏輯和代碼復(fù)制(code replication)來(lái)使正確的實(shí)際類(lèi)可用于隨后的使用。
      如果到達(dá)getFieldID或getMethodID的所有可能的類(lèi)是兼容的(在Java的意義上),并且串變?cè)杀晃ㄒ坏卮_定,則該調(diào)用被替換為適當(dāng)?shù)某?shù)。(如果不兼容的類(lèi)的對(duì)象到達(dá)getFieldID或getMethodID,則可如下所述插入條件邏輯。)如果到達(dá)get&lt;type&gt;Field方法或put&lt;type&gt;Field方法(它們檢索或存儲(chǔ)一Java類(lèi)的字段)的所有可能的fieldID是相同的,并且到達(dá)該調(diào)用的所有可能的對(duì)象是兼容的類(lèi)類(lèi)型,則該調(diào)用被替換為相應(yīng)的JIT編譯器的中間表示的序列。應(yīng)注意這種形式的內(nèi)部表示根據(jù)用于執(zhí)行本機(jī)方法的Java規(guī)則推遲了拋出任何異常。(表示法get&lt;type&gt;Field指意在從一對(duì)象檢索字段的任何JNI API函數(shù),并且&lt;type&gt;表示法的其他使用也類(lèi)似。熟悉JNI API的技術(shù)人員將容易理解這種表示法。)對(duì)于JNI函數(shù)列表中的各種call&lt;type&gt;Method JNI函數(shù)調(diào)用,通過(guò)移除被調(diào)用的方法的中間表示,并生成直接調(diào)用該函數(shù)的JIT中間表示,來(lái)執(zhí)行類(lèi)似的轉(zhuǎn)換。對(duì)于JNI函數(shù)列表中不是使用以上步驟處理的任何條目,該調(diào)用被當(dāng)作對(duì)適當(dāng)?shù)腣M服務(wù)例程的普通調(diào)用。
      重要的是注意到,對(duì)于上述任何函數(shù),如果JNI def/use階段產(chǎn)生了已知的但不是決定性的信息,則將基于傳遞到JNI函數(shù)調(diào)用中的實(shí)際接收器對(duì)象的類(lèi)型或?qū)嶋H值(即,jfieldID或jmethodID)的條件邏輯與適當(dāng)?shù)闹虚g表示一起插入以代表被轉(zhuǎn)換的特定JNI函數(shù)的語(yǔ)義。
      現(xiàn)轉(zhuǎn)向圖5,該圖示出了根據(jù)本發(fā)明的一優(yōu)選實(shí)施例由JNI調(diào)用轉(zhuǎn)換器執(zhí)行的JNI函數(shù)調(diào)用轉(zhuǎn)換。如圖5所示,本發(fā)明提供了JNI調(diào)用轉(zhuǎn)換器500。
      JNI調(diào)用轉(zhuǎn)換器500在由內(nèi)嵌器內(nèi)嵌的每個(gè)JIT編譯器中間表示指令502中進(jìn)行迭代。某些JIT編譯器中間表示指令502可能是利用了JNI API函數(shù)的JNI函數(shù)調(diào)用504。
      對(duì)于那些是JNI函數(shù)調(diào)用的指令,JNI調(diào)用轉(zhuǎn)換器500將這些指令轉(zhuǎn)換為轉(zhuǎn)換的調(diào)用506和內(nèi)部JIT編譯器操作508。轉(zhuǎn)換的調(diào)用506可以是提供對(duì)JVM服務(wù)和數(shù)據(jù)的更直接和更快的訪問(wèn)的更簡(jiǎn)單的JIT編譯器中間表示。內(nèi)部JIT編譯器操作508可以是常數(shù)值或不使用JNI的簡(jiǎn)化的中間表示。
      以這種方式,JNI調(diào)用轉(zhuǎn)換器500修改某些或很多JNI函數(shù)調(diào)用以消除實(shí)際調(diào)用JNI函數(shù)的需要。該轉(zhuǎn)換是通過(guò)使用內(nèi)嵌器進(jìn)行分析而將每個(gè)JNI函數(shù)的JIT編譯器中間表示的形狀匹配于已知形狀的列表來(lái)完成的。為了執(zhí)行這種匹配,首先以如下在圖6中描述的方式生成一形狀列表。
      現(xiàn)轉(zhuǎn)到圖6,該圖示出了根據(jù)本發(fā)明的一優(yōu)選實(shí)施例為JNI函數(shù)調(diào)用生成中間表示形狀。如圖6中所示,JIT編譯器600編譯包含對(duì)所有JNI函數(shù)的典型調(diào)用的不可執(zhí)行的C和C++程序602并生成代表用于JNI函數(shù)調(diào)用的中間表示的形狀的列表604。
      現(xiàn)轉(zhuǎn)到圖7,該圖示出了根據(jù)本發(fā)明的一優(yōu)選實(shí)施例用于JNI轉(zhuǎn)換的本機(jī)內(nèi)嵌準(zhǔn)備。
      如圖7所示,JIT編譯器內(nèi)嵌器700通過(guò)將用于本機(jī)調(diào)用的中間表示替換為JIT編譯器中間表示格式的函數(shù)的實(shí)際實(shí)現(xiàn)來(lái)內(nèi)嵌本機(jī)函數(shù)。
      在內(nèi)嵌期間,JIT編譯器內(nèi)嵌器700可分析包括若干JNI函數(shù)調(diào)用的本機(jī)函數(shù)中間表示702。在該示例中,本機(jī)函數(shù)中間表示702包括JNI調(diào)用1、JNI調(diào)用2、JNI調(diào)用3、和JNI調(diào)用4。對(duì)于由JIT編譯器內(nèi)嵌器匹配的每個(gè)JNI函數(shù)調(diào)用,JIT編譯器內(nèi)嵌器700將該JNI函數(shù)調(diào)用以其在內(nèi)嵌的本機(jī)函數(shù)的中間表示702中出現(xiàn)的順序添加到JNI函數(shù)調(diào)用列表704。
      因此,JNI調(diào)用1被添加到JNI函數(shù)調(diào)用列表704,然后是JNI調(diào)用2。如果一個(gè)JNI函數(shù)調(diào)用使用另一個(gè)JNI函數(shù)調(diào)用的結(jié)果,則最內(nèi)的調(diào)用將在該表示中首先出現(xiàn)。
      現(xiàn)轉(zhuǎn)向圖8,該圖示出了根據(jù)本發(fā)明的一優(yōu)選實(shí)施例由編譯器執(zhí)行的示例性def/use分析。如圖8所示,在JNI def/use分析中,編譯器分析程序并確定是否可執(zhí)行進(jìn)一步的優(yōu)化。
      在該示例中,def/use分析確定定義了什么變量。例如,程序800包括定義對(duì)象“obj”802、整數(shù)“a”804、類(lèi)“cls”806、和字段“fid”808。此外,def/use分析確定何處使用所定義的變量。例如,“obj”被用在getObjectClass方法810和SetIntField方法814中,“cls”被用在getFieldID方法812中,且“fid”被用在setIntField方法814中。因?yàn)椤癱ls”806是getObjectClass方法810的結(jié)果,所以它被當(dāng)作定義,且其使用被跟蹤。在該圖所示出的代碼中,有可能將對(duì)GetFieldID的JNI函數(shù)調(diào)用替換為代表該字段的ID的常數(shù)值。此外,因?yàn)椤癴id”808也是setIntField方法814的輸入變?cè)瑢⒂锌赡軐⒂糜趯?duì)setIntField方法814的調(diào)用的中間表示轉(zhuǎn)換為直接修改對(duì)象中的相應(yīng)字段的中間表示(即,無(wú)需進(jìn)行JNI函數(shù)調(diào)用來(lái)這樣做)。
      現(xiàn)轉(zhuǎn)向圖9,其示出了根據(jù)本發(fā)明的一優(yōu)選實(shí)施例用于將JNI函數(shù)調(diào)用轉(zhuǎn)換為常數(shù)、內(nèi)部編譯器操作或更簡(jiǎn)單的中間表示的流程圖。該過(guò)程假設(shè)JNI調(diào)用轉(zhuǎn)換器已如圖6所示運(yùn)行JIT編譯器來(lái)生成JIT編譯器中間表示和JNI函數(shù)調(diào)用形狀列表。
      如圖9中所示,內(nèi)嵌器被運(yùn)行到其標(biāo)準(zhǔn)的內(nèi)嵌階段(步驟900)。它查看它是否遇到任何可內(nèi)嵌的本機(jī)調(diào)用點(diǎn)(步驟902)。如果它沒(méi)遇到,則它繼續(xù)進(jìn)行到步驟926,該步驟重新開(kāi)始JIT編譯的其余部分。然而,如果遇到本機(jī)調(diào)用點(diǎn),則它繼續(xù)到步驟904,在此它檢查是否可內(nèi)嵌的本機(jī)函數(shù)包含任何函數(shù)調(diào)用。如果不包含,則內(nèi)嵌器繼續(xù)進(jìn)行到步驟924,該步驟重新開(kāi)始JIT編譯的其余部分。如果可內(nèi)嵌的本機(jī)調(diào)用確實(shí)包含函數(shù)調(diào)用,則該過(guò)程繼續(xù)到步驟906,在此將本機(jī)代碼匹配于由圖6中所示的過(guò)程生成的JNI函數(shù)調(diào)用形狀。在步驟908,檢查調(diào)用點(diǎn)以發(fā)現(xiàn)匹配,且如果發(fā)現(xiàn)匹配,則步驟910將該調(diào)用點(diǎn)添加到JNI調(diào)用列表,并繼續(xù)進(jìn)行到步驟912,該步驟為任何其他的調(diào)用點(diǎn)重復(fù)該最后過(guò)程。如果調(diào)用點(diǎn)不匹配,則該過(guò)程重復(fù)自身直到所有調(diào)用點(diǎn)已被檢查。
      一旦所有調(diào)用點(diǎn)已被分析,則步驟914執(zhí)行JNI def/use分析,且通過(guò)在步驟916處理第一個(gè)被識(shí)別的JNI調(diào)用來(lái)繼續(xù)。如果JNI def/use分析為該調(diào)用點(diǎn)產(chǎn)生了決定性的結(jié)果(步驟918),則該調(diào)用的中間表示被替換為常數(shù)、更簡(jiǎn)單的編譯器操作或更簡(jiǎn)單的中間表示,并可能帶有用于已知結(jié)果的條件邏輯(步驟922)。如果JNI def/use為該特定調(diào)用點(diǎn)生成了未知的結(jié)果,則從所述JNI函數(shù)調(diào)用列表中丟棄該調(diào)用點(diǎn)和任何其他使用其結(jié)果的調(diào)用點(diǎn)(步驟920)。
      一旦已使用JNI def/use的結(jié)果來(lái)轉(zhuǎn)換該調(diào)用點(diǎn),則該過(guò)程檢查另外的JNI調(diào)用點(diǎn)(步驟924)。如果有更多的JNI調(diào)用點(diǎn),則該過(guò)程繼續(xù)進(jìn)行到步驟916。如果沒(méi)有更多的調(diào)用點(diǎn)要處理,則步驟926繼續(xù)進(jìn)行JIT編譯的其他部分,并且該過(guò)程隨后結(jié)束。
      重要的是注意到,盡管已在全功能的數(shù)據(jù)處理系統(tǒng)的情境中描述了本發(fā)明,本領(lǐng)域的普通技術(shù)人員將認(rèn)識(shí)到本發(fā)明的過(guò)程也能夠以指令的計(jì)算機(jī)可讀介質(zhì)的形式和多種形式被分發(fā),并且不管實(shí)際用于執(zhí)行這種分發(fā)的信號(hào)承載介質(zhì)的特定類(lèi)型是什么,本發(fā)明都同等適用。計(jì)算機(jī)可讀介質(zhì)的例子包括可記錄類(lèi)型的介質(zhì),例如軟盤(pán)、硬盤(pán)驅(qū)動(dòng)器、RAM、CD-ROM、DVD-ROM,以及傳輸類(lèi)型的介質(zhì),例如使用諸如射頻和光波傳輸?shù)葌鬏斝问降臄?shù)字和模擬通信鏈路、有線或無(wú)線的通信鏈路。該計(jì)算機(jī)可讀介質(zhì)可采取編碼格式的形式,這種編碼格式被解碼以實(shí)際用于特定的數(shù)據(jù)處理系統(tǒng)。
      本發(fā)明的描述是為了說(shuō)明和描述的目的給出的,而非旨在是窮盡性的或限于本發(fā)明的所公開(kāi)的形式。對(duì)本領(lǐng)域的普通技術(shù)人員來(lái)說(shuō)很多修改和變形都將是顯然的。例如,盡管所示的實(shí)施例是針對(duì)處理Java中的字節(jié)碼,本發(fā)明的過(guò)程也可應(yīng)用于處理這樣的指令的其他編程語(yǔ)言和環(huán)境,所述指令不是特定于這些指令在其上執(zhí)行的計(jì)算機(jī)。在這種情況下,該計(jì)算機(jī)上的虛擬機(jī)可解釋這些指令或?qū)⑦@些指令發(fā)送給編譯器以生成適于由該虛擬機(jī)位于其上的計(jì)算機(jī)執(zhí)行的代碼。
      所選擇和描述的實(shí)施例是為了最好地解釋本發(fā)明的原理和實(shí)際應(yīng)用,并使本領(lǐng)域的其他普通技術(shù)人員能理解本發(fā)明的帶有適合于所考慮的特定應(yīng)用的各種修改的各實(shí)施例。
      權(quán)利要求
      1.一種在數(shù)據(jù)處理系統(tǒng)中用于在即時(shí)編譯期間將本機(jī)接口函數(shù)調(diào)用轉(zhuǎn)換為更簡(jiǎn)單的操作的方法,該方法包括編譯本機(jī)語(yǔ)言程序以生成用于多個(gè)本機(jī)接口函數(shù)調(diào)用的形狀的列表;通過(guò)將在該本機(jī)語(yǔ)言程序中進(jìn)行的多個(gè)本機(jī)接口函數(shù)調(diào)用匹配于該形狀列表,來(lái)識(shí)別用于可能的轉(zhuǎn)換的本機(jī)接口函數(shù)調(diào)用的列表;通過(guò)跟蹤作為參數(shù)被傳遞給本機(jī)接口函數(shù)的多個(gè)變?cè)亩鄠€(gè)值,來(lái)對(duì)所識(shí)別的本機(jī)接口函數(shù)調(diào)用的列表中的每一個(gè)執(zhí)行定義和使用分析;以及使用所述定義和使用分析的結(jié)果,將所述本機(jī)接口函數(shù)調(diào)用的列表的一部分轉(zhuǎn)換為常數(shù)、內(nèi)部即時(shí)編譯器操作、和更簡(jiǎn)單的中間表示中的一個(gè)。
      2.根據(jù)權(quán)利要求1的方法,其中所述形狀列表包括所述多個(gè)本機(jī)接口函數(shù)調(diào)用的中間表示,并包括該多個(gè)本機(jī)函數(shù)調(diào)用對(duì)本機(jī)接口環(huán)境變量和用戶變?cè)挠梅ā?br> 3.根據(jù)權(quán)利要求2的方法,其中所述識(shí)別步驟是在內(nèi)嵌本機(jī)函數(shù)調(diào)用期間、響應(yīng)于檢測(cè)到內(nèi)嵌的本機(jī)函數(shù)調(diào)用中的本機(jī)接口函數(shù)調(diào)用而執(zhí)行的,且其中所述識(shí)別步驟還包括對(duì)于所述識(shí)別的本機(jī)接口函數(shù)調(diào)用列表中的每一個(gè),確定所述本機(jī)接口環(huán)境變量是否是以在所述生成的形狀的列表中的一形狀中的相同方式被使用的;如果所述本機(jī)接口環(huán)境變量是以在所述生成的形狀的列表中的一形狀中的相同方式被使用的,則確定在該形狀和該本機(jī)接口函數(shù)調(diào)用的中間表示之間是否存在匹配,其中如果該本機(jī)接口函數(shù)調(diào)用的中間表示與該形狀相比具有相同數(shù)量的變?cè)?,且該本機(jī)接口函數(shù)調(diào)用中的每個(gè)變?cè)c該形狀中的變?cè)念?lèi)型一致,則存在匹配;以及如果在該形狀和該本機(jī)接口函數(shù)調(diào)用的中間表示之間存在匹配,則將該本機(jī)接口函數(shù)調(diào)用添加到所述本機(jī)接口函數(shù)調(diào)用列表,其中該本機(jī)接口函數(shù)調(diào)用列表是按照在所述多個(gè)本機(jī)接口函數(shù)調(diào)用的中間表示中出現(xiàn)的順序排序的。
      4.根據(jù)權(quán)利要求3的方法,其中所述定義和使用分析包括在識(shí)別了所述本機(jī)接口函數(shù)調(diào)用列表之后跟蹤被傳遞給該本機(jī)接口函數(shù)調(diào)用列表的多個(gè)對(duì)象到該多個(gè)對(duì)象作為變?cè)粋鬟f給本機(jī)接口函數(shù)的位置。
      5.根據(jù)權(quán)利要求4的方法,其中所述轉(zhuǎn)換步驟包括對(duì)于所述本機(jī)接口函數(shù)調(diào)用列表中的每個(gè)本機(jī)接口函數(shù)調(diào)用,確定所述定義和使用分析是否返回決定性的結(jié)果;如果該定義和使用分析返回決定性的結(jié)果,則確定該本機(jī)接口函數(shù)調(diào)用的類(lèi)型;以及根據(jù)該本機(jī)接口函數(shù)調(diào)用的類(lèi)型,將該本機(jī)接口函數(shù)調(diào)用替換為常數(shù)值、內(nèi)部即時(shí)編譯器操作、和更簡(jiǎn)單的中間表示中的一個(gè)。
      6.根據(jù)權(quán)利要求5的方法,還包括如果所述定義和使用分析返回已知的結(jié)果,則將所述調(diào)用點(diǎn)替換為包含條件邏輯的、代表所指定的調(diào)用的語(yǔ)義的中間表示;如果該定義和使用分析返回未知的結(jié)果,則從所考慮的本機(jī)接口調(diào)用列表中丟棄該本機(jī)接口函數(shù)調(diào)用和使用該本機(jī)接口函數(shù)調(diào)用的任何其他本機(jī)接口函數(shù)調(diào)用。
      7.根據(jù)權(quán)利要求5的方法,其中所述常數(shù)、內(nèi)部即時(shí)編譯器操作和更簡(jiǎn)單的中間表示提供了對(duì)虛擬機(jī)的服務(wù)和數(shù)據(jù)的直接的和更快的訪問(wèn),其中所述內(nèi)部即時(shí)編譯器操作執(zhí)行其功能而不使用本機(jī)接口。
      8.根據(jù)權(quán)利要求1的方法,其中所述形狀列表中的形狀包括以中間表示來(lái)表示的用于訪問(wèn)實(shí)際目標(biāo)本機(jī)接口函數(shù)的手段和以中間表示來(lái)表示的每個(gè)實(shí)際變?cè)邮盏降奶幚?,且其中該形狀唯一地?biāo)識(shí)了該實(shí)際目標(biāo)本機(jī)接口函數(shù)。
      9.根據(jù)權(quán)利要求1的方法,其中所述定義和使用分析確定定義了什么變量以及在何處使用所定義的變量。
      10.一種用于在即時(shí)編譯期間將本機(jī)接口函數(shù)調(diào)用轉(zhuǎn)換為更簡(jiǎn)單的操作的數(shù)據(jù)處理系統(tǒng),該數(shù)據(jù)處理系統(tǒng)包括即時(shí)編譯器,用于編譯本機(jī)語(yǔ)言程序以生成用于該本機(jī)語(yǔ)言程序中的多個(gè)本機(jī)接口函數(shù)調(diào)用的形狀的列表;即時(shí)編譯器內(nèi)嵌器,用于從該形狀列表中識(shí)別用于可能的轉(zhuǎn)換的本機(jī)接口函數(shù)調(diào)用的列表;其中該即時(shí)編譯器對(duì)所述本機(jī)接口函數(shù)調(diào)用的列表和被傳遞給所述本機(jī)接口函數(shù)的多個(gè)變?cè)獔?zhí)行定義和使用分析,其中該定義和使用分析確定定義了什么變量,以及在何處使用所定義的變量;以及即時(shí)調(diào)用轉(zhuǎn)換器,用于使用該定義和使用分析的結(jié)果,將所述本機(jī)接口函數(shù)調(diào)用的列表的一部分轉(zhuǎn)換為常數(shù)、內(nèi)部即時(shí)編譯器操作、和更簡(jiǎn)單的中間表示中的一個(gè)。
      11.根據(jù)權(quán)利要求10的數(shù)據(jù)處理系統(tǒng),其中所述形狀列表包括所述多個(gè)本機(jī)接口函數(shù)調(diào)用的中間表示,并包括該多個(gè)本機(jī)函數(shù)調(diào)用對(duì)本機(jī)接口環(huán)境變量和用戶變?cè)挠梅ā?br> 12.根據(jù)權(quán)利要求11的數(shù)據(jù)處理系統(tǒng),其中所述即時(shí)編譯器內(nèi)嵌器在內(nèi)嵌本機(jī)函數(shù)調(diào)用期間、響應(yīng)于檢測(cè)到內(nèi)嵌的本機(jī)函數(shù)調(diào)用中的本機(jī)接口函數(shù)調(diào)用而識(shí)別用于轉(zhuǎn)換的所述本機(jī)接口函數(shù)調(diào)用列表,且其中該即時(shí)編譯器內(nèi)嵌器還執(zhí)行以下操作對(duì)于所述識(shí)別的本機(jī)接口函數(shù)調(diào)用列表中的每一個(gè),確定所述本機(jī)接口環(huán)境變量是否是以在所述生成的形狀的列表中的一形狀中的相同方式被使用的;如果所述本機(jī)接口環(huán)境變量是以在所述生成的形狀的列表中的一形狀中的相同方式被使用的,則確定在該形狀和該本機(jī)接口函數(shù)調(diào)用的中間表示之間是否存在匹配,其中如果該本機(jī)接口函數(shù)調(diào)用的中間表示與該形狀相比具有相同數(shù)量的變?cè)以摫緳C(jī)接口函數(shù)調(diào)用中的每個(gè)變?cè)c該形狀中的變?cè)念?lèi)型一致,則存在匹配;以及如果在該形狀和該本機(jī)接口函數(shù)調(diào)用的中間表示之間存在匹配,則將該本機(jī)接口函數(shù)調(diào)用添加到所述本機(jī)接口函數(shù)調(diào)用列表,其中該本機(jī)接口函數(shù)調(diào)用列表是按照在所述多個(gè)本機(jī)接口函數(shù)調(diào)用的中間表示中出現(xiàn)的順序排序的。
      13.根據(jù)權(quán)利要求12的數(shù)據(jù)處理系統(tǒng),其中所述即時(shí)編譯器內(nèi)嵌器在識(shí)別了所述本機(jī)接口函數(shù)調(diào)用列表之后跟蹤被傳遞給該本機(jī)接口函數(shù)調(diào)用列表的多個(gè)對(duì)象到該多個(gè)對(duì)象作為變?cè)粋鬟f給本機(jī)接口函數(shù)的位置。
      14.根據(jù)權(quán)利要求13的數(shù)據(jù)處理系統(tǒng),其中所述即時(shí)調(diào)用轉(zhuǎn)換器還執(zhí)行以下操作對(duì)于所述本機(jī)接口函數(shù)調(diào)用列表中的每個(gè)本機(jī)接口函數(shù)調(diào)用,確定所述定義和使用分析是否返回已知的結(jié)果;如果該定義和使用分析返回已知的結(jié)果,則確定該本機(jī)接口函數(shù)調(diào)用的類(lèi)型;以及根據(jù)該本機(jī)接口函數(shù)調(diào)用的類(lèi)型,將該本機(jī)接口函數(shù)調(diào)用替換為常數(shù)值、內(nèi)部即時(shí)編譯器操作、和更簡(jiǎn)單的中間表示中的一個(gè)。
      15.根據(jù)權(quán)利要求14的數(shù)據(jù)處理系統(tǒng),其中所述即時(shí)調(diào)用轉(zhuǎn)換器還執(zhí)行以下操作如果該定義和使用分析返回未知的結(jié)果,則從所述本機(jī)接口調(diào)用列表中丟棄該本機(jī)接口函數(shù)調(diào)用和使用該本機(jī)接口函數(shù)調(diào)用的任何其他本機(jī)接口函數(shù)調(diào)用。
      16.根據(jù)權(quán)利要求14的數(shù)據(jù)處理系統(tǒng),其中所述內(nèi)部即時(shí)編譯器操作提供了對(duì)虛擬機(jī)的服務(wù)和數(shù)據(jù)的直接的和更快的訪問(wèn),其中所述內(nèi)部即時(shí)編譯器操作執(zhí)行其功能而不使用本機(jī)接口。
      17.一種在計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)中的用于在即時(shí)編譯期間將本機(jī)接口函數(shù)調(diào)用轉(zhuǎn)換為更簡(jiǎn)單的操作的計(jì)算機(jī)程序產(chǎn)品,該計(jì)算機(jī)程序產(chǎn)品包括用于執(zhí)行前述方法權(quán)利要求的任何方法的指令。
      全文摘要
      提供了用于將Java本機(jī)接口函數(shù)調(diào)用轉(zhuǎn)換為常數(shù)、內(nèi)部即時(shí)編譯器操作或更簡(jiǎn)單的中間表示的方法和系統(tǒng)。編譯器生成用于多個(gè)本機(jī)接口函數(shù)調(diào)用的多個(gè)中間表示。在內(nèi)嵌本機(jī)代碼期間,對(duì)每個(gè)本機(jī)函數(shù)調(diào)用執(zhí)行匹配(針對(duì)該列表),并生成本機(jī)接口函數(shù)調(diào)用的列表。對(duì)于每個(gè)本機(jī)接口函數(shù)調(diào)用,JIT調(diào)用轉(zhuǎn)換器嘗試根據(jù)該本機(jī)接口函數(shù)調(diào)用的類(lèi)型將該本機(jī)接口函數(shù)調(diào)用替換為常數(shù)、內(nèi)部即時(shí)編譯器操作或更簡(jiǎn)單的中間表示。
      文檔編號(hào)G06F9/45GK1848088SQ20061000825
      公開(kāi)日2006年10月18日 申請(qǐng)日期2006年2月16日 優(yōu)先權(quán)日2005年2月18日
      發(fā)明者A·H·基爾斯特拉, L·S·斯特帕尼安, K·A·斯圖德雷 申請(qǐng)人:國(guó)際商業(yè)機(jī)器公司
      網(wǎng)友詢問(wèn)留言 已有0條留言
      • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
      1