午夜毛片免费看,老师老少妇黄色网站,久久本道综合久久伊人,伊人黄片子

用于受約束的計(jì)算環(huán)境的可執(zhí)行代碼的制作方法

文檔序號(hào):10475870閱讀:230來(lái)源:國(guó)知局
用于受約束的計(jì)算環(huán)境的可執(zhí)行代碼的制作方法
【專(zhuān)利摘要】用于促進(jìn)調(diào)整在可執(zhí)行存儲(chǔ)器的寫(xiě)入受限的計(jì)算環(huán)境中運(yùn)行的計(jì)算機(jī)代碼的系統(tǒng)和方法。示例方法包括利用虛擬機(jī)從軟件代碼生成第一可執(zhí)行映像,以及采用該第一可執(zhí)行映像來(lái)選擇性地修改虛擬機(jī)和第一可執(zhí)行映像,從而產(chǎn)生更新的虛擬機(jī)和第二可執(zhí)行映像。第二可執(zhí)行映像表示第一可執(zhí)行映像的更新版本。為了將動(dòng)態(tài)代碼(諸如本地產(chǎn)生的計(jì)算機(jī)代碼)變換成用于在受約束的設(shè)備上運(yùn)行的一個(gè)或多個(gè)可執(zhí)行映像,實(shí)施例可以利用現(xiàn)有的動(dòng)態(tài)代碼生成器(例如,在Java HotSpot性能引擎(也被稱(chēng)為HotSpot)中),從而選擇性地修改它們,以生成在關(guān)聯(lián)軟件應(yīng)用的后續(xù)運(yùn)行中可用的不同的(即,更新的)代碼,由此有效地實(shí)現(xiàn)被用來(lái)運(yùn)行該軟件的可執(zhí)行代碼的修改。
【專(zhuān)利說(shuō)明】
用于受約束的計(jì)算環(huán)境的可執(zhí)行代碼
[0001] 對(duì)相關(guān)申請(qǐng)的交叉引用
[0002] 本申請(qǐng)要求于2013年12月20日提交的標(biāo)題為"TRANSFORMING NATIVE INST抓CTIONS INTO AN IMMUTA化E EXECUTA化E IMAGE"的美國(guó)臨時(shí)專(zhuān)利申請(qǐng)序列號(hào)61/ 919,654的優(yōu)先權(quán),該申請(qǐng)通過(guò)引用被結(jié)合于此W用于所有目的,就好像在本申請(qǐng)中完全闡 述了一樣。
技術(shù)領(lǐng)域
[0003] 本申請(qǐng)?jiān)O(shè)及軟件并且更具體而言設(shè)及用于在可執(zhí)行存儲(chǔ)器的寫(xiě)入受限的計(jì)算環(huán) 境中促進(jìn)動(dòng)態(tài)計(jì)算機(jī)代碼生成和使用的系統(tǒng)和方法。
【背景技術(shù)】
[0004] 用于促進(jìn)動(dòng)態(tài)代碼生成的軟件在各種苛刻的應(yīng)用中被采用,所述應(yīng)用包括網(wǎng)絡(luò)分 布式企業(yè)軟件、一般的基于Web的應(yīng)用,等等。運(yùn)種應(yīng)用常常要求可W高效適應(yīng)主機(jī)設(shè)備的 特征的可移植的獨(dú)立于平臺(tái)的軟件,所述主機(jī)設(shè)備包括具有顯著軟件行為限制(諸如可執(zhí) 行存儲(chǔ)器寫(xiě)入限制)的主機(jī)設(shè)備。
[0005] 計(jì)算機(jī)代碼在主機(jī)設(shè)備(諸如移動(dòng)設(shè)備或臺(tái)式計(jì)算機(jī))上的動(dòng)態(tài)或自動(dòng)生成可W 使得對(duì)計(jì)算機(jī)程序的快速調(diào)整能夠滿(mǎn)足給定實(shí)現(xiàn)的潛在變化的需求。動(dòng)態(tài)代碼生成可W特 別適于解釋性編程語(yǔ)言和關(guān)聯(lián)的解釋性應(yīng)用或程序,其中應(yīng)用不是在執(zhí)行之前首先被完全 編譯。在運(yùn)種情況下,軟件解釋器或即時(shí)編譯器可W在應(yīng)用運(yùn)行時(shí)期間處理計(jì)算機(jī)代碼。
[0006] 但是,利用動(dòng)態(tài)代碼生成的軟件常常不能被移植到不允許可執(zhí)行存儲(chǔ)器的寫(xiě)入的 計(jì)算環(huán)境和關(guān)聯(lián)的操作系統(tǒng),即,僅支持不可變的可執(zhí)行代碼的計(jì)算環(huán)境。具有限制可執(zhí)行 代碼修改的操作系統(tǒng)(或其它特征)的計(jì)算設(shè)備表示表現(xiàn)出不可變的計(jì)算環(huán)境的受限的平 臺(tái)。類(lèi)似地,限制可執(zhí)行存儲(chǔ)器的寫(xiě)入的操作系統(tǒng)可被稱(chēng)為受限的或受約束的操作系統(tǒng)。
[0007] 按照慣例,為了克服運(yùn)種限制并由此使動(dòng)態(tài)解釋性程序能夠在不可變的環(huán)境(例 如,表現(xiàn)出受約束的操作系統(tǒng))中運(yùn)行,程序通常必須與遠(yuǎn)程服務(wù)器交互。例如,程序可W由 與目標(biāo)設(shè)備通信的遠(yuǎn)程服務(wù)器執(zhí)行。
[000引但是,使用遠(yuǎn)程服務(wù)器來(lái)實(shí)現(xiàn)動(dòng)態(tài)或自適應(yīng)代碼生成會(huì)是極其緩慢并低效的。此 夕h運(yùn)種方法可能需要對(duì)潛在耗時(shí)的交叉編譯的昂貴支持,W考慮定義或表征運(yùn)行時(shí)計(jì)算 環(huán)境的不同目標(biāo)平臺(tái)特性,諸如中央處理單元(CPU)特征、操作系統(tǒng)字節(jié)序(endiannes),等 等。

【發(fā)明內(nèi)容】

[0009] -種示例方法促進(jìn)調(diào)整在可執(zhí)行存儲(chǔ)器的寫(xiě)入受限的計(jì)算環(huán)境中運(yùn)行的計(jì)算機(jī) 代碼。該示例方法包括利用虛擬機(jī)從軟件代碼生成第一可執(zhí)行映像,W及采用該第一可執(zhí) 行映像來(lái)選擇性地修改虛擬機(jī)和第一可執(zhí)行映像,從而產(chǎn)生更新的虛擬機(jī)和第二可執(zhí)行映 像,其中第二可執(zhí)行映像表示第一可執(zhí)行映像的更新版本。
[0010] 在更具體的實(shí)施例中,第一可執(zhí)行映像在存儲(chǔ)器中被選擇性地高速緩存。虛擬機(jī) 的解釋器和/或即時(shí)(JIT)編譯器促進(jìn)利用修改來(lái)更新第一可執(zhí)行映像。第一可執(zhí)行映像經(jīng) 由JIT編譯器被選擇性地運(yùn)行,W促進(jìn)生成第二可執(zhí)行映像。因此,可W通過(guò)采用該可執(zhí)行 映像的先前版本遞歸地更新可執(zhí)行映像來(lái)生成更新的可執(zhí)行映像。
[0011] 虛擬機(jī)的解釋器或JIT編譯器可W包括適于生成修改代碼、然后將修改代碼存儲(chǔ) 在匯編器文件中的代碼生成器。具體的示例方法還可W包括采用匯編器文件生成表示修改 代碼的可執(zhí)行庫(kù)。編譯鏈可W采用匯編器文件來(lái)促進(jìn)生成可執(zhí)行庫(kù)。
[0012] 虛擬機(jī)可W經(jīng)由包括JIT編譯器的修改的化tSpot(即,Java化tSpot性能引擎)虛 擬機(jī)來(lái)實(shí)現(xiàn)。第二可執(zhí)行映像(即,修改的映像)可W在也被稱(chēng)為主機(jī)平臺(tái)或目標(biāo)平臺(tái)的目 標(biāo)設(shè)備上動(dòng)態(tài)生成。修改的映像可W在其生成期間基于目標(biāo)設(shè)備的一個(gè)或多個(gè)特性(諸如 中央處理單元(CPU)特征)被調(diào)整。運(yùn)種特性可W是在被用來(lái)動(dòng)態(tài)生成計(jì)算機(jī)代碼的代碼生 成器的初始化期間可發(fā)現(xiàn)的。其它特性可經(jīng)由JIT編譯器中的剖析器(profiler)獲得。
[0013] 因此,本文所討論的實(shí)施例提供了用于促進(jìn)將動(dòng)態(tài)產(chǎn)生的計(jì)算機(jī)代碼(諸如機(jī)器 代碼)變換為一個(gè)或多個(gè)可執(zhí)行映像的各種特征和方法,其中可執(zhí)行映像可W在W其它方 式限制可執(zhí)行計(jì)算機(jī)代碼(例如可執(zhí)行文件)的修改的本地設(shè)備和關(guān)聯(lián)的環(huán)境中運(yùn)行。在系 統(tǒng)上維護(hù)的具有防止可執(zhí)行文件的修改(諸如通過(guò)自修改)的保障措施的可執(zhí)行文件在本 文中被稱(chēng)為不可變的可執(zhí)行映像,或簡(jiǎn)稱(chēng)為不可變的映像。
[0014] 相應(yīng)地,本文所討論的某些實(shí)施例使得在目標(biāo)設(shè)備上生成的動(dòng)態(tài)生成的代碼能夠 被修補(bǔ)。常規(guī)的解決方案缺乏有效的機(jī)制在受約束的計(jì)算環(huán)境中對(duì)動(dòng)態(tài)生成的代碼進(jìn)行修 補(bǔ)。此外,常規(guī)的解決方案不能自動(dòng)使用動(dòng)態(tài)信息,因?yàn)榇a需要在不同的平臺(tái)(諸如服務(wù) 器主機(jī))上生成。
[0015] 對(duì)于現(xiàn)有的動(dòng)態(tài)解決方案不能W其它方式無(wú)縫地應(yīng)用的計(jì)算環(huán)境,本文討論的某 些實(shí)施例通過(guò)修改現(xiàn)有的動(dòng)態(tài)解決方案(例如化tSpot解釋器)可容易地實(shí)現(xiàn)。
[0016] 本文所公開(kāi)的特定實(shí)施例的本質(zhì)和優(yōu)點(diǎn)的進(jìn)一步理解可W通過(guò)參照說(shuō)明書(shū)和附 圖的其余部分來(lái)實(shí)現(xiàn)。
【附圖說(shuō)明】
[0017] 圖1是示出第一示例性系統(tǒng)的圖,該系統(tǒng)使得動(dòng)態(tài)產(chǎn)生的可修補(bǔ)本地指令能夠變 換成不可變的可執(zhí)行映像。
[0018] 圖2是適于供圖1的示例系統(tǒng)使用的第一示例方法的流程圖。
[0019] 圖3是第二示例性系統(tǒng)的圖,示出了在不可變的計(jì)算環(huán)境中用于遞歸地更新可執(zhí) 行映像的方法中所采用的關(guān)鍵功能塊。
[0020] 圖4是適于供圖1-4的實(shí)施例使用的第二示例方法的流程圖。
【具體實(shí)施方式】
[0021] 本文所討論的各種示例系統(tǒng)和方法可W促進(jìn)修改現(xiàn)有的動(dòng)態(tài)計(jì)算解決方案,供在 W其它方式先前不適合的計(jì)算環(huán)境中使用。
[0022] 某些操作系統(tǒng),諸如i〇s'6(來(lái)自Apple?公司)禁止可執(zhí)行存儲(chǔ)器可寫(xiě)入。相應(yīng) 地,在運(yùn)種計(jì)算環(huán)境中的可執(zhí)行代碼被說(shuō)成是不可變的。但是,只支持不可變的代碼的計(jì)算 環(huán)境和伴隨的操作系統(tǒng)可能與基于動(dòng)態(tài)代碼生成和/或修補(bǔ)操作的常規(guī)高效方法不兼容, 其中動(dòng)態(tài)代碼生成和/或修補(bǔ)操作可被用于運(yùn)行經(jīng)由解釋性編程語(yǔ)言編寫(xiě)的軟件。
[0023] 為了克服運(yùn)些問(wèn)題,本文所討論的某些實(shí)施例適于利用現(xiàn)有的動(dòng)態(tài)代碼生成器 (例如,在Java? Hotspot性能引擎中,也簡(jiǎn)單地稱(chēng)為Hotspot?),選擇性地修改它們,從生 成在關(guān)聯(lián)的軟件應(yīng)用的后續(xù)運(yùn)行中有用的、更新的、或在其它方面不同的代碼,由此有效地 實(shí)現(xiàn)被用來(lái)運(yùn)行該軟件的可執(zhí)行代碼的修改。
[0024] 圖1示出了示例系統(tǒng)10,其適于在限制可執(zhí)行映像的修改的(例如,計(jì)算設(shè)備的)計(jì) 算環(huán)境中促進(jìn)運(yùn)行動(dòng)態(tài)生成的可執(zhí)行代碼22。眾所周知的部件和/或過(guò)程(無(wú)論是硬件還是 軟件,諸如硬盤(pán)驅(qū)動(dòng)器、處理器、操作系統(tǒng)、電源、類(lèi)加載器等等)可能沒(méi)有在圖或文字中示 出或討論。應(yīng)當(dāng)指出,在圖1中示為12-44的各個(gè)模塊可W與所示出的不同地組合和/或互 連。模塊可W與其它模塊組合、被省略或修改。另外的模塊可被添加。模塊可W用不同的名 稱(chēng)稱(chēng)呼,并且進(jìn)行其它變化,并且仍然提供適于本文所描述的實(shí)施例的系統(tǒng)。
[0025] 示例系統(tǒng)10可W在計(jì)算環(huán)境中運(yùn)行,所述計(jì)算環(huán)境例如包括設(shè)備和伴隨的受約束 或不可變的操作系統(tǒng),諸如iOS。系統(tǒng)10接收源代碼12,例如化va代碼,Java代碼經(jīng)由字節(jié)代 碼編譯器14被轉(zhuǎn)換成字節(jié)代碼。結(jié)果所得的字節(jié)代碼被轉(zhuǎn)發(fā)到虛擬機(jī)16,諸如修改的 化tSpot虛擬機(jī)。
[00%]示例虛擬機(jī)16包括具有即時(shí)(JIT)編譯器20的解釋器18 JIT編譯器20包括適于促 進(jìn)生成可執(zhí)行映像22的各種模塊24-34,其中映像22可W連同JIT編譯器20本身一起被更 新。所產(chǎn)生的充當(dāng)本地代碼(例如,為系統(tǒng)10在其上運(yùn)行的設(shè)備或者在該設(shè)備上產(chǎn)生或生成 的機(jī)器代碼)的可執(zhí)行映像22可W包括更新的解釋器代碼38連同化tSpot代碼40。然后,可 執(zhí)行映像22可被用來(lái)生成其自身的更新,等等。
[0027] 示例JIT編譯器20包括中間表示和優(yōu)化模塊24,該模塊采用來(lái)自字節(jié)代碼編譯器 14的字節(jié)代碼W生成被轉(zhuǎn)發(fā)到代碼生成器28(其包括匯編器30)的中間代碼表示,用于生成 修改的所生成代碼32。然后,變換器34促進(jìn)將修改的代碼32變換成可執(zhí)行映像22。
[0028] 剖析器26可W監(jiān)視解釋器18中的各個(gè)模塊,W促進(jìn)確定頻繁使用的代碼或者在其 它方面適于包括在可執(zhí)行映像22中的代碼,可執(zhí)行映像22可W在本地存儲(chǔ)器中被高速緩 存。
[0029] 可執(zhí)行映像22可W經(jīng)由運(yùn)行時(shí)引擎42被運(yùn)行。虛擬機(jī)16的各個(gè)模塊可W與一個(gè)或 多個(gè)控制器(諸如控制器44)通信,W促進(jìn)其間的通信和接口來(lái)滿(mǎn)足給定實(shí)現(xiàn)的需求。
[0030] 應(yīng)當(dāng)指出,在本示例實(shí)施例中,代碼仍然是在目標(biāo)設(shè)備上動(dòng)態(tài)生成的(即使由于執(zhí) 行約束而使它不能立即被使用)。運(yùn)允許對(duì)那個(gè)設(shè)備自動(dòng)優(yōu)化代碼,利用例如實(shí)際的CPU特 征(當(dāng)代碼生成器28被初始化時(shí)所發(fā)現(xiàn)的)或者在設(shè)備上運(yùn)行應(yīng)用時(shí)所收集的剖析信息。
[0031] 在特定的實(shí)施例中,示例系統(tǒng)10實(shí)現(xiàn)迭代過(guò)程。先前生成的解釋器可被用來(lái)開(kāi)始 化va應(yīng)用在設(shè)備上的執(zhí)行并產(chǎn)生對(duì)應(yīng)的J 口代碼36(而不立即使用該J 口代碼)。新映像22將 既包含JIT代碼36又包含解釋器38的新版本。更一般地,通過(guò)在設(shè)備上的先前執(zhí)行所產(chǎn)生的 映像被設(shè)備上的新運(yùn)行用來(lái)創(chuàng)建新的改進(jìn)的映像。
[0032] 示例系統(tǒng)10可W使用已經(jīng)在化tSpot中的動(dòng)態(tài)代碼生成器,修改它們W生成稍微 不同的代碼(即,迭代更新的代碼),該代碼隨后被保存并變換成在應(yīng)用將來(lái)運(yùn)行時(shí)可使用 的可執(zhí)行代碼。系統(tǒng)10還可W利用在Hotspot中存在的重定位和修補(bǔ)機(jī)構(gòu),修改它們W實(shí)現(xiàn) 對(duì)稍微不同的代碼的修補(bǔ),例如修補(bǔ)迭代更新。
[0033] 本地JIT代碼36是基于其有效中央處理單元(CPU)特征在實(shí)際的目標(biāo)設(shè)備上生成 的。運(yùn)還允許化tSpot JIT被原樣使用,從而令剖析器26確定如何優(yōu)化執(zhí)行,例如,通過(guò)檢測(cè) 被頻繁使用的代碼部分并且將代碼編譯到化tSpot 40中。當(dāng)前保存的格式可W經(jīng)由(例如, 匯編器30的)一個(gè)或多個(gè)匯編器文件被存儲(chǔ),其中匯編器文件可W直接或經(jīng)由編譯鏈被轉(zhuǎn) 換成本地可執(zhí)行庫(kù)。
[0034] 實(shí)施例提供動(dòng)態(tài)代碼程序在化tSpot中高效運(yùn)行。實(shí)施例可W利用化tSpo討丸行特 征來(lái)促進(jìn)生成在不可變的計(jì)算環(huán)境中可用的可執(zhí)行映像。
[0035] 或者因?yàn)橛美?在若干過(guò)程之間共享的代碼)或者因?yàn)閳?zhí)行上下文(不允許應(yīng)用程 序使用既可執(zhí)行又可寫(xiě)入的存儲(chǔ)器的操作系統(tǒng)),系統(tǒng)10促進(jìn)實(shí)現(xiàn)用于將使用動(dòng)態(tài)代碼生 成(像化tSpot解釋器和即時(shí)編譯器)的應(yīng)用變換成可W在動(dòng)態(tài)代碼生成或修補(bǔ)不合適時(shí)使 用的某物的方法。
[0036] 圖2是適于供圖1的設(shè)備和系統(tǒng)10使用的示例方法50的流程圖。示例方法50適于促 進(jìn)運(yùn)行動(dòng)態(tài)代碼程序。為了本討論的目的,動(dòng)態(tài)代碼程序可W是適于在被稱(chēng)為本地設(shè)備的 設(shè)備上被編譯或W其它方式被解釋的任何程序。例如,某些動(dòng)態(tài)代碼程序適于經(jīng)由解釋器 被解釋?zhuān)⑶耶?dāng)由該代碼指定的程序運(yùn)行時(shí)被有效地編譯。
[0037] 示例方法包括第一步驟52,該步驟設(shè)及使用虛擬機(jī)從軟件代碼生成第一可執(zhí)行映 像。
[0038] 第二步驟54包括采用第一可執(zhí)行映像選擇性地修改虛擬機(jī)和第一可執(zhí)行映像,從 而產(chǎn)生更新的虛擬機(jī)和第二可執(zhí)行映像,其中第二可執(zhí)行映像表示第一可執(zhí)行映像的更新 版本。
[0039] 在不背離本教導(dǎo)的范圍的情況下,示例方法50可W被增強(qiáng)或W其它方式被修改。 例如,方法50可被修改為指定第一虛擬機(jī)包括適于促進(jìn)生成第二可執(zhí)行映像的即時(shí)(JIT) 編譯器,其可W包括(可選地更新的)JIT代碼。
[0040] 備選示例方法包括使用虛擬機(jī)從軟件代碼生成第一可執(zhí)行映像;選擇性地高速緩 存第一可執(zhí)行映像;W及采用虛擬機(jī)和第一可執(zhí)行映像利用修改更新第一可執(zhí)行映像,從 而產(chǎn)生第二可執(zhí)行映像。第一可執(zhí)行映像可被運(yùn)行,W促進(jìn)生成第二可執(zhí)行映像。
[0041] 該備選示例方法還可W包括通過(guò)采用可執(zhí)行映像的先前版本遞歸地更新可執(zhí)行 映像,W生成更新的可執(zhí)行映像。
[0042] 困難會(huì)在變換某些類(lèi)型的指令時(shí)產(chǎn)生。例如,在原始代碼包括位置依賴(lài)于代碼在 哪里加載的尋址或其它引用的情況下,運(yùn)種地址或其它絕對(duì)引用可能需要被修改。有時(shí)候, 要被變換為用于在不可變的執(zhí)行環(huán)境中執(zhí)行的原始代碼包括自修改代碼的指令或操作,并 且運(yùn)種行為需要W不同的方式來(lái)實(shí)現(xiàn)。為了變換代碼W用于不同的計(jì)算環(huán)境而改變?cè)即?碼行為的具體例子的另外的細(xì)節(jié)W及其它細(xì)節(jié)可W在上面標(biāo)識(shí)出的美國(guó)臨時(shí)專(zhuān)利申請(qǐng)中 找到,該申請(qǐng)通過(guò)引用被結(jié)合于此。
[0043] 圖3是第二示例系統(tǒng)80的圖,示出了在不可變的計(jì)算環(huán)境70中用于遞歸地更新可 執(zhí)行映像78的方法中所采用的關(guān)鍵功能塊。示例系統(tǒng)80包括與剖析器檢測(cè)模塊72W及重定 位和修補(bǔ)機(jī)構(gòu)86通信的遞歸更新的解釋器74。
[0044] 應(yīng)當(dāng)指出,在不背離本教導(dǎo)的范圍的情況下,系統(tǒng)80的各個(gè)模塊的分組可W變化。 例如,剖析器檢測(cè)模塊72W及重定位和修補(bǔ)機(jī)構(gòu)86可W被包括在解釋器74中,并且,在不背 離本教導(dǎo)的范圍的情況下,示為包括在解釋器74中的某些模塊可被包括在解釋器74的外 部。
[0045] 此外,為了清晰,各個(gè)模塊沒(méi)有在圖3中特別示出,諸如間接陣列(indirection array)、元數(shù)據(jù)解析器、宏匯編器、存儲(chǔ)器管理器(及關(guān)聯(lián)的垃圾收集堆)、個(gè)體Cl和C2編譯 器(包括在化tSpot中的編譯器的名稱(chēng)),等等,但是能訪問(wèn)本教導(dǎo)的本領(lǐng)域技術(shù)人員可W容 易地根據(jù)需要為給定的實(shí)現(xiàn)確定要實(shí)現(xiàn)哪些部件W及如何實(shí)現(xiàn)它們,而無(wú)需過(guò)度實(shí)驗(yàn)。此 夕h本領(lǐng)域技術(shù)人員將認(rèn)識(shí)到,在不背離本教導(dǎo)的范圍的情況下,圖3的系統(tǒng)80可W經(jīng)由類(lèi) 似于圖1所示的系統(tǒng)來(lái)實(shí)現(xiàn)。
[0046] 為了本討論的目的,解釋器可W是適于無(wú)需首先編譯(即,轉(zhuǎn)換成機(jī)器語(yǔ)言或本地 代碼)整個(gè)程序就執(zhí)行計(jì)算機(jī)程序的指令的任何軟件或系統(tǒng)。經(jīng)由解釋性編程語(yǔ)言編寫(xiě)的 代碼常常在執(zhí)行過(guò)程中根據(jù)需要在字節(jié)代碼被處理之前被轉(zhuǎn)換成字節(jié)代碼。某些解釋器可 W經(jīng)由適于按段(例如,個(gè)體字節(jié)代碼)解釋和執(zhí)行字節(jié)代碼指令并且順序執(zhí)行運(yùn)些段的虛 擬機(jī)來(lái)實(shí)現(xiàn)。虛擬機(jī)可W通過(guò)處理和執(zhí)行個(gè)體字節(jié)代碼來(lái)實(shí)現(xiàn)方法調(diào)用。
[0047] JIT編譯器可W是一類(lèi)解釋器,其選擇性地將代碼(諸如字節(jié)代碼)編譯成本地語(yǔ) 言或機(jī)器語(yǔ)言,然后本地語(yǔ)言或機(jī)器語(yǔ)言被高速緩存,供將來(lái)從高速緩存執(zhí)行。對(duì)應(yīng)于被頻 繁使用的(即,熱的)過(guò)程(即,方法)的計(jì)算機(jī)代碼的段可被高速緩存為本地機(jī)器代碼W供 快速執(zhí)行,而其它執(zhí)行得不太頻繁的部分可W在解釋之前保持為字節(jié)代碼。剖析方法可W 被采用,W確定哪些過(guò)程是熱的W及哪些不是,W促進(jìn)確定哪些方法應(yīng)當(dāng)被編譯為本地代 碼并高速緩存。某些JIT編譯器可W在應(yīng)用執(zhí)行期間W及在引起被處理的代碼中(將使用機(jī) 器代碼的)對(duì)應(yīng)方法調(diào)用前一刻為應(yīng)用、類(lèi)庫(kù)等等生成機(jī)器代碼。
[0048] 示例解釋器74包括應(yīng)用執(zhí)行模塊76,該模塊可W執(zhí)行用解釋性編程語(yǔ)言(諸如 Java)編寫(xiě)的代碼。執(zhí)行引擎76可W被實(shí)現(xiàn)為修改的化tSpot執(zhí)行引擎。代碼生成器或產(chǎn)生 器90可W監(jiān)視應(yīng)用執(zhí)行,W促進(jìn)產(chǎn)生新代碼,諸如新的可執(zhí)行映像78。
[0049] 新的可執(zhí)行映像78包括所產(chǎn)生的JIT代碼82W及解釋器84的新修改版本。在JIT代 碼82的產(chǎn)生期間,元數(shù)據(jù)(諸如在解釋器74的初始化期間發(fā)現(xiàn)的CPU信息和在應(yīng)用執(zhí)行期間 發(fā)現(xiàn)的剖析信息)被利用W產(chǎn)生JIT代碼82和解釋器84的新修改版本。元數(shù)據(jù)可W基于相對(duì) 代碼偏移量被解析。已知的偏移量可W為解釋器74的將來(lái)運(yùn)行保留,如下面更充分討論的。
[0050] 可W表示動(dòng)態(tài)生成的代碼的新的可執(zhí)行映像78不要求存儲(chǔ)在常規(guī)的可執(zhí)行存儲(chǔ) 器中。例如,新的可執(zhí)行映像78可W經(jīng)由直接生成的本地庫(kù)和/或經(jīng)由低層類(lèi)(例如,匯編器 文件的匯編器)保存。此類(lèi)庫(kù)或文件可W在可執(zhí)行映像78的編譯期間由剖析器檢測(cè)模塊72 的匯編鏈轉(zhuǎn)換成可執(zhí)行庫(kù)。為了本討論的目的,編譯鏈可W是用來(lái)實(shí)現(xiàn)JIT編譯的計(jì)算機(jī)代 碼的任意集合。
[0051] 為了本討論的目的,動(dòng)態(tài)生成的代碼可W是任何自動(dòng)產(chǎn)生的代碼。自動(dòng)產(chǎn)生的代 碼可W由軟件基于變化的計(jì)算環(huán)境上下文或條件來(lái)產(chǎn)生。當(dāng)動(dòng)態(tài)生成的代碼(也被簡(jiǎn)稱(chēng)為 動(dòng)態(tài)代碼)在目標(biāo)設(shè)備或平臺(tái)上被自動(dòng)生成時(shí),動(dòng)態(tài)生成的代碼被說(shuō)成是本地產(chǎn)生的,其中 目標(biāo)設(shè)備或平臺(tái)諸如由計(jì)算環(huán)境70表示。在本文討論的各種實(shí)現(xiàn)中,動(dòng)態(tài)代碼是本地產(chǎn)生 的,并且因此,術(shù)語(yǔ)"動(dòng)態(tài)代碼"和"本地產(chǎn)生腳'代碼在本文中可W互換使用。
[0052] 重定位和修補(bǔ)機(jī)構(gòu)86可W表示修改的化tSpot重定位和修補(bǔ)機(jī)構(gòu),其適于修補(bǔ)新 的修改/更新的代碼,諸如由解釋器74的新修改版本84表示的代碼。重定位和修補(bǔ)機(jī)構(gòu)86可 W采用本地指令類(lèi)來(lái)促進(jìn)管理可執(zhí)行代碼W及實(shí)現(xiàn)對(duì)解釋器74的新修改版本84的修補(bǔ)。解 釋器74的新修改版本84表示在重新加載時(shí)可用來(lái)代替解釋器74的計(jì)算機(jī)代碼,如下面更充 分討論的。
[0053] 在修補(bǔ)解釋器的新修改版本84之后,剖析器檢測(cè)和編譯模塊72采用指令重新加載 模塊88來(lái)重新加載解釋器74,即,用表示新修改版本84的解釋器代替解釋器74。因此,指令 重新加載模塊88適于促進(jìn)執(zhí)行與解釋器的新修改版本84對(duì)應(yīng)的代碼。
[0054] 剖析器檢測(cè)和編譯模塊72還適于檢測(cè)熱方法,即,頻繁運(yùn)行的過(guò)程,然后根據(jù)需要 加載任何修補(bǔ)的或重定位的指令來(lái)實(shí)現(xiàn)將解釋器74的新修改版本84代替解釋器74。剖析器 檢測(cè)和編譯模塊72可W包括編譯鏈,或者可其它方式與編譯鏈通信,W促進(jìn)將解釋器 的新修改版本84的匯編器文件轉(zhuǎn)換成可用來(lái)生成用于運(yùn)行解釋器74的不可變的可執(zhí)行映 像的可執(zhí)行庫(kù)。在系統(tǒng)上維護(hù)的、具有防止可執(zhí)行文件修改的保障措施的可執(zhí)行文件在本 文中被稱(chēng)為不可變的可執(zhí)行映像,或簡(jiǎn)稱(chēng)為不可變的映像。
[0055] 相應(yīng)地,新的可執(zhí)行映像78表示在目標(biāo)設(shè)備(例如表示計(jì)算環(huán)境70的智能電話)上 動(dòng)態(tài)生成的代碼??蒞基于CPU特征和在代碼生成器90初始化期間發(fā)現(xiàn)的其它信息W及在 運(yùn)行應(yīng)用76時(shí)所收集的剖析信息對(duì)設(shè)備70自動(dòng)優(yōu)化動(dòng)態(tài)生成的代碼78。
[0056] 總之,系統(tǒng)80采用迭代過(guò)程,該過(guò)程使用先前生成的解釋器74開(kāi)始在設(shè)備70上執(zhí) 行化va應(yīng)用76;產(chǎn)生對(duì)應(yīng)的JIT代碼82; W及生成包括解釋器74的新版本84的新的可執(zhí)行映 像78。由先前執(zhí)行所產(chǎn)生的映像可被設(shè)備70上的新運(yùn)行用來(lái)創(chuàng)建新的改進(jìn)的映像84。重定 位和修補(bǔ)機(jī)構(gòu)86適于修補(bǔ)與解釋器74的新修改版本84對(duì)應(yīng)的新代碼。相應(yīng)地,在目標(biāo)設(shè)備 70上生成的動(dòng)態(tài)代碼78可W利用CPU特征、剖析信息等來(lái)生成可用作遞歸地更新的解釋器 的本地可執(zhí)行映像。
[0057] 本實(shí)施例的實(shí)現(xiàn)可W利用已經(jīng)在商業(yè)虛擬機(jī)內(nèi)的動(dòng)態(tài)代碼生成器(諸如 Hotspot),修改它們W生成稍微不同的代碼,所述稍微不同的代碼隨后被保存并變換成可 執(zhí)行映像78,該映像在應(yīng)用76的將來(lái)運(yùn)行時(shí)可用。
[0058] 類(lèi)似地,商業(yè)重定位和修補(bǔ)機(jī)構(gòu)可W被增強(qiáng),W實(shí)現(xiàn)稍微不同的修改代碼84的修 補(bǔ)。由于本地修改代碼78是在實(shí)際目標(biāo)設(shè)備70上基于其有效CPU特征等等生成的,因此某些 商業(yè)JIT(諸如化tSpot JIT)幾乎可W原樣使用。剖析器72可W在運(yùn)行解釋器74的時(shí)候確定 哪些方法是熱的,然后編譯它們。結(jié)果所得的重新加載的可執(zhí)行指令將等同于已生成的東 西,即,等同于新的可執(zhí)行映像78。應(yīng)當(dāng)指出,用于可執(zhí)行映像78的保存格式包括可被編譯 鏈轉(zhuǎn)換成可執(zhí)行庫(kù)的匯編器文件。作為替代,新的可執(zhí)行映像78可W直接作為本地代碼庫(kù) 被生成。
[0059] 應(yīng)當(dāng)指出,所生成的代碼(例如由代碼生成器90輸出的代碼)被修改為對(duì)在不同上 下文(例如,備用過(guò)程或?qū)?lái)運(yùn)行)中的使用有效。按照慣例,當(dāng)可執(zhí)行代碼被保護(hù)為不被寫(xiě) 時(shí),嵌在代碼中并且在執(zhí)行期間被動(dòng)態(tài)修改的值和地址將是不可修改的。
[0060] 為了解決運(yùn)個(gè)問(wèn)題,可W利用位置信息(諸如值和元數(shù)據(jù)自變量)調(diào)用匯編器類(lèi)。 位置信息被用來(lái)生成從可寫(xiě)存儲(chǔ)器中的間接陣列讀取在特定索引處的值的本地代碼。代替 讀取與由動(dòng)態(tài)代碼使用的缺省索引位置關(guān)聯(lián)的值,如果現(xiàn)有索引不可采用,則可W分配新 的間接索引。
[0061] 為了本討論的目的,間接陣列可W是適于存儲(chǔ)對(duì)其它對(duì)象或機(jī)構(gòu)(例如,類(lèi))的引 用(例如,名稱(chēng)、容器,等等)的任何編程語(yǔ)言機(jī)構(gòu)(例如,數(shù)組、表,等等)或?qū)ο?。陣列可W在 目標(biāo)平臺(tái)上的存儲(chǔ)器的可寫(xiě)數(shù)據(jù)段中并且可W容納對(duì)符號(hào)信息、數(shù)值、字符串指針等等的 引用。
[0062] 對(duì)于間接陣列中的每個(gè)索引,重定位類(lèi)型和值被記憶,W實(shí)現(xiàn)重用(當(dāng)可共享時(shí)) 并促進(jìn)間接陣列和足夠信息的后續(xù)保存,W便在將來(lái)運(yùn)行時(shí)正確初始化陣列。初始化值可 W是例如在用來(lái)實(shí)現(xiàn)解釋器74的JVM中的C++代碼的地址或者與新的可執(zhí)行映像78對(duì)應(yīng)的 所生成代碼中的其它地址。運(yùn)種初始化值在保存格式(例如,匯編器文件)方面可W由在鏈 接時(shí)由操作系統(tǒng)或編譯鏈透明解析的符號(hào)信息代替。
[0063] 為了促進(jìn)修補(bǔ),代替修補(bǔ)可執(zhí)行代碼,本地指令實(shí)現(xiàn)可W辨認(rèn)間接指令,然后根據(jù) 需要該從指令中自動(dòng)提取索引,用于修補(bǔ)在該索引處的條目。
[0064] 為了確保嵌在代碼中的常數(shù)值和地址對(duì)備用過(guò)程或?qū)?lái)運(yùn)行是正確的,Hotspot 代碼可W被容易地增強(qiáng),W根據(jù)需要指定新的重定位類(lèi)型W供間接陣列使用。
[0065] 為了確保任何懶惰地生成的粧程序(即,直到它們第一次被需要才產(chǎn)生的粧程序, 與它們可用時(shí)相對(duì))(例如,用于本地方法調(diào)用的優(yōu)化粧程序)不會(huì)從生成的代碼中缺失,可 W對(duì)本地方法調(diào)用優(yōu)化用于解釋器74的粧程序。代碼產(chǎn)生器可W被增強(qiáng),W便將唯一名稱(chēng) 與運(yùn)些粧程序關(guān)聯(lián),W實(shí)現(xiàn)從保存的可執(zhí)行代碼重新加載粧程序。運(yùn)可W有助于確保為缺 失的粧程序生成的新代碼在不支持動(dòng)態(tài)代碼的系統(tǒng)上不被激活。
[0066] 為了本討論的目的,粧程序可W是用作其它編程語(yǔ)言功能的占位符或代替的代碼 段。示例粧程序表示聲明的類(lèi)、函數(shù)、過(guò)程、或向粧程序的位置的調(diào)用者返回有效值的其它 例程。
[0067] 為了支持編譯的代碼,當(dāng)在本地代碼、解釋的代碼和編譯的代碼之間切換時(shí),提供 強(qiáng)制粧程序。運(yùn)可W通過(guò)確保強(qiáng)制粧程序不是懶惰地生成而是被唯一地命名并在編譯時(shí)對(duì) 所有編譯的方法生成來(lái)進(jìn)行。
[0068] 按照慣例,編譯器相關(guān)的動(dòng)態(tài)粧程序是內(nèi)聯(lián)高速緩存(1C)粧程序。運(yùn)些相對(duì)短命 的動(dòng)態(tài)修補(bǔ)1C粧程序在過(guò)渡期內(nèi)被使用(例如,為了原子性目的)并定期被丟棄。為了本討 論的目的,內(nèi)聯(lián)高速緩存可W是任何技術(shù),由此在計(jì)算機(jī)程序中的調(diào)用點(diǎn)處對(duì)例程(例如, 方法查找)的先前調(diào)用的結(jié)果存儲(chǔ)在該調(diào)用點(diǎn)。內(nèi)聯(lián)高速緩存方法可W促進(jìn)運(yùn)行時(shí)優(yōu)化,從 而通過(guò)直接在調(diào)用點(diǎn)(call si曲t)處記住先前方法查找的結(jié)果來(lái)加速運(yùn)行時(shí)方法綁定。
[0069] 為了實(shí)現(xiàn)本文所討論的某些實(shí)施例,現(xiàn)有的化tSpot邏輯可W被更改,W使用由數(shù) 據(jù)陣列參數(shù)化的兩個(gè)不可變的粧程序。相應(yīng)地,代替動(dòng)態(tài)分配和修補(bǔ)1C粧程序,數(shù)據(jù)陣列可 W被動(dòng)態(tài)分配和修補(bǔ)。應(yīng)當(dāng)指出,利用可修補(bǔ)的數(shù)據(jù)陣列補(bǔ)充的通用的不可變的粧程序表 現(xiàn)得像原始可修補(bǔ)的動(dòng)態(tài)生成的代碼。
[0070] 應(yīng)當(dāng)指出,在一般情況下,Hotspot代碼生成器(例如,解釋器、編譯器和粧程序生 成器)利用被稱(chēng)為匯編器的低層類(lèi)來(lái)產(chǎn)生可執(zhí)行代碼。代碼隨后通過(guò)本地指令類(lèi)被管理,W 處理代碼修補(bǔ)。本領(lǐng)域技術(shù)人員將認(rèn)識(shí)到,本文所討論的設(shè)及對(duì)現(xiàn)有化tSpot代碼生成器的 增強(qiáng)的實(shí)施例的實(shí)現(xiàn)可W經(jīng)由對(duì)化tSpot代碼生成器的低層分層(例如,匯編器類(lèi)和本地指 令類(lèi))的調(diào)整來(lái)實(shí)現(xiàn)。
[0071] 為了確保動(dòng)態(tài)修改的代碼序列保持可修補(bǔ),某些現(xiàn)有的化tSpot方法可W被擴(kuò)展 成將可修補(bǔ)代碼與間接陣列中的加索引條目關(guān)聯(lián)。按照慣例,運(yùn)些現(xiàn)有的化tSpot方法設(shè)及 跳轉(zhuǎn)到調(diào)用運(yùn)行時(shí)文件W便在第一次運(yùn)行時(shí)執(zhí)行附加邏輯(例如,類(lèi)加載、類(lèi)初始化、字段 解析,等等)的額外本地指令。在運(yùn)些額外的步驟之后,初始跳轉(zhuǎn)代碼被優(yōu)化的指令代替。經(jīng) 解析的常數(shù)直接在寄存器中加載或者利用訪問(wèn)存儲(chǔ)器的偏移量或地址來(lái)解析。能訪問(wèn)本教 導(dǎo)的本領(lǐng)域技術(shù)人員可W容易地?cái)U(kuò)展運(yùn)種現(xiàn)有的化tSpot方法,W將可修補(bǔ)代碼與間接陣 列中的加索引條目關(guān)聯(lián),W根據(jù)需要滿(mǎn)足給定實(shí)現(xiàn)的需要。
[0072] 為了最小化對(duì)現(xiàn)有化tSpot代碼所需的改變,可W僅當(dāng)關(guān)聯(lián)的間接條目具有指示 它尚未被正確初始化的特定值時(shí)才跳轉(zhuǎn)到調(diào)用運(yùn)行時(shí)文件的額外本地指令。作為替代,初 始化值可被用來(lái)迫使使用特定值的指令導(dǎo)致錯(cuò)誤。運(yùn)個(gè)錯(cuò)誤可W被運(yùn)行時(shí)文件捕獲并辨 認(rèn),由此觸發(fā)額外的運(yùn)行時(shí)邏輯的執(zhí)行。在運(yùn)兩種情況下,由運(yùn)行時(shí)文件執(zhí)行的修補(bǔ)都更新 間接值,而不修改代碼。
[0073] 應(yīng)當(dāng)指出,在本示例實(shí)施例中,用于保存所生成的代碼(例如保存圖3的新的可執(zhí) 行映像78) W及在將來(lái)運(yùn)行或其它過(guò)程中重新加載所生成的代碼的機(jī)構(gòu)包括對(duì)增量代碼生 成的支持。此外,示例解釋器74適于支持被化tSpot用于正被執(zhí)行的所生成代碼的元數(shù)據(jù) (例如,指定代碼序列類(lèi)型的元數(shù)據(jù)、用于該序列的找、普通對(duì)象指針(OOP)映射,等等)。
[0074] 元數(shù)據(jù)常?;谙鄬?duì)代碼偏移量被解析。在本示例實(shí)施例中,本地代碼是直接生 成的,并且偏移量是已知的W及保留W用于將來(lái)運(yùn)行。為了通過(guò)編輯和化tSpot解釋器實(shí)現(xiàn) 本文所討論的某些實(shí)施例,本領(lǐng)域技術(shù)人員可W容易地確定哪些元數(shù)據(jù)經(jīng)由絕對(duì)地址被引 用,然后根據(jù)需要用相對(duì)地址代替絕對(duì)地址。
[0075] 應(yīng)當(dāng)指出,每個(gè)代碼序列(或代碼序列的組)與唯一名稱(chēng)關(guān)聯(lián)。該名稱(chēng)允許檢索該 代碼序列(或代碼序列的組)的先前生成的版本W(wǎng)及使用檢索出的版本而不是新生成的版 本。
[0076] 重映射可被用來(lái)支持增量生成。對(duì)于每條生成的代碼,新生成的代碼地址與重新 加載的版本(例如,已經(jīng)在可執(zhí)行映像中預(yù)生成的版本)的地址關(guān)聯(lián)。重新加載的版本被發(fā) 送回代碼產(chǎn)生器(因?yàn)樾律傻陌姹静皇强蓤?zhí)行的)。
[0077] 當(dāng)生成跳轉(zhuǎn)到或W其它方式調(diào)用重映射的地址的指令時(shí),使用重映射的地址。運(yùn) 有助于確保生成的代碼是一致的并且不引用重新加載的映像。運(yùn)種重映射可W由較低的匯 編器層透明地執(zhí)行。
[0078] 此外,為了促進(jìn)運(yùn)行時(shí)執(zhí)行,所生成的代碼和間接陣列(或表)被轉(zhuǎn)儲(chǔ)(例如,轉(zhuǎn)儲(chǔ) 到用于動(dòng)態(tài)存儲(chǔ)器分配的JVM存儲(chǔ)器堆)。某些間接陣列值可W在鏈接-編輯時(shí)(例如,由編 譯鏈或操作系統(tǒng)鏈接器)自動(dòng)處理。其它值可W根據(jù)新過(guò)程中動(dòng)態(tài)分配的地址進(jìn)行設(shè)置。
[0079] 新過(guò)程解析重定位信息W發(fā)現(xiàn)哪些索引需要被固定,保存的值足W允許新過(guò)程發(fā) 現(xiàn)用于運(yùn)些索引的適當(dāng)值。在本示例實(shí)施例中,轉(zhuǎn)儲(chǔ)的文件還包括字典,其允許檢索與給定 名稱(chēng)對(duì)應(yīng)的保存塊內(nèi)的偏移量。
[0080] 應(yīng)當(dāng)指出,某些實(shí)施例可W支持經(jīng)由編譯代碼高速緩存方法對(duì)JIT編譯代碼的保 存,由此編譯代碼利用包括編譯代碼的符號(hào)版本的符號(hào)信息被保存在數(shù)據(jù)文件中。
[0081] 在后續(xù)執(zhí)行中,數(shù)據(jù)文件被例如指令重新加載模塊88重新加載。然后,編譯器(例 如,如由執(zhí)行引擎76表示的)發(fā)現(xiàn)編譯的先前結(jié)果、將所保存的代碼(調(diào)用預(yù)生成的代碼)拷 貝到代碼堆(即,轉(zhuǎn)儲(chǔ)代碼),然后在執(zhí)行重定位時(shí)(例如,經(jīng)由重定位和修補(bǔ)模塊86)解析所 有的符號(hào)引用。
[0082] 編譯器優(yōu)化可W被關(guān)閉,使得所生成的代碼較少依賴(lài)于上下文信息,諸如假設(shè)類(lèi) 已經(jīng)被初始化的信息。一旦被加載并安裝,從高速緩存中加載的方法就等同于新動(dòng)態(tài)生成 的方法那樣表現(xiàn)。
[0083] 為了促進(jìn)處理動(dòng)態(tài)代碼,代碼堆(例如,由存儲(chǔ)器管理器維護(hù)的堆,諸如系統(tǒng)80的 模塊可訪問(wèn)的垃圾收集器)的快照可W連同鏈接信息一起保存。然后,快照可W被變換成可 執(zhí)行代碼,并鏈接到重建的JVM。當(dāng)執(zhí)行新JVM時(shí),鏈接信息使得能夠使用預(yù)生成的可執(zhí)行代 碼來(lái)代替新的代碼堆中的代碼。
[0084] 雖然預(yù)生成的可執(zhí)行代碼在被使用之前不修改,但是本JVM(用來(lái)實(shí)現(xiàn)系統(tǒng)80)適 于選擇預(yù)生成的版本,而不是在代碼堆中的新代碼。后端處理可W自動(dòng)將簡(jiǎn)單的加載、存 儲(chǔ)、調(diào)用和其它類(lèi)型的指令變換成通過(guò)讀取來(lái)自可修補(bǔ)間接陣列的指令目標(biāo)來(lái)啟動(dòng)的指 令。
[0085] 總之,系統(tǒng)80使得動(dòng)態(tài)生成的可執(zhí)行代碼能夠在W其它方式限制可執(zhí)行映像的修 改的計(jì)算環(huán)境中的運(yùn)行。可執(zhí)行映像可W根據(jù)本教導(dǎo)在不可變的計(jì)算環(huán)境中被遞歸更新。 因此,系統(tǒng)80使得動(dòng)態(tài)生成的可修補(bǔ)本地指令能夠被變換成不可變的可執(zhí)行映像。
[0086] 圖4是適于供圖1-4的實(shí)施例使用的第二示例方法100的流程圖。方法100促進(jìn)在限 制可執(zhí)行映像的修改的計(jì)算環(huán)境中運(yùn)行動(dòng)態(tài)生成的可執(zhí)行代碼。
[0087] 第二示例方法100包括初始執(zhí)行步驟102,該步驟包括開(kāi)始執(zhí)行解釋性應(yīng)用(也稱(chēng) 為解釋性程序),即,適于經(jīng)由解釋器或JIT編譯器進(jìn)行處理的應(yīng)用。
[0088] 確定步驟104包括參照平臺(tái)特性確定要對(duì)解釋器或JIT編譯器進(jìn)行的一個(gè)或多個(gè) 修改。
[0089] 后續(xù)的生成步驟106包括使用解釋器和伴隨的代碼生成器生成可執(zhí)行映像,該可 執(zhí)行映像包括已根據(jù)在前面確定步驟104中確定的一個(gè)或多個(gè)修改被修改的解釋器的版 本。不必立即被運(yùn)行(即,執(zhí)行)的所生成的可執(zhí)行映像可W包括JIT代碼連同解釋器的新修 改版本。
[0090] 接下來(lái),修補(bǔ)步驟108包括采用重定位和修補(bǔ)機(jī)構(gòu)(該機(jī)制可W被包括在解釋器 中),W修補(bǔ)關(guān)于解釋器的新修改版本的代碼。為了本討論的目的,重定位和修補(bǔ)機(jī)構(gòu)可W 是適于促進(jìn)調(diào)整對(duì)部分計(jì)算機(jī)代碼(例如,編程語(yǔ)言類(lèi))的引用和/或代替或插入被其它計(jì) 算機(jī)代碼調(diào)用的部分計(jì)算機(jī)代碼的任何計(jì)算機(jī)代碼。本領(lǐng)域技術(shù)人員可W容易地增強(qiáng)或W 其它方式修改JIT重定位和修補(bǔ)機(jī)構(gòu),W實(shí)現(xiàn)對(duì)修改的解釋器代碼的修補(bǔ),W供根據(jù)本教導(dǎo) 的實(shí)施例使用。
[0091] 后續(xù)的重新加載步驟110包括采用修補(bǔ)的代碼來(lái)促進(jìn)用新修改的解釋器重新加載 解釋器,從而產(chǎn)生解釋器的新修改版本的執(zhí)行。剖析器(諸如化tSpot JVMQava虛擬機(jī))剖 析器)可W容易地被調(diào)整,W促進(jìn)例如經(jīng)由動(dòng)態(tài)重新編譯將解釋器重新加載為更新的解釋 器。
[0092] 除非發(fā)生斷開(kāi)(諸如由關(guān)斷目標(biāo)設(shè)備和/或底層軟件所引起的斷開(kāi)),如在示例斷 開(kāi)-檢查步驟112中確定的,否則步驟102-110重復(fù)。
[0093] 在不背離本教導(dǎo)的范圍的情況下,方法100是說(shuō)明性的并且可W變化。例如,在不 背離本教導(dǎo)的范圍的情況下,可W添加另外的步驟,并且某些步驟可W被省略或重新排列。
[0094] 雖然已經(jīng)關(guān)于其特定實(shí)施例描述了本說(shuō)明書(shū),但運(yùn)些特定實(shí)施例僅僅是說(shuō)明性 的,而不是限制性的。例如,雖然本發(fā)明的實(shí)施例可W關(guān)于特定的操作系統(tǒng)或環(huán)境(諸如 iOS)和語(yǔ)言(諸如化va)來(lái)描述,但是實(shí)施例的各個(gè)特征或方面可W根據(jù)期望在其它計(jì)算環(huán) 境和語(yǔ)言中使用或被調(diào)整W在其中使用。對(duì)iOS和化va的引用僅僅是說(shuō)明性的例子。雖然動(dòng) 態(tài)代碼生成器是為了產(chǎn)生要變換的原始代碼而描述的,但是用于生成原始代碼的任何其它 合適方法都可W適用于本發(fā)明的實(shí)施例。
[0095] 此外,雖然某些實(shí)施例是參照解釋器的動(dòng)態(tài)更新討論的,但是實(shí)施例不限于此。在 不背離本教導(dǎo)的范圍的情況下,本文所討論的某些方法可W適于供用于與JVM的不同實(shí)例 共享編譯代碼的提前編譯器和系統(tǒng)使用。
[0096] 任何合適的編程語(yǔ)言都可被用來(lái)實(shí)現(xiàn)特定實(shí)施例的例程,所述編程語(yǔ)言包括C、C+ + Java、匯編語(yǔ)言等。可W采用不同的編程技術(shù),諸如過(guò)程式的或者面向?qū)ο蟮摹@炭蒞 在單個(gè)處理設(shè)備上或者多個(gè)處理器上執(zhí)行。雖然步驟、操作或者計(jì)算可W按具體的次序給 出,但是運(yùn)個(gè)次序在不同的特定實(shí)施例中可W變化。在一些特定的實(shí)施例中,在本說(shuō)明書(shū)順 序示出的多個(gè)步驟可W同時(shí)執(zhí)行。
[0097] 特定的實(shí)施例可W在由指令執(zhí)行系統(tǒng)、裝置、系統(tǒng)或設(shè)備使用或者與其結(jié)合使用 的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)中實(shí)現(xiàn)。特定的實(shí)施例可W按控制邏輯的形式在軟件或硬件或者運(yùn) 兩者的組合中實(shí)現(xiàn)。當(dāng)被一個(gè)或多個(gè)處理器執(zhí)行時(shí),控制邏輯可W操作W執(zhí)行在特定實(shí)施 例中所描述的方法。
[0098] 特定的實(shí)施例可W通過(guò)使用編程的通用數(shù)字計(jì)算機(jī)、通過(guò)使用專(zhuān)用集成電路、可 編程邏輯器件、現(xiàn)場(chǎng)可編程口陣列、光、化學(xué)、生物、量子或納米系統(tǒng)、部件和機(jī)構(gòu)來(lái)實(shí)現(xiàn)。一 般而言,特定實(shí)施例的功能可W由本領(lǐng)域中已知的任何方式實(shí)現(xiàn)??蒞使用分布式、聯(lián)網(wǎng)的 系統(tǒng)、部件和/或電路。數(shù)據(jù)的通信或傳輸可W是有線的、無(wú)線的或者通過(guò)任何其它方式。
[0099] 還應(yīng)當(dāng)認(rèn)識(shí)到,根據(jù)對(duì)特定應(yīng)用有用而言,附圖中繪出的一個(gè)或多個(gè)元素還可W 按更分離或更集成的方式實(shí)現(xiàn),或者甚至在某些情況下被除去或者使其不可操作。實(shí)現(xiàn)可 W存儲(chǔ)在機(jī)器可讀介質(zhì)中的程序或代碼W便允許計(jì)算機(jī)執(zhí)行上述任何方法也在所述精神 與范圍內(nèi)。
[0100] 如在本文描述中和貫穿W下權(quán)利要求所使用的,除非上下文明確地另外指明,否 則V'和"an" W及"該"也包括復(fù)數(shù)引用。而且,如在本文描述中和貫穿W下權(quán)利要求所使用 的,除非上下文明確地另外指明,否則巧…中"的意義包括巧…中"和巧…上"。
[0101] 因此,雖然本文已經(jīng)描述了特定實(shí)施例,但是在上述公開(kāi)內(nèi)容中預(yù)期修改、各種變 化和替換的自由度,而且應(yīng)當(dāng)認(rèn)識(shí)到,在不背離所述范圍與精神的情況下,在一些情況下, 特定實(shí)施例的某些特征將在沒(méi)有其它特征的對(duì)應(yīng)使用的情況下采用。因此,可W進(jìn)行許多 修改,使特定的情形或材料適應(yīng)基本范圍與精神。
【主權(quán)項(xiàng)】
1. 一種適于促進(jìn)運(yùn)行動(dòng)態(tài)代碼程序的方法,該方法包括: 利用虛擬機(jī)從軟件代碼生成第一可執(zhí)行映像;及 采用第一可執(zhí)行映像選擇性地修改虛擬機(jī)和第一可執(zhí)行映像,從而產(chǎn)生更新的虛擬機(jī) 和第二可執(zhí)行映像,其中第二可執(zhí)行映像表示第一可執(zhí)行映像的更新版本。2. 如權(quán)利要求1所述的方法,其中第一虛擬機(jī)包括適于促進(jìn)生成第二可執(zhí)行映像的即 時(shí)JIT編譯器。3. 如權(quán)利要求1所述的方法,還包括: 選擇性地高速緩存由虛擬機(jī)從軟件代碼生成的第一可執(zhí)行映像;及 采用虛擬機(jī)和第一可執(zhí)行映像利用修改更新第一可執(zhí)行映像,從而產(chǎn)生第二可執(zhí)行映 像。4. 如權(quán)利要求3所述的方法,還包括選擇性地運(yùn)行第一可執(zhí)行映像,以促進(jìn)生成第二可 執(zhí)行映像。5. 如權(quán)利要求3所述的方法,其中軟件代碼包括字節(jié)代碼。6. 如權(quán)利要求5所述的方法,還包括通過(guò)采用可執(zhí)行映像的先前版本遞歸地更新可執(zhí) 行映像來(lái)生成更新的可執(zhí)行映像。7. 如權(quán)利要求6所述的方法,其中虛擬機(jī)包括解釋器。8. 如權(quán)利要求7所述的方法,其中解釋器包括適于生成修改代碼的代碼生成器。9. 如權(quán)利要求8所述的方法,還包括在匯編器文件中存儲(chǔ)修改代碼。10. 如權(quán)利要求9所述的方法,還包括采用匯編器文件來(lái)促進(jìn)生成表示修改代碼的可執(zhí) 行庫(kù)。11. 如權(quán)利要求10所述的方法,還包括采用編譯鏈和匯編器文件來(lái)促進(jìn)生成可執(zhí)行庫(kù)。12. 如權(quán)利要求5所述的方法,其中虛擬機(jī)包括HotSpot虛擬機(jī)。13. 如權(quán)利要求12所述的方法,其中HotSpot虛擬機(jī)包括即時(shí)JIT編譯器。14. 如權(quán)利要求1所述的方法,還包括在目標(biāo)設(shè)備上動(dòng)態(tài)生成包括在第二可執(zhí)行映像中 的計(jì)算機(jī)代碼。15. 如權(quán)利要求14所述的方法,還包括在動(dòng)態(tài)生成的計(jì)算機(jī)代碼的生成期間基于目標(biāo) 設(shè)備的一個(gè)或多個(gè)特性調(diào)整動(dòng)態(tài)生成的計(jì)算機(jī)代碼。16. 如權(quán)利要求15所述的方法,其中所述一個(gè)或多個(gè)特性包括目標(biāo)設(shè)備的中央處理單 元CPU的特性。17. 如權(quán)利要求16所述的方法,還包括在用來(lái)動(dòng)態(tài)生成計(jì)算機(jī)代碼的代碼生成器的初 始化期間發(fā)現(xiàn)所述一個(gè)或多個(gè)特性或關(guān)于所述一個(gè)或多個(gè)特性的信息。18. 如權(quán)利要求15所述的方法,其中所述一個(gè)或多個(gè)特性包括來(lái)自剖析器的信息。19. 一種裝置,包括: 數(shù)字處理器,耦合到顯示器并耦合到處理器可讀存儲(chǔ)設(shè)備,其中處理器可讀存儲(chǔ)設(shè)備 包括可由數(shù)字處理器執(zhí)行以便執(zhí)行以下動(dòng)作的一條或多條指令: 利用虛擬機(jī)從軟件代碼生成第一可執(zhí)行映像;及 采用第一可執(zhí)行映像選擇性地修改虛擬機(jī)和第一可執(zhí)行映像,從而產(chǎn)生更新的虛擬機(jī) 和第二可執(zhí)行映像,其中第二可執(zhí)行映像表示第一可執(zhí)行映像的更新版本。20. -種處理器可讀存儲(chǔ)設(shè)備,包括可由數(shù)字處理器執(zhí)行的指令,該處理器可讀存儲(chǔ)設(shè) 備包括用于進(jìn)行以下操作的一條或多條指令: 利用虛擬機(jī)從軟件代碼生成第一可執(zhí)行映像;及 采用第一可執(zhí)行映像選擇性地修改虛擬機(jī)和第一可執(zhí)行映像,從而產(chǎn)生更新的虛擬機(jī) 和第二可執(zhí)行映像,其中第二可執(zhí)行映像表示第一可執(zhí)行映像的更新版本。
【文檔編號(hào)】G06F9/455GK105830023SQ201480068934
【公開(kāi)日】2016年8月3日
【申請(qǐng)日】2014年5月1日
【發(fā)明人】M·B·黛爾沙特
【申請(qǐng)人】甲骨文國(guó)際公司
網(wǎng)友詢(xún)問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1