使用動(dòng)態(tài)編程語(yǔ)言的元數(shù)據(jù)的運(yùn)行時(shí)優(yōu)化的制作方法
【專利摘要】本發(fā)明描述了一種方法和裝置,所述方法和裝置使用相對(duì)于所述數(shù)據(jù)結(jié)構(gòu)集合描述了所述鍵的屬性的元數(shù)據(jù),對(duì)鍵索引數(shù)據(jù)結(jié)構(gòu)集合中的鍵的操作進(jìn)行優(yōu)化。元數(shù)據(jù)可對(duì)應(yīng)于動(dòng)態(tài)更新的高速緩存以指示不變量,該不變量對(duì)于處于數(shù)據(jù)結(jié)構(gòu)集合的當(dāng)前狀態(tài)的鍵而言為真??杀苊庥糜谠阪I的數(shù)據(jù)結(jié)構(gòu)集合上進(jìn)行搜索的昂貴計(jì)算。例如,如果已知鍵始終(或從不)標(biāo)引某些特定的值,或者這些值具有在處于當(dāng)前狀態(tài)的系統(tǒng)的全局范圍內(nèi)的任何所述數(shù)據(jù)結(jié)構(gòu)集合中的某些元屬性,則可能根本無(wú)需在數(shù)據(jù)結(jié)構(gòu)集合上進(jìn)行昂貴的查找操作。
【專利說(shuō)明】使用動(dòng)態(tài)編程語(yǔ)言的元數(shù)據(jù)的運(yùn)行時(shí)優(yōu)化
[0001]相關(guān)專利申請(qǐng)的交叉引用
[0002]本申請(qǐng)與由Filip Pizlo等人于2012年2月3日提交的名稱為“RUNHMECOMPILATION FOR DYNAMIC PROGRAMMING LANGUAGES”的美國(guó)臨時(shí)專利申請(qǐng)?zhí)?61/594,983、由Filip Pizlo等人于2012年2月 15 日提交的名稱為“RUNTIME COMPILATION FOR DYNAMICPROGRAMMING LANGUAGES”的美國(guó)臨時(shí)專利申請(qǐng)?zhí)?1/599,309相關(guān)并要求其權(quán)益,這兩個(gè)專利據(jù)此全文以引用方式并入本文。
【技術(shù)領(lǐng)域】
[0003]本發(fā)明整體涉及運(yùn)行時(shí)編譯。更具體地,本發(fā)明涉及基于動(dòng)態(tài)語(yǔ)言的源代碼的基于元數(shù)據(jù)的運(yùn)行時(shí)優(yōu)化。
【背景技術(shù)】
[0004]不含任何種類類型注釋的動(dòng)態(tài)語(yǔ)言越來(lái)越普遍。例如,JavaScript已經(jīng)成為萬(wàn)維網(wǎng)的通用語(yǔ)言,而Ruby、Python、Perl和PHP已經(jīng)成為服務(wù)器端基礎(chǔ)架構(gòu)的標(biāo)準(zhǔn)語(yǔ)言。然而,當(dāng)可能未提供優(yōu)化編譯策略以編譯代碼時(shí),基于動(dòng)態(tài)語(yǔ)言的代碼的運(yùn)行時(shí)可能需要顯著開(kāi)銷。
[0005]例如,JavaScript不允許程序指定變量的類型。因此,在運(yùn)行時(shí)期間,變量可被動(dòng)態(tài)轉(zhuǎn)換為不同執(zhí)行路徑中的獨(dú)立類型。此類轉(zhuǎn)換可能在計(jì)算上開(kāi)銷大,使整體性能受到重大影響。另外,動(dòng)態(tài)創(chuàng)建的數(shù)據(jù)類型可能需要索引數(shù)據(jù)結(jié)構(gòu)(例如字典)間大量的查找或搜索操作,以將類型分配到數(shù)據(jù)或訪問(wèn)特定類型數(shù)據(jù)的屬性。
[0006]此外,需要現(xiàn)代JavaScript引擎來(lái)非??焖俚貓?zhí)行非可信代碼,并且由于這個(gè)原因,通過(guò)諸如即時(shí)(JIT)編譯的機(jī)制而使用運(yùn)行時(shí)代碼生成,攻擊者可利用這一點(diǎn)繞過(guò)操作系統(tǒng)/硬件保護(hù)。現(xiàn)有保護(hù)技術(shù)例如常量盲化可用于阻止此類攻擊。然而,這些技術(shù)可在存儲(chǔ)器使用和處理器執(zhí)行時(shí)間兩方面引發(fā)目標(biāo)代碼的性能成本,無(wú)論所執(zhí)行的目標(biāo)代碼是否具有風(fēng)險(xiǎn)。
[0007]因此,傳統(tǒng)的動(dòng)態(tài)運(yùn)行時(shí)編譯方法往往是昂貴、低效和未優(yōu)化的。
【發(fā)明內(nèi)容】
[0008]可隨機(jī)地且不頻繁地分配跟蹤器數(shù)據(jù)(例如,堆分配單元或跟蹤彈(tracerbullet))以分析從起源代碼位置和目標(biāo)代碼位置流出的值以便優(yōu)化編譯代碼。跟蹤器數(shù)據(jù)可包括或裝箱某個(gè)值以及該值在源代碼或程序中的相應(yīng)起源(或來(lái)源)。值的起源可指示值在源代碼中的生成位置。在一個(gè)實(shí)施例中,可在運(yùn)行時(shí)期間將值存儲(chǔ)在存儲(chǔ)器中時(shí)創(chuàng)建跟蹤器數(shù)據(jù)。來(lái)源可以是標(biāo)識(shí)用于存儲(chǔ)該值的代碼位置(例如行號(hào))的指針寬度字。可將特定的類型或標(biāo)簽與跟蹤器數(shù)據(jù)相關(guān)聯(lián)以迫使使用(或訪問(wèn)、標(biāo)引)跟蹤器數(shù)據(jù)的代碼執(zhí)行或操作采用慢速路徑,因?yàn)榭赡軣o(wú)法在源代碼中對(duì)跟蹤器數(shù)據(jù)進(jìn)行現(xiàn)有類型檢查。所述慢速路徑可記錄跟蹤器數(shù)據(jù)中的值的起源(或源)代碼位置和正在使用跟蹤器數(shù)據(jù)的接收(或目標(biāo))代碼位置之間的鏈接。該鏈接可分配有權(quán)重以指示值傳遞(或跟蹤)通過(guò)鏈接的次數(shù)。
[0009]在一個(gè)實(shí)施例中,可基于運(yùn)行時(shí)期間在值的起源代碼位置和目標(biāo)代碼位置之間記錄的鏈接來(lái)生成概率數(shù)據(jù)流程圖??蓪?duì)圖形的每個(gè)邊加權(quán)以對(duì)應(yīng)于占用邊的值流的相對(duì)概率。值如何流過(guò)程序以及使用那些值的不同操作執(zhí)行頻率有多高可從概率數(shù)據(jù)流程圖識(shí)另IJ。因此,概率數(shù)據(jù)流程圖可提供執(zhí)行程序的運(yùn)行時(shí)概率視圖以揭示運(yùn)行時(shí)編譯的優(yōu)化機(jī)
A
O
[0010]在一個(gè)實(shí)施例中,可根據(jù)概率數(shù)據(jù)流程圖來(lái)執(zhí)行運(yùn)行時(shí)編譯器上的優(yōu)化操作。例如,如果流過(guò)整數(shù)路徑的值更可能用于浮點(diǎn)運(yùn)算,則整數(shù)路徑可被轉(zhuǎn)化為浮點(diǎn)路徑。同樣,如果以浮點(diǎn)格式存儲(chǔ)的整數(shù)極有可能(例如,基于概率數(shù)據(jù)流程圖)在以后用于整數(shù)運(yùn)算,則可將其轉(zhuǎn)換為整數(shù)格式。作為另外一種選擇,如果整數(shù)堆存儲(chǔ)(例如,整數(shù)格式的值)具有流入浮點(diǎn)加載中的高概率,則可優(yōu)化編譯器而替代地以浮點(diǎn)數(shù)據(jù)的形式堆存儲(chǔ),但要進(jìn)行另外的類型檢查操作以確??煽啃浴?br>
[0011]在一個(gè)實(shí)施例中,可使用相對(duì)于數(shù)據(jù)結(jié)構(gòu)集合描述了鍵的屬性的元數(shù)據(jù),對(duì)使用鍵索引數(shù)據(jù)結(jié)構(gòu)(例如字典、哈希表、關(guān)聯(lián)數(shù)組等)集合中的鍵的操作進(jìn)行優(yōu)化。元數(shù)據(jù)可對(duì)應(yīng)于動(dòng)態(tài)更新的高速緩存以指示不變量,該不變量對(duì)于處于數(shù)據(jù)結(jié)構(gòu)集合的當(dāng)前狀態(tài)的鍵而言為真??杀苊庥糜谠阪I的數(shù)據(jù)結(jié)構(gòu)集合上進(jìn)行搜索的昂貴計(jì)算。例如,如果已知鍵始終(或從不)標(biāo)引某些特定的值,或者由于這些值具有在處于當(dāng)前狀態(tài)的系統(tǒng)的全局范圍內(nèi)的任何數(shù)據(jù)結(jié)構(gòu)集合中的某些元屬性,則可能根本無(wú)需在數(shù)據(jù)結(jié)構(gòu)(或字典)集合上進(jìn)行昂貴的查找操作。
[0012]在另一個(gè)實(shí)施例中,運(yùn)行時(shí)編譯器可以發(fā)射實(shí)現(xiàn)快速路徑(例如,無(wú)負(fù)載和分支結(jié)構(gòu))的編譯代碼,以基于對(duì)與通過(guò)源代碼識(shí)別的鍵相關(guān)聯(lián)的元數(shù)據(jù)的假設(shè)來(lái)執(zhí)行源代碼的指令。編譯代碼可包括保護(hù)符,例如條件檢查代碼,以基于與鍵相關(guān)聯(lián)的元數(shù)據(jù)進(jìn)入慢速路徑并防止進(jìn)入快速路徑。在運(yùn)行時(shí)執(zhí)行編譯代碼期間,可保持包括對(duì)象的運(yùn)行時(shí)狀態(tài),所述對(duì)象具有通過(guò)鍵散列的屬性??蓜?dòng)態(tài)更新鍵的元數(shù)據(jù)以反映運(yùn)行時(shí)狀態(tài)的變化(例如,在對(duì)象中)??蓤?zhí)行保護(hù)符以執(zhí)行廉價(jià)的檢查操作(例如,標(biāo)引鍵的元數(shù)據(jù)而不在運(yùn)行時(shí)狀態(tài)下的對(duì)象上執(zhí)行昂貴的查找),從而更新已發(fā)射編譯代碼以在運(yùn)行時(shí)期間需要時(shí)包括慢速路徑。
[0013]在另一個(gè)實(shí)施例中,可使用類型信息(或其他屬性信息)修改(或破壞)存儲(chǔ)器中類型化數(shù)據(jù)的指針值,以在通過(guò)修改的指針值對(duì)類型化數(shù)據(jù)執(zhí)行存儲(chǔ)器訪問(wèn)操作時(shí),利用基于硬件的安全檢查機(jī)制針對(duì)類型化數(shù)據(jù)自動(dòng)檢查類型信息。從而,當(dāng)執(zhí)行使用已修改指針的軟件代碼(其經(jīng)受安全檢查但不執(zhí)行例如軟件代碼中的比較和分支指令)時(shí),硬件內(nèi)置邏輯可用于廣義類的編程語(yǔ)言安全檢查。
[0014]在一個(gè)實(shí)施例中,動(dòng)態(tài)編程語(yǔ)言中類型的對(duì)象的指針的一部分(例如,64位系統(tǒng)中的高16位)可配置(或設(shè)置)有標(biāo)識(shí)類型的類型標(biāo)識(shí)符。當(dāng)通過(guò)被懷疑為該類型但并非已知為該類型的指針而對(duì)所述對(duì)象執(zhí)行訪問(wèn)時(shí),可使用類型標(biāo)識(shí)符(例如,通過(guò)XOR算術(shù)運(yùn)算)來(lái)更新指針以執(zhí)行訪問(wèn)。如果對(duì)象確實(shí)是由類型標(biāo)識(shí)符所標(biāo)識(shí)的類型,則訪問(wèn)可以成功,否則將導(dǎo)致硬件陷阱自動(dòng)激活陷阱處理程序。
[0015]在另一個(gè)實(shí)施例中,運(yùn)行時(shí)編譯(例如JIT編譯)可基于啟發(fā)式規(guī)則生成非確定性和不可預(yù)測(cè)的代碼以防止非可信代碼攻擊,例如JIT SPRAY攻擊,而不需要所有已生成代碼的確定性行為減少操作。啟發(fā)式規(guī)則可包括對(duì)例如所引發(fā)代碼保護(hù)的成本(例如,運(yùn)行時(shí)開(kāi)銷)、所需代碼保護(hù)的量和/或其他適用因素及其關(guān)系的估算。
[0016]在一個(gè)實(shí)施例中,當(dāng)執(zhí)行源代碼的運(yùn)行時(shí)編譯時(shí),動(dòng)態(tài)收集或累計(jì)數(shù)字(或測(cè)量值)以估算源代碼狀態(tài)的可信度。所述數(shù)字可基于對(duì)來(lái)自源代碼的已發(fā)射代碼的量(例如,已生成的字節(jié)數(shù))以及對(duì)已發(fā)射代碼的不可信控制量的跟蹤。例如,所述數(shù)字可確定(不可預(yù)測(cè)地)是否盲化(或重整、隨機(jī)化)編譯代碼的源代碼的常量,以抵御嵌入常量中的潛在非可信可執(zhí)行代碼。
[0017]通過(guò)附圖以及通過(guò)以下具體描述,本發(fā)明的其他特征將顯而易見(jiàn)。
【專利附圖】
【附圖說(shuō)明】
[0018]本發(fā)明以舉例的方式進(jìn)行說(shuō)明,而不僅限于各個(gè)附圖的圖形,在附圖中類似的附圖標(biāo)號(hào)表示類似的元件,并且其中:
[0019]圖1為網(wǎng)絡(luò)圖,其示出了從網(wǎng)絡(luò)化設(shè)備檢索的源代碼的示例性運(yùn)行時(shí)編譯;
[0020]圖2為框圖,其示出了動(dòng)態(tài)編程語(yǔ)言運(yùn)行時(shí)編譯的系統(tǒng)的一個(gè)實(shí)施例;
[0021]圖3為流程圖,其示出了采用跟蹤器數(shù)據(jù)(或跟蹤彈)的優(yōu)化運(yùn)行時(shí)編譯過(guò)程的一個(gè)實(shí)施例;
[0022]圖4為流程圖,其示出了在運(yùn)行時(shí)期間隨機(jī)跟蹤跟蹤器圖中的值以優(yōu)化編譯的過(guò)程的一個(gè)實(shí)施例;
[0023]圖5為圖形示意圖,其示出了在運(yùn)行時(shí)期間跟蹤值的示例性跟蹤器圖;
[0024]圖6為流程圖,其示出了使用散列鍵的元數(shù)據(jù)訪問(wèn)散列值的過(guò)程的一個(gè)實(shí)施例;
[0025]圖7為流程圖,其示出了使用散列鍵的元數(shù)據(jù)動(dòng)態(tài)更新推測(cè)生成的編譯代碼而無(wú)需查詢散列鍵的散列數(shù)據(jù)的過(guò)程的一個(gè)實(shí)施例;
[0026]圖8示出了根據(jù)本文所述一個(gè)實(shí)施例的運(yùn)行時(shí)的示例性鍵元數(shù)據(jù);
[0027]圖9為流程圖,其示出了訪問(wèn)特定類型數(shù)據(jù)而無(wú)需比較和分支操作的過(guò)程的一個(gè)實(shí)施例;
[0028]圖10為流程圖,其示出了用于根據(jù)高速緩存類型訪問(wèn)對(duì)象的數(shù)據(jù)元而無(wú)需執(zhí)行比較和分支操作的過(guò)程的一個(gè)實(shí)施例;
[0029]圖11示出了根據(jù)本文所述實(shí)施例表示對(duì)象的類型嵌入指針的一個(gè)例子;
[0030]圖12為框圖,其示出了用于訪問(wèn)特定類型數(shù)據(jù)而無(wú)需比較和分支操作的系統(tǒng)的一個(gè)實(shí)施例;
[0031]圖13為流程圖,其示出了以非確定性方式選擇性地隨機(jī)化來(lái)自源代碼的編譯代碼的過(guò)程的一個(gè)實(shí)施例;
[0032]圖14為流程圖,其示出了從源代碼的編譯代碼流發(fā)射非確定性隨機(jī)化的可執(zhí)行代碼的過(guò)程的一個(gè)實(shí)施例;
[0033]圖15A-15B示出了根據(jù)本文所述某些實(shí)施例的采用分散隨機(jī)化操作的即時(shí)編譯的例子;
[0034]圖16示出了諸如計(jì)算機(jī)系統(tǒng)的數(shù)據(jù)處理系統(tǒng)的一個(gè)例子,該數(shù)據(jù)處理系統(tǒng)可與本文所述的實(shí)施例一起使用。
【具體實(shí)施方式】
[0035]本文描述了用于運(yùn)行時(shí)編譯器的方法和裝置。以下說(shuō)明中示出了許多具體細(xì)節(jié),以提供對(duì)本發(fā)明實(shí)施例的全面解釋。然而,對(duì)于本領(lǐng)域的技術(shù)人員顯而易見(jiàn)的是,本發(fā)明的實(shí)施例可在不具有這些具體細(xì)節(jié)的情況下實(shí)施。在其他情況下,未詳細(xì)示出已熟知的組件、結(jié)構(gòu)和技術(shù),以免影響對(duì)此說(shuō)明的理解。
[0036]本說(shuō)明書(shū)中提到的“一個(gè)實(shí)施例”或“實(shí)施例”是指,結(jié)合實(shí)施例所描述的特定特征、結(jié)構(gòu)或特性可包括在本發(fā)明的至少一個(gè)實(shí)施例中。在本說(shuō)明書(shū)中的不同位置出現(xiàn)短語(yǔ)“在一個(gè)實(shí)施例中”不一定都是指同一個(gè)實(shí)施例。
[0037]下圖中示出的過(guò)程通過(guò)處理邏輯執(zhí)行,所述處理邏輯包括硬件(例如,電路系統(tǒng)、專用邏輯等)、軟件(例如在通用計(jì)算機(jī)系統(tǒng)或?qū)S脵C(jī)上運(yùn)行的軟件)、或它們兩者的組合。雖然下文按照某些順序操作來(lái)描述過(guò)程,但應(yīng)當(dāng)理解,所描述的某些操作可以不同的順序來(lái)執(zhí)行。此外,某些操作也可以并行地執(zhí)行而并非按順序執(zhí)行。
[0038]圖1為網(wǎng)絡(luò)圖,其示出了從網(wǎng)絡(luò)化設(shè)備檢索的源代碼的示例性運(yùn)行時(shí)編譯。在一個(gè)實(shí)施例中,網(wǎng)絡(luò)系統(tǒng)100可包括一個(gè)或多個(gè)服務(wù)器應(yīng)用101,例如在一個(gè)或多個(gè)服務(wù)器設(shè)備中托管的web服務(wù)器,以提供可用于客戶端應(yīng)用105的內(nèi)容,例如在客戶端設(shè)備中運(yùn)行的web瀏覽器。服務(wù)器101和客戶端105可基于例如諸如HTTP (超文本傳輸協(xié)議)之類的互聯(lián)網(wǎng)絡(luò)協(xié)議或其他適用的協(xié)議通過(guò)網(wǎng)絡(luò)103彼此通信。
[0039]在一個(gè)實(shí)施例中,從服務(wù)器101檢索的內(nèi)容可包括基于超文本語(yǔ)言(例如HTML (超文本標(biāo)記語(yǔ)言)或其他標(biāo)記語(yǔ)言)的web頁(yè)面,該超文本語(yǔ)言嵌入在動(dòng)態(tài)編程語(yǔ)言(例如JavaScript)中或與動(dòng)態(tài)編程語(yǔ)言的源鏈接(例如超鏈接)??蛻舳?05可以動(dòng)態(tài)地下載或獲取用于執(zhí)行的鏈接源。在一個(gè)實(shí)施例中,客戶端105可以在運(yùn)行時(shí)期間動(dòng)態(tài)地編譯所下載的源以提高執(zhí)行性能。
[0040]圖2為框圖,其示出了動(dòng)態(tài)編程語(yǔ)言運(yùn)行時(shí)編譯的系統(tǒng)的一個(gè)實(shí)施例。在一個(gè)實(shí)施例中,系統(tǒng)200可包括操作環(huán)境201,例如圖1的操作系統(tǒng)托管客戶端應(yīng)用101。操作環(huán)境201可包括動(dòng)態(tài)地將源代碼203編譯成可執(zhí)行代碼213的運(yùn)行時(shí)編譯器221。源代碼203可包括動(dòng)態(tài)編程語(yǔ)言(例如JavaScript)中的程序。在一個(gè)實(shí)施例中,可通過(guò)在操作環(huán)境201中運(yùn)行的瀏覽器應(yīng)用程序從遠(yuǎn)程設(shè)備(例如,圖1的服務(wù)器101)檢索源代碼203。運(yùn)行時(shí)編譯器221和執(zhí)行運(yùn)行時(shí)215均可由瀏覽器應(yīng)用程序控制以執(zhí)行瀏覽操作。
[0041]在一個(gè)實(shí)施例中,運(yùn)行時(shí)編譯器221可包括未優(yōu)化代碼生成器模塊207以編譯源代碼203。模塊207可包括源概要分析模塊209以從源代碼203生成概要分析信息(例如代碼位置標(biāo)識(shí)符、令牌密鑰或其他靜態(tài)分析代碼數(shù)據(jù)等)。根據(jù)一些實(shí)施例,模塊207可提供可執(zhí)行代碼213的初始版本,可通過(guò)優(yōu)化編譯模塊211在運(yùn)行時(shí)期間動(dòng)態(tài)地更新和優(yōu)化該初始版本。
[0042]例如,執(zhí)行運(yùn)行時(shí)215可以執(zhí)行可執(zhí)行代碼213以收集跟蹤器圖219,該跟蹤器圖提供優(yōu)化編譯模塊211的運(yùn)行時(shí)統(tǒng)計(jì)值以在可執(zhí)行代碼213上執(zhí)行優(yōu)化操作(例如,數(shù)據(jù)類型轉(zhuǎn)換、代碼替換等)。執(zhí)行運(yùn)行時(shí)215可以動(dòng)態(tài)地保持運(yùn)行時(shí)狀態(tài)217,包括例如創(chuàng)建的用于執(zhí)行源代碼203的數(shù)據(jù)實(shí)例(例如,對(duì)象或其他數(shù)據(jù)結(jié)構(gòu))。運(yùn)行時(shí)編譯器221可包括非確定性代碼隨機(jī)化模塊205,以在源代碼203和可執(zhí)行代碼213之間引入不可預(yù)測(cè)性,從而防止執(zhí)行嵌入在源代碼203內(nèi)的潛在隱藏的可執(zhí)行代碼。
[0043]基于動(dòng)態(tài)跟蹤器的運(yùn)行時(shí)優(yōu)化
[0044]在一個(gè)實(shí)施例中,在編譯源代碼時(shí),可在例如概要分析階段期間將跟蹤代碼引入(或注入、植入)源代碼的編譯代碼中。跟蹤代碼在執(zhí)行編譯代碼(例如,未優(yōu)化代碼)的運(yùn)行時(shí)期間被執(zhí)行時(shí),可以隨機(jī)地和偶發(fā)地生成跟蹤器數(shù)據(jù)以提供信息暴露機(jī)會(huì)從而優(yōu)化編譯代碼。可在運(yùn)行時(shí)期間,通過(guò)利用從執(zhí)行跟蹤代碼獲得的信息而將優(yōu)化操作(例如類型轉(zhuǎn)換或其他適用的編譯操作)動(dòng)態(tài)地應(yīng)用于優(yōu)化編譯代碼的多個(gè)部分。可以動(dòng)態(tài)地執(zhí)行優(yōu)化編譯代碼(而不是未優(yōu)化編譯代碼)以便在由跟蹤代碼引發(fā)的有限的處理或資源成本的情況下加快例如源代碼的某些選擇部分,例如重復(fù)函數(shù)調(diào)用或循環(huán)。
[0045]例如,可執(zhí)行跟蹤代碼以創(chuàng)建跟蹤器數(shù)據(jù),從而表示在編譯代碼的運(yùn)行時(shí)期間使用的值。可使值的跟蹤器數(shù)據(jù)結(jié)構(gòu)化以包括(或裝箱)該值及該值的附加代碼信息,例如該值的起源或來(lái)源(例如,源文件名、行號(hào)、或指示該值在編譯代碼或源代碼中的創(chuàng)建位置或來(lái)源位置的其他信息,例如針對(duì)該值生成的機(jī)器代碼的位置)。在一個(gè)實(shí)施例中,可使用特定類型來(lái)標(biāo)記或標(biāo)識(shí)跟蹤器數(shù)據(jù),以與在源代碼的編程語(yǔ)言(例如,JavaScript)中采用的現(xiàn)有數(shù)據(jù)類型(例如,字符串、整數(shù)等)、對(duì)象或其他動(dòng)態(tài)類型區(qū)分開(kāi)。因此,在運(yùn)行時(shí)期間,可識(shí)別(例如,直接地從用特定類型標(biāo)記的指針識(shí)別)對(duì)跟蹤器數(shù)據(jù)的訪問(wèn)以執(zhí)行操作,從而訪問(wèn)其相應(yīng)的值。
[0046]在一個(gè)實(shí)施例中,可將跟蹤器代碼插入到編譯代碼中的觸發(fā)點(diǎn)(例如,用于訪問(wèn)或存儲(chǔ)存儲(chǔ)器中的值的指令)。跟蹤器代碼可包括隨機(jī)求值器以在被執(zhí)行時(shí)確定是否生成跟蹤器數(shù)據(jù)(例如,跟蹤彈),以裝箱(或承載、封裝)具有值的附加代碼信息(例如可得自相應(yīng)源代碼的概要分析階段)的值??稍谥当淮鎯?chǔ)于存儲(chǔ)器中、放入棧中或傳遞至函數(shù)調(diào)用等時(shí)創(chuàng)建跟蹤器數(shù)據(jù)。在一個(gè)實(shí)施例中,隨機(jī)求值器可被配置為以低概率(例如小于1%)在編譯代碼中偶發(fā)地生成跟蹤器數(shù)據(jù)。因此,可以減小在運(yùn)行時(shí)期間遇到時(shí)從跟蹤器數(shù)據(jù)提取(或拆箱)相應(yīng)值的開(kāi)銷。在某些實(shí)施例中,隨機(jī)求值器可基于全局計(jì)數(shù)器,該全局計(jì)數(shù)器在計(jì)數(shù)數(shù)量超過(guò)配置數(shù)量(例如,100)時(shí)返回真,否則返回假,以引導(dǎo)跟蹤器數(shù)據(jù)以被評(píng)估為真的低概率生成。
[0047]在某些實(shí)施例中,可生成跟蹤器數(shù)據(jù)以允許實(shí)時(shí)收集運(yùn)行時(shí)數(shù)據(jù)流信息,而不用對(duì)源代碼(或整個(gè)程序)進(jìn)行昂貴的分析。概率數(shù)據(jù)流程圖可被動(dòng)態(tài)地構(gòu)造為表示運(yùn)行時(shí)數(shù)據(jù)流信息??蓪⒋a信息(例如值的起源)記錄在跟蹤器數(shù)據(jù)中,從而易于在運(yùn)行時(shí)期間訪問(wèn)跟蹤器數(shù)據(jù)時(shí)獲得,而無(wú)需重復(fù)地掃描(或讀取)源代碼以搜索用于收集運(yùn)行時(shí)數(shù)據(jù)的代碼信息。
[0048]在一個(gè)實(shí)施例中,當(dāng)在編譯代碼中創(chuàng)建值的跟蹤器數(shù)據(jù)時(shí),可用對(duì)跟蹤器數(shù)據(jù)的標(biāo)引(或指針)更新編譯代碼中值的現(xiàn)有鏈接(例如,用于訪問(wèn)值)。對(duì)跟蹤器數(shù)據(jù)的標(biāo)引可包括特殊標(biāo)簽以允許調(diào)用特定處理程序,從而基于通過(guò)在執(zhí)行編譯代碼時(shí)遇到的更新鏈接所識(shí)別的特殊標(biāo)簽,使值與跟蹤器數(shù)據(jù)解包。此外或任選地,垃圾收集器例程可以識(shí)別分配在存儲(chǔ)器中的跟蹤器數(shù)據(jù)(例如,基于特殊標(biāo)簽),以在每個(gè)存儲(chǔ)器清理會(huì)話處移除跟蹤器數(shù)據(jù),從而確保來(lái)自跟蹤器數(shù)據(jù)的最小存儲(chǔ)器使用影響。
[0049]在用跟蹤器代碼插樁或注入的未優(yōu)化編譯代碼的運(yùn)行時(shí)期間,可保持?jǐn)?shù)據(jù)流程圖以通過(guò)動(dòng)態(tài)創(chuàng)建的跟蹤器數(shù)據(jù)以出現(xiàn)的相對(duì)頻率收集有關(guān)如何創(chuàng)建、消耗或使用值等的信息。例如,圖中的第一節(jié)點(diǎn)可與被創(chuàng)建為整數(shù)常量的值相關(guān)聯(lián)。第一節(jié)點(diǎn)可與按照程序中的指示創(chuàng)建(或存儲(chǔ))值的代碼位置相關(guān)。可在運(yùn)行時(shí)期間將跟蹤器數(shù)據(jù)存儲(chǔ)在存儲(chǔ)器中以連同指示值起源的代碼位置的信息一起來(lái)表示值。
[0050]當(dāng)值在程序的目標(biāo)位置被標(biāo)引用于消耗時(shí)(例如,其傳遞到被用作算術(shù)運(yùn)算或其他適用操作中的操作數(shù)的函數(shù)時(shí)),可從存儲(chǔ)器訪問(wèn)跟蹤器數(shù)據(jù)以解除對(duì)內(nèi)嵌值的標(biāo)引。值的第二節(jié)點(diǎn)可在圖中更新以表示使用值的目標(biāo)位置。該圖可以包括從第一節(jié)點(diǎn)到第二節(jié)點(diǎn)的值的有向邊。
[0051]在一個(gè)實(shí)施例中,數(shù)據(jù)流程圖的每個(gè)節(jié)點(diǎn)可與和值相關(guān)的信息相關(guān)聯(lián),例如創(chuàng)建值時(shí)的數(shù)據(jù)類型、使用值時(shí)的數(shù)據(jù)類型(或在使用時(shí)轉(zhuǎn)化的數(shù)據(jù)類型)、對(duì)應(yīng)于節(jié)點(diǎn)的代碼位置、指令在該代碼位置中被執(zhí)行的次數(shù)(例如,基于計(jì)數(shù)器記錄)、或其他適用的信息。數(shù)據(jù)流程圖中的每個(gè)邊可包括值的源節(jié)點(diǎn)和目標(biāo)節(jié)點(diǎn)。所述邊可包括運(yùn)行時(shí)期間動(dòng)態(tài)更新的數(shù)(例如,基于計(jì)數(shù)器)以指示頻率、權(quán)重或遇到(或跟蹤)的從與源節(jié)點(diǎn)相關(guān)聯(lián)的代碼位置傳遞到與目標(biāo)節(jié)點(diǎn)相關(guān)聯(lián)的另一個(gè)代碼位置的值的累計(jì)次數(shù)。從而,數(shù)據(jù)流程圖可承載運(yùn)行時(shí)執(zhí)行軌線以允許在不停止程序的情況下推斷程序的值如何在運(yùn)行時(shí)期間使用。
[0052]可基于在數(shù)據(jù)流程圖中收集的運(yùn)行時(shí)數(shù)據(jù)來(lái)優(yōu)化編譯代碼。例如,源代碼可以指定在對(duì)應(yīng)于數(shù)據(jù)流程圖中節(jié)點(diǎn)的代碼位置(或代碼塊)處分配值的類型(例如,整數(shù)值)。優(yōu)化編譯器可例如基于起源于圖中節(jié)點(diǎn)的邊(例如,出邊)分析數(shù)據(jù)流程圖以識(shí)別該值在運(yùn)行時(shí)期間的使用方式。每個(gè)邊都可從作為源節(jié)點(diǎn)的節(jié)點(diǎn)被引導(dǎo)向目標(biāo)節(jié)點(diǎn)。另外,所述邊可以根據(jù)目標(biāo)節(jié)點(diǎn)指示值用作特定類型(例如,字符串、雙精度、整數(shù),或其他適用的類型)的次數(shù)。
[0053]在一個(gè)實(shí)施例中,可基于數(shù)據(jù)流圖來(lái)評(píng)估將值用作數(shù)據(jù)的特定類型的概率或可能性。用于創(chuàng)建值的來(lái)自對(duì)應(yīng)于代碼位置的源節(jié)點(diǎn)的有向邊可提供運(yùn)行時(shí)執(zhí)行記錄,所述記錄在早期運(yùn)行時(shí)作為啟發(fā)法收集以估計(jì)值將如何使用。與有向邊相關(guān)聯(lián)的目標(biāo)節(jié)點(diǎn)可指示值已經(jīng)使用的類型。在預(yù)測(cè)要在運(yùn)行時(shí)期間執(zhí)行的潛在類型轉(zhuǎn)換中,可對(duì)代碼位置處的值的編譯代碼進(jìn)行優(yōu)化以將值預(yù)先轉(zhuǎn)換為數(shù)據(jù)的推斷類型,以減少類型轉(zhuǎn)換操作或其他運(yùn)行時(shí)資源使用。該推斷類型可為被觀察為最常見(jiàn)的,或在目標(biāo)節(jié)點(diǎn)中具有使用該值的最高概率的特定類型。
[0054]在一個(gè)實(shí)施例中,可以動(dòng)態(tài)地監(jiān)測(cè)未優(yōu)化編譯代碼的執(zhí)行以確定何時(shí)在編譯代碼的哪些部分上執(zhí)行編譯器優(yōu)化。例如,如果函數(shù)調(diào)用次數(shù)或循環(huán)代碼執(zhí)行次數(shù)已超過(guò)閾值次數(shù)(例如,66次函數(shù)調(diào)用,1000次循環(huán)或其他靜態(tài)或動(dòng)態(tài)配置次數(shù)),則可在運(yùn)行時(shí)期間調(diào)用編譯器優(yōu)化以優(yōu)化相應(yīng)的代碼。作為另外一種選擇,如果運(yùn)行時(shí)監(jiān)測(cè)指示代碼的一部分具有低使用(或執(zhí)行)率,則可能不會(huì)在編譯代碼的該部分上執(zhí)行編譯器優(yōu)化。低使用率可基于預(yù)定的使用閾值(例如,觀察到函數(shù)僅被調(diào)用了一次)或在監(jiān)測(cè)時(shí)間期間與編譯代碼的其他部分的相對(duì)資源使用比較。
[0055]圖3為流程圖,其示出了采用跟蹤器數(shù)據(jù)的優(yōu)化運(yùn)行時(shí)編譯過(guò)程的一個(gè)實(shí)施例。示例性過(guò)程300可通過(guò)處理邏輯來(lái)執(zhí)行,所述處理邏輯可包括硬件(電路系統(tǒng)、專用邏輯等)、軟件(例如在專用機(jī)上運(yùn)行的軟件)、或它們兩者的組合。例如,過(guò)程300可通過(guò)圖2的系統(tǒng)200的一些組件來(lái)執(zhí)行。在框301處,根據(jù)一個(gè)實(shí)施例,在源代碼的運(yùn)行時(shí)編譯期間,過(guò)程300的處理邏輯可將跟蹤器代碼插入到源代碼。例如,過(guò)程300的處理邏輯可從遠(yuǎn)程設(shè)備(或本地存儲(chǔ)器)檢索源代碼以動(dòng)態(tài)地執(zhí)行從源代碼編譯的可執(zhí)行代碼。作為另外一種選擇,可通過(guò)解譯器機(jī)構(gòu)來(lái)執(zhí)行源代碼,而無(wú)需編譯但帶來(lái)一定的性能開(kāi)銷。
[0056]在一個(gè)實(shí)施例中,源代碼可基于動(dòng)態(tài)編程語(yǔ)言,例如JavaScript,而無(wú)需在源代碼中創(chuàng)建的值的數(shù)據(jù)類型的明確規(guī)范。過(guò)程300的處理邏輯可將跟蹤器代碼添加到標(biāo)引源代碼中的值的代碼塊,以允許選擇性地跟蹤源代碼執(zhí)行期間的值流。
[0057]在框303處,在源代碼的編譯代碼(例如未優(yōu)化)的運(yùn)行時(shí)期間,過(guò)程300的處理邏輯可根據(jù)在源代碼中插入的跟蹤器代碼隨機(jī)地且不頻繁地(例如小于1% )生成遇到的(例如,當(dāng)值存儲(chǔ)在存儲(chǔ)器中時(shí))值的跟蹤器數(shù)據(jù)。所述值和所述值的起源(例如初始代碼位置)可被封裝在跟蹤器數(shù)據(jù)內(nèi)。
[0058]在框305處,當(dāng)在源代碼的運(yùn)行時(shí)期間(例如,基于未優(yōu)化編譯代碼)在目標(biāo)代碼位置處使用(或遇到)值時(shí),過(guò)程300的處理邏輯可加載跟蹤器數(shù)據(jù)(例如,從存儲(chǔ)器)以從跟蹤器數(shù)據(jù)訪問(wèn)值。所加載的跟蹤器數(shù)據(jù)可指示相應(yīng)值的起源。在一個(gè)實(shí)施例中,過(guò)程300的處理邏輯可根據(jù)加載的跟蹤器數(shù)據(jù)更新跟蹤器圖以記錄運(yùn)行時(shí)信息。該運(yùn)行時(shí)信息可包括在執(zhí)行期間跟蹤器數(shù)據(jù)內(nèi)指示的值的起源和所使用值的目標(biāo)。
[0059]在框309處,過(guò)程300的處理邏輯可優(yōu)化編譯代碼以減少跟蹤器圖中跟蹤的值的起源和目標(biāo)之間的處理資源。例如,過(guò)程300的處理邏輯可使用跟蹤器圖中跟蹤的目標(biāo)(或接收)代碼位置中主要使用的數(shù)據(jù)類型在其初始代碼位置處轉(zhuǎn)換值。在一些實(shí)施例中,過(guò)程300的處理邏輯可監(jiān)測(cè)未優(yōu)化編譯代碼的運(yùn)行時(shí)狀態(tài)以選擇性地優(yōu)化代碼的多個(gè)部分。例如,與不頻繁執(zhí)行的函數(shù)對(duì)應(yīng)的代碼塊可能不需要優(yōu)化。在框311處,處理邏輯可執(zhí)行所述優(yōu)化編譯代碼,并且任選地執(zhí)行未優(yōu)化編譯代碼的多個(gè)部分。
[0060]圖4為流程圖,其示出了在運(yùn)行時(shí)期間隨機(jī)跟蹤跟蹤器圖中的值以優(yōu)化編譯的過(guò)程的一個(gè)實(shí)施例??赏ㄟ^(guò)處理邏輯執(zhí)行示例性過(guò)程400,該處理邏輯可包括硬件、軟件、或它們兩者的組合。例如,過(guò)程400可通過(guò)圖2的系統(tǒng)200的一些組件來(lái)執(zhí)行。在框401處,過(guò)程400的處理邏輯可隨機(jī)地且不頻繁地確定是否跟蹤在源代碼中指定的(例如,將基于存儲(chǔ)或分配操作存儲(chǔ)在存儲(chǔ)器中的)值V。值V可與起源0(例如,行號(hào))相關(guān)聯(lián),該起源O指示值V在源代碼中的創(chuàng)建位置。在一個(gè)實(shí)施例中,是否跟蹤值V可基于對(duì)全局計(jì)數(shù)器進(jìn)行計(jì)數(shù),以及所計(jì)數(shù)的全局計(jì)數(shù)器是否溢出一定的配置數(shù)(例如,100)來(lái)決定。如果發(fā)生了溢出并且全局計(jì)數(shù)器重置回其初始值(例如,O),則可對(duì)值V進(jìn)行跟蹤。
[0061]在框403處,如果確定要跟蹤值V,過(guò)程400的處理邏輯可根據(jù)跟蹤器數(shù)據(jù)類型(或彈跟蹤器類型)分配存儲(chǔ)器中的跟蹤器數(shù)據(jù)以存儲(chǔ)值V和起源O。例如,跟蹤器類型可指定具有兩個(gè)64位字的數(shù)據(jù)結(jié)構(gòu)??赏ㄟ^(guò)具有指示跟蹤器數(shù)據(jù)(例如,可跟蹤彈類型)的標(biāo)簽的指針來(lái)指向跟蹤器數(shù)據(jù)。過(guò)程400的處理邏輯可以識(shí)別直接來(lái)自指針自身的跟蹤器數(shù)據(jù)的指針。
[0062]在框405處,過(guò)程400的處理邏輯可通過(guò)目標(biāo)D的指針來(lái)訪問(wèn)值V,該目標(biāo)D位于使用(或消耗)值V的代碼中。例如,目標(biāo)D可指示用值V傳遞的函數(shù)內(nèi)的代碼位置。在框407處,過(guò)程400的處理邏輯可例如根據(jù)指示可跟蹤彈類型的標(biāo)簽確定指針是否指向跟蹤器數(shù)據(jù)。
[0063]在框407處,如果指針指向跟蹤器數(shù)據(jù),則過(guò)程400的處理邏輯可以訪問(wèn)來(lái)自跟蹤器數(shù)據(jù)的值V和起源O (例如,從存儲(chǔ)值V的位置偏移8個(gè)字節(jié))。在一個(gè)實(shí)施例中,通過(guò)跟蹤器數(shù)據(jù)訪問(wèn)(或檢索)值V可基于跟隨代碼慢速路徑的代碼執(zhí)行。作為另外一種選擇,不使用跟蹤器數(shù)據(jù)(例如,通過(guò)指向存儲(chǔ)器中的值V的指針)訪問(wèn)值V可基于跟隨代碼快速路徑的代碼執(zhí)行;與慢速路徑相比,快速路徑可能需要更少的操作。
[0064]在一個(gè)實(shí)施例中,在框411處,如果跟蹤器圖G(例如,表不基于有向圖的關(guān)系的數(shù)據(jù)結(jié)構(gòu))包括從起源O導(dǎo)向目標(biāo)D的邊E (例如,圖G的獨(dú)立節(jié)點(diǎn)),則過(guò)程400的處理邏輯可更新邊E的權(quán)重(例如,加I)。圖G中邊的權(quán)重可表示運(yùn)行時(shí)期間從起源O到目標(biāo)D的值流的出現(xiàn)次數(shù)(或其他收集的統(tǒng)計(jì)值)。反之,如果圖G中當(dāng)前不存在邊E,則過(guò)程400的處理邏輯可使用具有初始權(quán)重(例如,I)的邊E來(lái)更新圖G。隨后在框415處,過(guò)程400的處理邏輯可從要用于位于目標(biāo)D中的代碼的跟蹤器數(shù)據(jù)中加載值V。
[0065]圖5為圖形示意圖,其示出了在運(yùn)行時(shí)期間跟蹤值的示例性跟蹤器圖。例如,節(jié)點(diǎn)511可指示已監(jiān)測(cè)執(zhí)行的運(yùn)行時(shí)期間值0.X = a+b生成的12個(gè)觀察結(jié)果(或已跟蹤12個(gè)記錄)。邊509可包括數(shù)100,該數(shù)表示在節(jié)點(diǎn)511處創(chuàng)建的值在對(duì)應(yīng)于節(jié)點(diǎn)505的代碼位置處已使用的次數(shù)(如,基于循環(huán)代碼執(zhí)行)。在一個(gè)實(shí)施例中,節(jié)點(diǎn)505可指示代碼0.x*2.1已使用在節(jié)點(diǎn)511和節(jié)點(diǎn)501處創(chuàng)建的值執(zhí)行了 102次。邊503可指示節(jié)點(diǎn)505消耗了在節(jié)點(diǎn)501處創(chuàng)建的2個(gè)值。節(jié)點(diǎn)501可指示已跟蹤通過(guò)0.X = c*d創(chuàng)建的3個(gè)值。
[0066]在一個(gè)實(shí)施例中,節(jié)點(diǎn)505、節(jié)點(diǎn)507和節(jié)點(diǎn)517可包括代碼信息,該代碼信息分別指示用于值0.X的不同類型,例如雙精度類型、整數(shù)類型和字符串類型。邊509、513和515可提供收集數(shù)(或統(tǒng)計(jì)值),其指示在節(jié)點(diǎn)511處創(chuàng)建的值0.X已使用(例如被跟蹤時(shí))的次數(shù),例如雙精度類型時(shí)的100次,雙精度整數(shù)類型時(shí)的2次以及時(shí)間字符串類型時(shí)的一次。因此,優(yōu)化編譯器可更新對(duì)應(yīng)于節(jié)點(diǎn)511的代碼位置(或塊)處的編譯代碼,以將值
0.X預(yù)轉(zhuǎn)換為雙精度類型,使得可以避免為節(jié)點(diǎn)505定位的代碼的雙精度的潛在轉(zhuǎn)換操作。
[0067]使用元數(shù)據(jù)的運(yùn)行時(shí)優(yōu)化
[0068]在一個(gè)實(shí)施例中,可通過(guò)維護(hù)鍵的元數(shù)據(jù)來(lái)避免用于搜索與鍵相關(guān)聯(lián)的對(duì)象屬性的昂貴查找操作。每個(gè)鍵都可被表示為字符串、字符序列或數(shù)據(jù)的其他適用單元。在基于動(dòng)態(tài)編程語(yǔ)言(例如,JavaScript)執(zhí)行代碼的運(yùn)行時(shí)期間,可采用一類字典來(lái)存儲(chǔ)已分配數(shù)據(jù)(例如對(duì)象)的屬性。對(duì)象的屬性存儲(chǔ)器中的示例性條目可包括元屬性,例如,“為只讀”、“為訪問(wèn)器”或其他適用的屬性,以及相關(guān)聯(lián)的屬性值,例如指示相應(yīng)的屬性為真還是不為真。
[0069]可執(zhí)行給定字典/鍵對(duì)的示例性運(yùn)行時(shí)計(jì)算或操作以確定字典是否包含由鍵標(biāo)引的只讀值。用表示鍵的鍵對(duì)象直接記錄某些重要不變量時(shí)可不需要此類計(jì)算或搜索操作。例如,可創(chuàng)建鍵相關(guān)的數(shù)據(jù)或?qū)ο笠园瑪?shù)據(jù)片,例如“只讀”鍵元數(shù)據(jù),從而跟蹤任何現(xiàn)有的字典是否包含只讀屬性或與當(dāng)前運(yùn)行時(shí)狀態(tài)下的鍵相關(guān)聯(lián)(或被其索引)的值。每當(dāng)在運(yùn)行時(shí)期間執(zhí)行此類計(jì)算時(shí)可檢查鍵的這些不變量。
[0070]在一些實(shí)施例中,可提供某種機(jī)制以確定依靠與鍵(或鍵特定不變量)相關(guān)聯(lián)的不變量或元數(shù)據(jù)的優(yōu)化代碼塊是否仍然有效。每當(dāng)這些不變量更改時(shí),相應(yīng)的優(yōu)化代碼塊可失效。例如,運(yùn)行時(shí)編譯代碼(例如,通過(guò)JIT編譯器)可基于不變量的有效性,其中給定鍵將從不會(huì)標(biāo)引具有“為訪問(wèn)器”元屬性的屬性。如果在運(yùn)行時(shí)期間該不變量的狀態(tài)改變(即,具有“為訪問(wèn)器”元屬性的屬性被添加到由給定鍵標(biāo)引的字典條目),則依靠該不變量的運(yùn)行時(shí)編譯代碼一定會(huì)失效、被刪除或更換,使得其不再被使用。
[0071]用于執(zhí)行基于動(dòng)態(tài)語(yǔ)言的代碼的運(yùn)行時(shí)狀態(tài)(例如,在某個(gè)時(shí)間點(diǎn)處)可包括具有鍵索引(或相關(guān)聯(lián))屬性的對(duì)象域,例如字典、哈希表或其他適用的關(guān)聯(lián)數(shù)據(jù)結(jié)構(gòu)。另外,運(yùn)行時(shí)狀態(tài)可包括鍵和鍵特定元數(shù)據(jù)(或不變量)的集合??衫缭谶\(yùn)行時(shí)編譯的配置文件階段期間從代碼(例如,源代碼)中識(shí)別鍵。作為另外一種選擇,可在運(yùn)行時(shí)期間動(dòng)態(tài)地創(chuàng)建鍵(例如,通過(guò)執(zhí)行key = inputO)。創(chuàng)建或維護(hù)鍵元數(shù)據(jù)以明確描述在全局范圍內(nèi)與當(dāng)前運(yùn)行時(shí)狀態(tài)(例如,所有現(xiàn)有的對(duì)象或數(shù)據(jù)實(shí)例)相關(guān)的鍵的某些方面的“事實(shí)”或斷言。
[0072]在一個(gè)實(shí)施例中,鍵元數(shù)據(jù)可指示全局?jǐn)嘌?,該全局?jǐn)嘌钥赏ㄟ^(guò)對(duì)相對(duì)于與元數(shù)據(jù)相關(guān)聯(lián)的鍵的現(xiàn)有對(duì)象的搜索操作而被驗(yàn)證為真。例如,運(yùn)行時(shí)狀態(tài)可包括在任何當(dāng)前現(xiàn)有對(duì)象中未使用(或包括)的特定鍵。鍵特定元數(shù)據(jù)可包括用于特定鍵的條目,指示該特定鍵當(dāng)前未在任何對(duì)象中使用。對(duì)被特定鍵索引的屬性的運(yùn)行時(shí)狀態(tài)(或域)的所有當(dāng)前現(xiàn)有對(duì)象的搜索操作結(jié)果可與鍵特定元數(shù)據(jù)一致??赏ㄟ^(guò)鍵特定元數(shù)據(jù)的可用性來(lái)避免此類搜索操作。
[0073]執(zhí)行基于動(dòng)態(tài)編程語(yǔ)言的代碼的運(yùn)行時(shí)狀態(tài)的鍵特定元數(shù)據(jù)可指示鍵是否在運(yùn)行時(shí)狀態(tài)下被使用(被任何現(xiàn)有對(duì)象),在運(yùn)行時(shí)狀態(tài)下被鍵索引的屬性是否具有“只讀”屬性,函數(shù)調(diào)用是否與鍵(例如,靜態(tài)地)相關(guān)聯(lián),和/或與鍵相關(guān)的其他適用的全局信息。在一個(gè)實(shí)施例中,鍵特定元數(shù)據(jù)可包括需要低存儲(chǔ)器資源開(kāi)銷的多位數(shù)據(jù)。每個(gè)位可具有二進(jìn)制值,該二進(jìn)制值指示與位(與相應(yīng)的鍵相關(guān)聯(lián))相關(guān)聯(lián)的語(yǔ)句或斷言是否相對(duì)于當(dāng)前運(yùn)行時(shí)狀態(tài)在全局范圍內(nèi)為真。
[0074]基于動(dòng)態(tài)語(yǔ)言(例如JavaScript)的程序的運(yùn)行時(shí)編譯代碼可包括代碼塊以訪問(wèn)鍵特定元數(shù)據(jù)(或不變量數(shù)據(jù)),以及防止其在例如訪問(wèn)動(dòng)態(tài)分配的屬性(例如,V = ο.m)時(shí)進(jìn)行潛在冗長(zhǎng)和昂貴的查找操作??稍诖a塊中調(diào)用鍵元數(shù)據(jù)訪問(wèn)函數(shù)以確定對(duì)應(yīng)于屬性(例如,m)的鍵是否被使用。如果屬性未被使用,則用于搜索運(yùn)行時(shí)的所有現(xiàn)有對(duì)象(或字典)的慢速路徑代碼可被跳過(guò)。
[0075]可動(dòng)態(tài)更新運(yùn)行時(shí)狀態(tài)的鍵元數(shù)據(jù)以與運(yùn)行時(shí)的變化同步。例如,一旦(或同時(shí))與特定鍵相關(guān)聯(lián)的對(duì)象屬性被創(chuàng)建(或被添加到字典),則可修改(例如,翻轉(zhuǎn)位值)特定鍵的鍵元數(shù)據(jù)以反映該特定鍵在運(yùn)行時(shí)狀態(tài)下在至少一個(gè)對(duì)象中被使用。
[0076]在一個(gè)實(shí)施例中,運(yùn)行時(shí)編譯器可基于初始建立的鍵不變量(或鍵特定元數(shù)據(jù))來(lái)生成源代碼的優(yōu)化編譯代碼,該初始建立的鍵不變量(或鍵特定元數(shù)據(jù))具有與用于執(zhí)行源代碼的初始運(yùn)行時(shí)狀態(tài)一致的初始值。例如,運(yùn)行時(shí)編譯器可為源代碼中屬性“m”(例如,ο.m = x)的每個(gè)訪問(wèn)生成優(yōu)化代碼,以分配屬性“m” (或更新對(duì)象的動(dòng)態(tài)類型)而不執(zhí)行安全防護(hù)操作,以在執(zhí)行時(shí)在運(yùn)行時(shí)狀態(tài)下搜索現(xiàn)有對(duì)象中的屬性“m” (或相應(yīng)的鍵)。
[0077]在運(yùn)行時(shí)期間,當(dāng)鍵不變量由于可在運(yùn)行時(shí)狀態(tài)期間發(fā)生的變化而被修改時(shí),運(yùn)行時(shí)編譯器可動(dòng)態(tài)更新優(yōu)化編譯代碼。因此,基于鍵不變量的某些假設(shè)(例如,初始值)的優(yōu)化編譯代碼的多個(gè)部分可失效,前提是此類假設(shè)不再為真。例如,如果屬性“m”在運(yùn)行時(shí)期間被分配到現(xiàn)有對(duì)象,則可以更新編譯代碼中屬性“m”的訪問(wèn)的優(yōu)化代碼的每個(gè)塊,例如,以執(zhí)行獨(dú)立代碼路徑從而用附加操作(例如,搜索或查找操作)來(lái)保證可靠性。在某些實(shí)施例中,優(yōu)化編譯代碼可包括指示代碼塊被優(yōu)化的指示器(例如,基于表數(shù)據(jù)結(jié)構(gòu)中的標(biāo)記)。
[0078]圖6為流程圖,其示出了使用散列鍵的元數(shù)據(jù)訪問(wèn)散列值的過(guò)程的一個(gè)實(shí)施例。可通過(guò)處理邏輯執(zhí)行示例性過(guò)程600,該處理邏輯可包括硬件、軟件、或它們兩者的組合。例如,過(guò)程600可通過(guò)圖2的系統(tǒng)200的一些組件來(lái)執(zhí)行。在框601處,過(guò)程600的處理邏輯可以檢查鍵的鍵元數(shù)據(jù),以確定是否響應(yīng)于在執(zhí)行代碼的運(yùn)行時(shí)期間訪問(wèn)由目標(biāo)數(shù)據(jù)對(duì)象的鍵索引的屬性而執(zhí)行查找操作。
[0079]在一個(gè)實(shí)施例中,運(yùn)行時(shí)狀態(tài)可包括當(dāng)前(例如,在運(yùn)行時(shí)期間的時(shí)間點(diǎn)處)分配的數(shù)據(jù)對(duì)象,例如,包括目標(biāo)數(shù)據(jù)對(duì)象。訪問(wèn)由目標(biāo)數(shù)據(jù)對(duì)象的鍵索引的屬性可導(dǎo)致對(duì)由該鍵索引的新屬性的分配。可能需要查找(或搜索)操作以確定與目標(biāo)數(shù)據(jù)對(duì)象相關(guān)的當(dāng)前分配的數(shù)據(jù)對(duì)象的任何現(xiàn)有屬性是否由鍵索引。鍵的鍵元數(shù)據(jù)可包括不變量的描述,其對(duì)于在當(dāng)前分配的數(shù)據(jù)對(duì)象中的鍵在全局范圍內(nèi)為真。例如,鍵的不變量中的一者可指示是否使用鍵來(lái)索引當(dāng)前分配的數(shù)據(jù)中的現(xiàn)有屬性。
[0080]在框603處,如果鍵的不變量或元數(shù)據(jù)滿足某些條件,則過(guò)程600的處理邏輯可針對(duì)由直接位于目標(biāo)數(shù)據(jù)對(duì)象上的鍵索引的屬性執(zhí)行訪問(wèn)操作,而不在當(dāng)前處于運(yùn)行時(shí)狀態(tài)的分配的數(shù)據(jù)對(duì)象上執(zhí)行查找操作。例如,條件可為這樣的要求:鍵當(dāng)前未在運(yùn)行時(shí)狀態(tài)下的現(xiàn)有數(shù)據(jù)對(duì)象的任何一者中被使用或標(biāo)引。例如,如果鍵滿足該條件,則不需要在多個(gè)數(shù)據(jù)對(duì)象中執(zhí)行潛在的昂貴查找操作以定位由鍵索引的屬性。
[0081 ] 在一個(gè)實(shí)施例中,屬性訪問(wèn)操作可導(dǎo)致運(yùn)行時(shí)狀態(tài)的變化。例如,屬性訪問(wèn)操作可導(dǎo)致對(duì)象使用新添加或分配的由鍵索引的屬性進(jìn)行更新,所述屬性先前未在任何現(xiàn)有對(duì)象中使用。在框605處,過(guò)程600的處理邏輯可更新鍵的鍵元數(shù)據(jù),以保持鍵的不變量和由訪問(wèn)操作更新(或更改)的運(yùn)行時(shí)狀態(tài)之間的一致性。
[0082]圖7為流程圖,其示出了使用散列鍵的元數(shù)據(jù)動(dòng)態(tài)更新推測(cè)生成的編譯代碼而無(wú)需查詢散列鍵的散列數(shù)據(jù)的過(guò)程的一個(gè)實(shí)施例??赏ㄟ^(guò)處理邏輯執(zhí)行示例性過(guò)程700,該處理邏輯可包括硬件、軟件、或它們兩者的組合。例如,過(guò)程700可通過(guò)圖2的系統(tǒng)200的一些組件來(lái)執(zhí)行。在框701處,過(guò)程700的處理邏輯可以針對(duì)與從源代碼概要分析的鍵相關(guān)聯(lián)的源代碼的多個(gè)部分推測(cè)生成編譯代碼(例如,無(wú)需執(zhí)行查找操作的快速路徑)。所述鍵可以索引存儲(chǔ)在散列數(shù)據(jù)中的值,例如在源代碼的運(yùn)行時(shí)狀態(tài)下表示對(duì)象或其他鍵相關(guān)聯(lián)數(shù)據(jù)結(jié)構(gòu)的字典??墒褂眠\(yùn)行時(shí)狀態(tài)下的所有現(xiàn)有散列數(shù)據(jù)中的鍵的一個(gè)或多個(gè)全局屬性來(lái)維護(hù)與鍵相關(guān)聯(lián)的元數(shù)據(jù)。
[0083]在框703處,過(guò)程700的處理邏輯可響應(yīng)于用鍵更新運(yùn)行時(shí)狀態(tài)的散列數(shù)據(jù)而更新鍵的元數(shù)據(jù),以確保在鍵的元數(shù)據(jù)中描述的全局屬性與包括已更新散列數(shù)據(jù)的變化的當(dāng)前運(yùn)行時(shí)狀態(tài)一致。例如,已更新散列數(shù)據(jù)可包括由對(duì)象數(shù)據(jù)中的鍵索引的新屬性,而鍵的已更新元數(shù)據(jù)可指示描述鍵未在任何現(xiàn)有對(duì)象數(shù)據(jù)中使用的全局屬性不再有效。
[0084]在框705處,過(guò)程700的處理邏輯可確定推測(cè)生成的與鍵相關(guān)聯(lián)的編譯代碼是否因鍵的已更新元數(shù)據(jù)而失效,以保證推測(cè)生成的編譯代碼具有可靠性,而不會(huì)在運(yùn)行時(shí)狀態(tài)的散列數(shù)據(jù)上引發(fā)查詢操作。可基于以下假設(shè)來(lái)發(fā)射推測(cè)生成的編譯代碼:鍵元數(shù)據(jù)的某些條件為真或得到滿足。如果這些條件如同在鍵的已更新元數(shù)據(jù)中那樣不再有效,則推測(cè)生成的編譯代碼可能需要失效。
[0085]如果推測(cè)生成的編譯代碼失效,則在框707處,過(guò)程700的處理邏輯可以更新與鍵相關(guān)聯(lián)的源代碼的多個(gè)部分以重新導(dǎo)向來(lái)自推測(cè)生成的編譯代碼的執(zhí)行路徑。例如,與根據(jù)推測(cè)生成的編譯代碼來(lái)執(zhí)行快速路徑相反,過(guò)程700的處理邏輯可以繼續(xù)執(zhí)行代碼的慢速路徑,該代碼的慢速路徑包括在值的現(xiàn)有散列數(shù)據(jù)或由鍵索引的屬性中的諸如查找、搜索或查詢操作的操作。
[0086]圖8示出了根據(jù)本文所述一個(gè)實(shí)施例的運(yùn)行時(shí)的示例性鍵元數(shù)據(jù)。實(shí)例800可基于圖2的系統(tǒng)200的一些組件。在一個(gè)實(shí)施例中,運(yùn)行時(shí)狀態(tài)217可表示執(zhí)行從源代碼801編譯的代碼的運(yùn)行時(shí)。對(duì)象805、807可能已在源代碼801的執(zhí)行期間的某個(gè)時(shí)間點(diǎn)處于運(yùn)行時(shí)狀態(tài)217下分配,例如,當(dāng)執(zhí)行源代碼801的代碼塊V = 0.W以訪問(wèn)指向?qū)ο?05的O803的屬性W時(shí)。
[0087]鍵元數(shù)據(jù)811可在運(yùn)行時(shí)狀態(tài)217下保持,描述了當(dāng)前存在于運(yùn)行時(shí)狀態(tài)217中的所有對(duì)象中的鍵X、W的全局不變量或元數(shù)據(jù)。例如,鍵的元數(shù)據(jù)可被表示為多位(例如2位)值,指示鍵是否在任何現(xiàn)有對(duì)象中使用以及鍵是否與“只讀”屬性相關(guān)聯(lián)。位813可指示鍵W未在運(yùn)行時(shí)狀態(tài)217的任何當(dāng)前現(xiàn)有對(duì)象中使用。位815可指示鍵W與“只讀”屬性不相關(guān)聯(lián)。如果執(zhí)行V = 0.W并在對(duì)象805中分配了屬性W,則位813可被更新為I。
[0088]借助已破壞指針的自動(dòng)類型檢杳
[0089]在一個(gè)實(shí)施例中,可根據(jù)來(lái)自存儲(chǔ)器的單次加載來(lái)優(yōu)化諸如JavaScript的動(dòng)態(tài)語(yǔ)言中的屬性訪問(wèn)(例如“0.X”,其中O是指對(duì)象,而X是指對(duì)象的屬性X)。某些操作,例如比較操作、分支操作和一個(gè)存儲(chǔ)器加載操作,可能不需要屬性訪問(wèn)來(lái)提高諸如內(nèi)聯(lián)高速緩存的運(yùn)行時(shí)優(yōu)化技術(shù)的性能。任選地,利用特殊處理器架構(gòu)(例如流水線處理器或多處理器)執(zhí)行代碼的優(yōu)化機(jī)會(huì)可增加(例如,通過(guò)代碼路徑的預(yù)測(cè)執(zhí)行),同時(shí)在代碼中存在較少比較操作和分支操作。
[0090]在某些實(shí)施例中,屬性訪問(wèn)可被指定(或斷言)為僅在特定(或期望)類型的對(duì)象上執(zhí)行??墒褂貌煌钠谕愋蛠?lái)指定不同的屬性訪問(wèn)。用于對(duì)存儲(chǔ)器中的屬性進(jìn)行尋址的指針可被限制為最大允許地址數(shù)(例如,248),該最大允許地址數(shù)小于可由指針表示的可能地址數(shù)(例如,基于64位值的處理系統(tǒng)中的264)??墒褂猛ㄟ^(guò)指針尋址的數(shù)據(jù)的期望類型(例如,在最高至216可能類型數(shù)之內(nèi))來(lái)指定指針中的額外空間(例如,高16位)??蓪⒅羔樇虞d到硬件寄存器以針對(duì)由指針尋址的數(shù)據(jù)單元(例如,64位大小)自動(dòng)地訪問(wèn)存儲(chǔ)器。
[0091]可在訪問(wèn)存儲(chǔ)器中的已尋址數(shù)據(jù)(例如,加載到硬件寄存器)之前處理斷言類型的指針,以確保自動(dòng)類型檢查。處理系統(tǒng)可以自動(dòng)檢查通過(guò)指針指向的存儲(chǔ)器地址是否滿足某些條件(例如,高16位必須為零),而無(wú)需執(zhí)行另外的機(jī)器指令(例如,用于比較操作、分支操作等)。如果條件未得到滿足,則處理系統(tǒng)可以自動(dòng)調(diào)用(例如,未經(jīng)可執(zhí)行代碼指示)陷阱處理程序,該陷阱處理程序可使用預(yù)期的指令進(jìn)行預(yù)注冊(cè)。在一個(gè)實(shí)施例中,可使用期望的數(shù)據(jù)類型來(lái)處理斷言類型的指針以獲取期望類型的數(shù)據(jù)或執(zhí)行陷阱處理程序;如果數(shù)據(jù)不是期望的類型,該陷阱處理程序會(huì)執(zhí)行必要的補(bǔ)償動(dòng)作。
[0092]在一個(gè)實(shí)施例中,對(duì)象(例如,結(jié)構(gòu)化數(shù)據(jù))的屬性存儲(chǔ)器的指針可包括(或嵌入)該對(duì)象的類型標(biāo)識(shí)符(例如,在高16位中)和屬性存儲(chǔ)器的存儲(chǔ)器地址。指針可為嵌入的類型以通過(guò)嵌入類型標(biāo)識(shí)符來(lái)斷言已尋址數(shù)據(jù)的類型。在一個(gè)實(shí)施例中,可針對(duì)對(duì)象可具有屬性的給定組合和排序動(dòng)態(tài)地指派或分配類型。因此,例如,具有屬性lx,y,z}(例如,通過(guò)x、y和z識(shí)別的有序?qū)傩?的每個(gè)對(duì)象可具有相同的類型,但該類型將不同于具有屬性lx,y}或甚至lz,y,x}的對(duì)象。類型(例如,lx,y})可指定所述類型的屬性存儲(chǔ)器內(nèi)屬性數(shù)據(jù)(例如,y)的偏移(例如8)。
[0093]在一些實(shí)施例中,優(yōu)化的內(nèi)聯(lián)高速緩存機(jī)制可包括通過(guò)類型嵌入指針的自動(dòng)類型檢查。例如,已知的類型可指定該已知類型的屬性存儲(chǔ)器內(nèi)屬性數(shù)據(jù)的偏移O。要訪問(wèn)預(yù)期為已知類型的對(duì)象的屬性數(shù)據(jù),可僅通過(guò)兩個(gè)加載操作和一個(gè)算術(shù)運(yùn)算,使用對(duì)象的屬性存儲(chǔ)器的類型嵌入指針P來(lái)執(zhí)行優(yōu)化的內(nèi)聯(lián)高速緩存機(jī)制。在一個(gè)實(shí)施例中,硬件已在堆訪問(wèn)期間測(cè)試了指針的一部分(例如,高16位)的事實(shí)可在優(yōu)化的內(nèi)聯(lián)高速緩存機(jī)制中加以利用。
[0094]例如,用于訪問(wèn)來(lái)自對(duì)象屬性存儲(chǔ)器的屬性數(shù)據(jù)的優(yōu)化操作可按以下步驟執(zhí)行:
1.從對(duì)象加載屬性存儲(chǔ)器指針P ;2.從P中減去E*248,其中E為識(shí)別期望類型的標(biāo)識(shí)符;以及3.從P+0加載。如果E匹配對(duì)象的類型,則訪問(wèn)P+0將會(huì)成功,因?yàn)閺腜中減去E*248將導(dǎo)致P的高位為零。但是,如果E不匹配對(duì)象的類型,則P - E*248將得到大于248的某個(gè)值,并且訪問(wèn)P+0將導(dǎo)致硬件陷阱。可注冊(cè)陷阱處理程序以將執(zhí)行轉(zhuǎn)移到用于屬性訪問(wèn)的慢速路徑代碼,這可修復(fù)內(nèi)聯(lián)高速緩存的數(shù)據(jù)或執(zhí)行完整的查找。因此,可通過(guò)優(yōu)化操作來(lái)優(yōu)化內(nèi)聯(lián)高速緩存機(jī)制以訪問(wèn)屬性數(shù)據(jù),而不執(zhí)行代碼以執(zhí)行昂貴的比較和分支操作(例如,以確定對(duì)象是否為匹配已知類型的類型)。
[0095]在一個(gè)實(shí)施例中,類型嵌入指針可允許對(duì)大量的動(dòng)態(tài)創(chuàng)建數(shù)據(jù)類型(例如,最多至216種類型)同時(shí)進(jìn)行檢查。另外,可通過(guò)簡(jiǎn)單的算術(shù)運(yùn)算(例如,通過(guò)清除高16位或減去相應(yīng)的類型標(biāo)識(shí)符)隨時(shí)恢復(fù)類型嵌入指針的初始值(例如,存儲(chǔ)器地址)。如果類型標(biāo)識(shí)符不匹配指針中嵌入的類型,則通過(guò)地址的存儲(chǔ)器訪問(wèn)可能不會(huì)成功,所述地址通過(guò)與類型標(biāo)識(shí)符的減法運(yùn)算從類型嵌入指針恢復(fù)。
[0096]圖9為流程圖,其示出了訪問(wèn)特定類型數(shù)據(jù)而無(wú)需比較和分支操作的過(guò)程的一個(gè)實(shí)施例??赏ㄟ^(guò)處理邏輯執(zhí)行示例性過(guò)程900,該處理邏輯可包括硬件、軟件、或它們兩者的組合。例如,過(guò)程900可通過(guò)圖2的系統(tǒng)200的一些組件來(lái)執(zhí)行。在框901處,過(guò)程900的處理邏輯可為根據(jù)類型結(jié)構(gòu)化的數(shù)據(jù)加載(例如,自動(dòng)而不中斷地)指針。例如,可以動(dòng)態(tài)地創(chuàng)建/分配類型,指定如何為該類型的數(shù)據(jù)分配或結(jié)構(gòu)化數(shù)據(jù)元。借助于地址,結(jié)構(gòu)化數(shù)據(jù)在存儲(chǔ)器中可為可尋址的。指針可包括結(jié)構(gòu)化數(shù)據(jù)的地址和類型這兩者。
[0097]在框903處,過(guò)程900的處理邏輯可以通過(guò)對(duì)指針的值執(zhí)行的算術(shù)運(yùn)算和標(biāo)識(shí)已知類型的標(biāo)識(shí)符來(lái)更新指針??梢愿轮羔樢员愦_定通過(guò)指針(例如,通過(guò)在指針中指定的存儲(chǔ)器地址)指向(或?qū)ぶ?的數(shù)據(jù)是否為已知類型,而無(wú)需執(zhí)行比較和分支操作。
[0098]在框905處,過(guò)程900的處理邏輯可以加載(例如自動(dòng)地)通過(guò)已更新指針指向的數(shù)據(jù),例如通過(guò)保持更新指針以對(duì)數(shù)據(jù)進(jìn)行尋址的硬件地址寄存器。如果用一種類型結(jié)構(gòu)化的數(shù)據(jù)匹配已知類型,則數(shù)據(jù)可以成功加載(或檢索)。反之,在一個(gè)實(shí)施例中,硬件陷阱處理程序可被激活。例如,如果通過(guò)指針的存儲(chǔ)器地址指向的數(shù)據(jù)不是已知類型,則已更新的指針可能會(huì)變?yōu)闊o(wú)效的(或指向非法存儲(chǔ)器地址)。在一個(gè)實(shí)施例中,當(dāng)被指示加載數(shù)據(jù)(通過(guò)硬件地址寄存器)時(shí),硬件內(nèi)置邏輯可以自動(dòng)檢測(cè)非法存儲(chǔ)器地址。當(dāng)檢測(cè)到非法存儲(chǔ)器地址時(shí),硬件陷阱可被發(fā)布為直接執(zhí)行陷阱處理程序。
[0099]圖10為流程圖,其示出了用于根據(jù)高速緩存類型訪問(wèn)對(duì)象的數(shù)據(jù)元而無(wú)需執(zhí)行比較和分支操作的過(guò)程的一個(gè)實(shí)施例。可通過(guò)處理邏輯執(zhí)行示例性過(guò)程1000,該處理邏輯可包括硬件、軟件、或它們兩者的組合。例如,過(guò)程1000可通過(guò)圖2的系統(tǒng)200的一些組件來(lái)執(zhí)行。在框1001處,例如,過(guò)程1000的處理邏輯可以存儲(chǔ)第一類型標(biāo)識(shí)符和存儲(chǔ)器地址以表示通過(guò)第一類型標(biāo)識(shí)符標(biāo)識(shí)的第一類型的對(duì)象數(shù)據(jù)。對(duì)象數(shù)據(jù)可在存儲(chǔ)器中的存儲(chǔ)器地址處進(jìn)行分配。
[0100]在框1003處,過(guò)程1000的處理邏輯可將偏移和第二類型標(biāo)識(shí)符進(jìn)行緩存,該第二類型標(biāo)識(shí)符標(biāo)識(shí)用數(shù)據(jù)元進(jìn)行結(jié)構(gòu)化的對(duì)象數(shù)據(jù)的第二類型,該數(shù)據(jù)元以所述偏移位于數(shù)據(jù)的第二類型內(nèi)。數(shù)據(jù)元可對(duì)應(yīng)于為數(shù)據(jù)的第二類型動(dòng)態(tài)分配的屬性。在一個(gè)實(shí)施例中,過(guò)程1000的處理邏輯可能已在先前通過(guò)第二類型的數(shù)據(jù)中的偏移執(zhí)行了對(duì)數(shù)據(jù)元的訪問(wèn)操作。
[0101]在框1005處,過(guò)程1000的處理邏輯可配置指針以基于已緩存的偏移來(lái)訪問(wèn)第一類型的對(duì)象數(shù)據(jù)的特定數(shù)據(jù)元,而無(wú)需執(zhí)行比較和分支操作。已配置的指針可將地址值作為對(duì)象數(shù)據(jù)、已緩存的偏移、標(biāo)識(shí)第一類型的第一類型標(biāo)識(shí)符和標(biāo)識(shí)數(shù)據(jù)的第二類型的已緩存的類型標(biāo)識(shí)符的存儲(chǔ)器地址的算術(shù)組合。
[0102]在框1007處,在一個(gè)實(shí)施例中,過(guò)程1000的處理邏輯可執(zhí)行加載操作以訪問(wèn)來(lái)自已配置指針的對(duì)象數(shù)據(jù)的特定數(shù)據(jù)元。如果標(biāo)識(shí)數(shù)據(jù)對(duì)象的第一類型的第一類型標(biāo)識(shí)符匹配已緩存的第二類型標(biāo)識(shí)符,則可成功加載特定數(shù)據(jù)元。作為另外一種選擇,如果第一類型標(biāo)識(shí)符和第二類型標(biāo)識(shí)符不匹配,則加載操作可激活硬件陷阱處理程序。
[0103]圖11示出了根據(jù)本文所述實(shí)施例表示對(duì)象的類型嵌入指針的一個(gè)例子。實(shí)例1100可包括指向?qū)ο髥卧?103以表示對(duì)象的對(duì)象指針O 1101。對(duì)象單元1103可包括配置(例如,通過(guò)低48位)有對(duì)象屬性存儲(chǔ)1107的地址的類型嵌入指針1105,該對(duì)象屬性存儲(chǔ)被分配用于存儲(chǔ)對(duì)象O的屬性。另外,可使用標(biāo)識(shí)類型數(shù)據(jù)1109的標(biāo)識(shí)符來(lái)標(biāo)記(例如,通過(guò)高16位)類型嵌入指針1105。在一些實(shí)施例中,可動(dòng)態(tài)地創(chuàng)建類型數(shù)據(jù)1109以指定通過(guò)類型標(biāo)識(shí)符標(biāo)識(shí)的數(shù)據(jù)結(jié)構(gòu)。
[0104]在一個(gè)實(shí)施例中,已知類型1111可為標(biāo)識(shí)數(shù)據(jù)的已緩存類型或現(xiàn)有類型的類型標(biāo)識(shí)符(例如,在運(yùn)行時(shí)期間)??赏ㄟ^(guò)例如能夠表示數(shù)據(jù)的216個(gè)不同類型的64位字的低16位(例如,在基于64位的機(jī)器中)來(lái)表示類型標(biāo)識(shí)符。已配置指針1113可用于訪問(wèn)對(duì)象O的屬性存儲(chǔ)器1107以及驗(yàn)證嵌入在對(duì)象O的類型嵌入指針中的類型標(biāo)識(shí)符是否匹配已知類型1111。例如,可通過(guò)類型嵌入指針1101和已知類型1113上的算術(shù)運(yùn)算而得到已配置指針1113?;谟布臋C(jī)制可基于例如高16位是否為值O、NULL或其他預(yù)定的值等來(lái)自動(dòng)檢查已配置指針1113的有效性。如果已知類型1111不匹配類型數(shù)據(jù)1109的標(biāo)識(shí)符,則可在已配置指針1113中配置了無(wú)效地址。
[0105]圖12為框圖,其示出了用于訪問(wèn)特定類型數(shù)據(jù)而無(wú)需比較和分支操作的系統(tǒng)的一個(gè)實(shí)施例。例如,系統(tǒng)1200可包括圖2的系統(tǒng)200的一些組件。在一個(gè)實(shí)施例中,系統(tǒng)1200可包括類型化數(shù)據(jù)處理程序模塊1201,其用于訪問(wèn)通過(guò)操作環(huán)境201托管的運(yùn)行時(shí)215中的類型化數(shù)據(jù)。在檢查已知類型的類型化數(shù)據(jù)是否利用了基于硬件的機(jī)制時(shí),類型嵌入指針處理程序模塊1205可以配置指針以訪問(wèn)類型化數(shù)據(jù),而無(wú)需執(zhí)行另外的代碼(例如,比較和分支代碼)。
[0106]在一個(gè)實(shí)施例中,屬性訪問(wèn)高速緩存1207可以提供訪問(wèn)對(duì)象的已緩存的(或期望的)類型標(biāo)識(shí)符和/或已緩存的(或期望的)地址偏移。可使用屬性訪問(wèn)高速緩存1207基于類型嵌入指針處理程序模塊1205來(lái)執(zhí)行數(shù)據(jù)訪問(wèn)(或檢索)操作,而無(wú)需額外的加載和/或比較操作成本,從而確定類型和/或存儲(chǔ)器地址偏移以訪問(wèn)目標(biāo)對(duì)象屬性。在一個(gè)實(shí)施例中,可注冊(cè)硬件陷阱處理程序模塊1203以在下列情況下激活或執(zhí)行:在例如使用指針(其使用屬性訪問(wèn)高速緩存1207中的期望類型進(jìn)行配置)訪問(wèn)的目標(biāo)數(shù)據(jù)不同于期望類型時(shí)出現(xiàn)硬件陷阱。
[0107]非確定性編譯代碼的選擇性隨機(jī)化
[0108]運(yùn)行時(shí)編譯器(例如JIT編譯器)可以選擇性地和隨機(jī)地引入非確定性元素,以生成源代碼(例如,遠(yuǎn)程獲取的JavaScript代碼)的不可預(yù)測(cè)的編譯代碼,從而防止嵌入在源代碼內(nèi)的非可信代碼的潛在執(zhí)行。由運(yùn)行時(shí)編譯器在通用源代碼上的單獨(dú)編譯可導(dǎo)致不同的不可預(yù)測(cè)的編譯代碼,而不具有彼此之間的可預(yù)測(cè)性??膳渲眠\(yùn)行時(shí)編譯器以改變所需的保護(hù)度(或隨機(jī)性)和不可預(yù)測(cè)的編譯代碼中所引發(fā)的開(kāi)銷的量。例如,可基于非確定性決策隨機(jī)地在編譯代碼的不同部分處選擇性地應(yīng)用非確定性元素。從而,可以減少運(yùn)行時(shí)編譯器中代碼生成器的可能確定性行為。
[0109]在一個(gè)實(shí)施例中,運(yùn)行時(shí)編譯器可以啟發(fā)式地以隨機(jī)方式(例如,隨機(jī)散發(fā)方式)改變常規(guī)編譯代碼的機(jī)器指令以生成不可預(yù)測(cè)的編譯代碼??梢詣?dòng)態(tài)地應(yīng)用啟發(fā)式評(píng)估以非確定性地決定是否在源代碼的常規(guī)編譯代碼的不同部分處引入不可預(yù)測(cè)性。在一個(gè)實(shí)施例中,在編譯源代碼時(shí),啟發(fā)式評(píng)估可基于源代碼的靜態(tài)或動(dòng)態(tài)測(cè)量或分析而將可信度的量分配到代碼塊。
[0110]例如,從源代碼編譯的每個(gè)代碼單元(例如,值、常量等)可被指定為可信或非可信??蓜?dòng)態(tài)地維護(hù)可信代碼的總大小(例如,字節(jié)數(shù))和非可信代碼的總大小,以提供在編譯期間某個(gè)時(shí)間點(diǎn)處遇到的可信代碼和非可信代碼之間的比率的啟發(fā)式測(cè)度。任選地或另夕卜,啟發(fā)式測(cè)度可包括已被發(fā)射(例如,被生成為不可預(yù)測(cè)的編譯代碼的一部分)的函數(shù)塊代碼(或函數(shù))的數(shù)量、函數(shù)塊代碼的大小、或其他適用的測(cè)度。通常,函數(shù)塊代碼的大小越大,函數(shù)塊代碼可被信任的可能性就越低。相似地,源代碼包括的函數(shù)越多,可認(rèn)為其可信度越低。
[0111]在一個(gè)實(shí)施例中,可以結(jié)合代碼(例如,編譯代碼的塊)可信度的啟發(fā)式測(cè)度,來(lái)確定是否對(duì)作為不可預(yù)測(cè)的編譯代碼的一部分的代碼執(zhí)行隨機(jī)化操作。所述確定可基于隨機(jī)函數(shù)的結(jié)果。隨機(jī)函數(shù)的行為可導(dǎo)致不太可能以與基于啟發(fā)式測(cè)度估算的信任度的量成比例地執(zhí)行隨機(jī)化操作。隨機(jī)函數(shù)可在不可預(yù)測(cè)的編譯代碼中提供非確定性屬性或不可預(yù)測(cè)性。例如,根據(jù)隨機(jī)函數(shù),要隨機(jī)化的常規(guī)編譯代碼的多個(gè)部分可為不可預(yù)測(cè)的。
[0112]在一些實(shí)施例中,可在JIT編譯期間對(duì)已按給定指令流發(fā)射的一定比例的非可信字節(jié)進(jìn)行跟蹤。所述比例可用作加權(quán)因子以決定是否應(yīng)用隨機(jī)化操作以保護(hù)所生成的代碼。該決定可基于一組可根據(jù)環(huán)境易受到這些攻擊的程度而隨環(huán)境變化的啟發(fā)法和隨機(jī)過(guò)程的輸出作出。任何選擇在代碼的哪些部分應(yīng)用隨機(jī)化操作(或硬化點(diǎn))的確定性因素可能會(huì)被阻止。
[0113]示例性隨機(jī)化操作可包括NOP (空操作)填充操作、隨機(jī)指令選擇,常量盲化操作,或其他適用的代碼隨機(jī)化操作??蓤?zhí)行(例如,通過(guò)運(yùn)行時(shí)編譯器的代碼生成器)Ν0Ρ填充操作以隨機(jī)地生成除更改指令之間的間隔外對(duì)執(zhí)行無(wú)影響的指令。隨機(jī)指令選擇操作可利用以下事實(shí):多個(gè)指令可以不同的方式進(jìn)行編碼,或被具有相同結(jié)果(例如,減去正常量相對(duì)于加上負(fù)常量)的其他指令取代??蓤?zhí)行常量盲化操作以用通過(guò)可逆操作生成的另一個(gè)常量來(lái)替換某個(gè)常量(例如,被攻擊者使用),然后執(zhí)行代碼以進(jìn)行逆向轉(zhuǎn)換。
[0114]運(yùn)行時(shí)編譯器中的選擇性隨機(jī)化可有效地阻止攻擊者嘗試執(zhí)行嵌入在源代碼中的非可信代碼(例如,JIT Spray攻擊),同時(shí)限制引發(fā)的資源開(kāi)銷(例如,在所需的代碼大小、總運(yùn)行時(shí)和/或存儲(chǔ)器空間中引發(fā)的資源開(kāi)銷)。雖然選擇性隨機(jī)化可對(duì)代碼的某些子集(例如,代碼的某些常量而不是所有常量)應(yīng)用隨機(jī)化操作(例如,常量盲化操作),但在已發(fā)射編譯代碼中引入的隨機(jī)性和不可預(yù)測(cè)性可以防止實(shí)際的攻擊,例如JIT Spray攻擊或其他攻擊。例如,不能迫使代碼生成器生成按照攻擊者期望那樣被處理器解譯的指令。
[0115]圖13為流程圖,其示出了以非確定性方式選擇性地隨機(jī)化來(lái)自源代碼的編譯代碼的過(guò)程的一個(gè)實(shí)施例。可通過(guò)處理邏輯執(zhí)行示例性過(guò)程1300,該處理邏輯可包括硬件、軟件、或它們兩者的組合。例如,過(guò)程1300可通過(guò)圖2的系統(tǒng)200的一些組件來(lái)執(zhí)行。在框1301處,過(guò)程1300的處理邏輯可動(dòng)態(tài)地確定啟發(fā)式指示器,該啟發(fā)式指示器指示用于生成源代碼的編譯代碼的源代碼可信度的可能性。啟發(fā)式指示器可指示代碼的一部分(例如,在代碼中創(chuàng)建的值)是否可信、可信代碼的量、非可信代碼的量、可信代碼和非可信代碼之間的相對(duì)大小、代碼函數(shù)塊的總大小、啟發(fā)式環(huán)境設(shè)置、或其他適用的啟發(fā)式估算。
[0116]在框1303處,過(guò)程1300的處理邏輯可根據(jù)啟發(fā)式指示器非確定性地選擇編譯代碼的多個(gè)部分。過(guò)程1300的處理邏輯可使編譯代碼的所選擇部分隨機(jī)化,以將不可預(yù)測(cè)性引入到隨機(jī)化編譯代碼,而不會(huì)在未隨機(jī)化的編譯代碼的未選擇部分中引發(fā)執(zhí)行成本。源代碼的隨機(jī)化編譯代碼可能無(wú)法通過(guò)源代碼的獨(dú)立編譯代碼來(lái)預(yù)測(cè)。在框1305處,過(guò)程1300的處理邏輯可以執(zhí)行從源代碼編譯的隨機(jī)化編譯代碼,而不會(huì)執(zhí)行嵌入在源代碼內(nèi)的潛在非可信代碼。
[0117]圖14為流程圖,其示出了用于從源代碼的編譯代碼流以非確定性隨機(jī)方式發(fā)射可執(zhí)行代碼的過(guò)程的一個(gè)實(shí)施例??赏ㄟ^(guò)處理邏輯執(zhí)行示例性過(guò)程1400,該處理邏輯可包括硬件、軟件、或它們兩者的組合。例如,過(guò)程1400可通過(guò)圖2的系統(tǒng)200的一些組件來(lái)執(zhí)行。在框1401處,在一個(gè)實(shí)施例中,過(guò)程1400的處理邏輯可以動(dòng)態(tài)地跟蹤已發(fā)射代碼流中的非可信代碼與可信代碼的比例(例如,以將下一代碼發(fā)射到代碼流),以便生成可執(zhí)行代碼。過(guò)程1400的處理邏輯可在運(yùn)行時(shí)期間將源代碼(例如,JavaScript代碼)編譯成可執(zhí)行代碼。
[0118]在框1403處,過(guò)程1400的處理邏輯可以確定準(zhǔn)備用于發(fā)射的下一代碼是否可信。例如,下一代碼可為緊接編譯代碼中已發(fā)射代碼流的代碼塊(例如,指令)。下一代碼可能不可信,例如具有從不可信源代碼(接收或檢索自未驗(yàn)證的源)創(chuàng)建或指定的值或常量。作為另外一種選擇,由編譯器創(chuàng)建或控制的值(例如編程語(yǔ)言的內(nèi)置常量)可以被信任。
[0119]如果在框1405處下一代碼不可信,則過(guò)程1400的處理邏輯可以隨機(jī)地確定是否例如基于被動(dòng)態(tài)跟蹤的非可信代碼與可信代碼的比例來(lái)更改下一代碼。過(guò)程1400的處理邏輯可以選擇性地執(zhí)行隨機(jī)化操作以隨機(jī)化或更改下一代碼,從而允許對(duì)已發(fā)射代碼流中的隨機(jī)化量進(jìn)行非確定性調(diào)整以便提高隨機(jī)化編譯代碼的執(zhí)行性能。例如,非可信代碼的比例越高,可隨機(jī)化下一代碼的可能性就越大。
[0120]在框1407處,如果選擇下一代碼進(jìn)行隨機(jī)化,則過(guò)程1400的處理邏輯可對(duì)下一代碼執(zhí)行一個(gè)或多個(gè)隨機(jī)化操作以隱藏嵌入在下一代碼中的潛在非可信可執(zhí)行指令。隨機(jī)化操作可為常量盲化操作、NOP填充操作、指令隨機(jī)化操作、或用于下一代碼的其他合適操作。在框1409處,過(guò)程1400的處理邏輯可以將隨機(jī)化代碼發(fā)射到用于執(zhí)行的代碼流。
[0121]圖15A-15B示出了根據(jù)本文所述某些實(shí)施例的采用分散隨機(jī)化操作的即時(shí)編譯的例子。現(xiàn)在轉(zhuǎn)到圖15A,代碼塊(或指令)1501可包括非可信恒定值I??蛇x擇性地應(yīng)用隨機(jī)化操作(例如常量盲化操作)以使用任意數(shù)57382將代碼塊1501隨機(jī)化或更改為代碼塊1503,從而執(zhí)行與塊1501相同的函數(shù)。通過(guò)代碼塊1501中的非可信值I嵌入的潛在隱藏可執(zhí)行指令可被防止在代碼塊1503中執(zhí)行。
[0122]實(shí)例1500B描述了用于選擇性地隨機(jī)化編譯代碼以按成本有效方式引入可預(yù)測(cè)性的示例性操作。在1505處,基于當(dāng)前在編譯代碼流中遇到的非可信值的總數(shù)(或字節(jié)數(shù))以及可信值的總數(shù),針對(duì)非可信內(nèi)容與可信內(nèi)容的比例來(lái)計(jì)算啟發(fā)式測(cè)度。在1507處,執(zhí)行隨機(jī)選擇以確定是否應(yīng)用隨機(jī)操作以隨機(jī)化要發(fā)射的代碼(或硬化某個(gè)值)。在一個(gè)實(shí)施例中,由于非可信內(nèi)容的比例變高,因此隨機(jī)化代碼的可能性可增大。通過(guò)在1507處包含隨機(jī)數(shù),選擇操作、進(jìn)而已發(fā)射的編譯代碼可變得不確定或不可預(yù)測(cè)。
[0123]在一些實(shí)施例中,可以估算非可信代碼的比例以指示非可信代碼大小與當(dāng)前遇到的代碼(可信代碼和非可信代碼兩者)的總大小的比率。1507處的函數(shù)randomNumber可返回介于O和I之間的隨機(jī)值。在一個(gè)實(shí)施例中,如果所指示的比率大于所返回的隨機(jī)值,則當(dāng)前非可信代碼可被硬化(或隨機(jī)化)。從而,非可信代碼的比例越高,可硬化當(dāng)前非可信代碼以用于發(fā)射的可能性就越大。
[0124]在一個(gè)實(shí)施例中,函數(shù)發(fā)射(例如,在1509處)可將字節(jié)一直傳輸?shù)街噶盍鞫鵁o(wú)需修改。1511處的函數(shù)emitHardenedValue可以執(zhí)行一個(gè)或多個(gè)隨機(jī)化操作以硬化正被發(fā)射的值。所應(yīng)用的隨機(jī)化操作可以不被攻擊者所預(yù)測(cè)。1513處的函數(shù)decayUntrustedByteCount可以應(yīng)用衰減因子來(lái)調(diào)節(jié)(例如,動(dòng)態(tài)地減少)所遇到的非可信值的總數(shù)(例如,untrustedBytes)。
[0125]實(shí)例1500B可包括可配置的參數(shù)或函數(shù),所述可配置的參數(shù)或函數(shù)基于啟發(fā)式地確定的環(huán)境設(shè)置(例如,基于源代碼的接收位置、主機(jī)操作系統(tǒng)的版本、用戶輸入或其他適用的設(shè)置)以調(diào)節(jié)例如攻擊者防護(hù)效果與代碼執(zhí)行效率。例如,可應(yīng)用1513處的衰減因子以防止懲罰所有大的代碼段,因?yàn)橛晒粽咧踩氲臐撛陔[藏非可信代碼可能已在發(fā)射硬化值之前被破壞。在不應(yīng)用衰減因子(例如,decayUntrustedByteCount)的情況下,實(shí)例1500B中的操作可能最終進(jìn)入編譯代碼的幾乎所有值均被硬化的狀態(tài)。相似地,非可信值的總數(shù)的快速衰減可能會(huì)導(dǎo)致對(duì)于要發(fā)起成功攻擊的攻擊者而言足夠大的非硬化值流。從而,行1513處的decayUntrustedByteCount可應(yīng)用已被確定適用于目標(biāo)環(huán)境的衰減因子,例如,通過(guò) 1507 處環(huán)境設(shè)置的 EnviornmentSafetyHeuristic。
[0126]圖16示出了諸如計(jì)算機(jī)系統(tǒng)的數(shù)據(jù)處理系統(tǒng)的一個(gè)例子,該數(shù)據(jù)處理系統(tǒng)可與本發(fā)明的一個(gè)實(shí)施例一起使用。例如,圖2的系統(tǒng)2可被實(shí)現(xiàn)為圖16所示系統(tǒng)的一部分。需注意,雖然圖16示出了計(jì)算機(jī)系統(tǒng)的各種組件,它并不旨在表示使這些組件互連的任何特定構(gòu)造或方式,因此這些細(xì)節(jié)與本發(fā)明并無(wú)密切關(guān)系。還應(yīng)理解,具有較少組件或可能較多組件的網(wǎng)絡(luò)計(jì)算機(jī)以及其他數(shù)據(jù)處理系統(tǒng)也可用于本發(fā)明。
[0127]如圖16所示,數(shù)據(jù)處理系統(tǒng)形式的計(jì)算機(jī)系統(tǒng)1600包括聯(lián)接到一個(gè)或多個(gè)微處理器1605、R0M(只讀存儲(chǔ)器)1607、易失性RAM 1609和非易失性存儲(chǔ)器1611的總線1603。微處理器1605可從存儲(chǔ)器1607,1609,1611檢索指令并執(zhí)行所述指令以執(zhí)行上述操作。總線1603與這些各種組件互連在一起,并且將這些組件1605,1607, 1609和1611互連至顯示控制器和顯示設(shè)備1613,以及互連至諸如輸入/輸出(I/O)設(shè)備的外圍設(shè)備,該輸入/輸出(I/O)設(shè)備可以是鼠標(biāo)、鍵盤(pán)、調(diào)制解調(diào)器、網(wǎng)絡(luò)接口、打印機(jī)和本領(lǐng)域熟知的其他設(shè)備。通常,輸入/輸出設(shè)備1615通過(guò)輸入/輸出控制器1617聯(lián)接到系統(tǒng)。易失性RAM(隨機(jī)存取存儲(chǔ)器)1609通常被實(shí)現(xiàn)為動(dòng)態(tài)RAM(DRAM),其需要連續(xù)供電以刷新或維持存儲(chǔ)器中的數(shù)據(jù)。
[0128]大容量存儲(chǔ)器1611通常為磁性硬盤(pán)驅(qū)動(dòng)器或磁性光驅(qū)或光驅(qū)或DVDRAM或閃存存儲(chǔ)器或者即使在系統(tǒng)斷電后也保持?jǐn)?shù)據(jù)(例如,大量數(shù)據(jù))的其他類型的存儲(chǔ)器系統(tǒng)。通常,大容量存儲(chǔ)器1611也可以是隨機(jī)存取存儲(chǔ)器,雖然這并非必需。雖然圖16顯示,大容量存儲(chǔ)器1611是直接聯(lián)接到數(shù)據(jù)處理系統(tǒng)中的其余組件的本地設(shè)備,但應(yīng)當(dāng)理解,本發(fā)明可利用遠(yuǎn)離系統(tǒng)的非易失性存儲(chǔ)器,例如網(wǎng)絡(luò)存儲(chǔ)設(shè)備,其通過(guò)例如調(diào)制解調(diào)器或以太網(wǎng)接口或無(wú)線網(wǎng)絡(luò)接口等網(wǎng)絡(luò)接口聯(lián)接到數(shù)據(jù)處理系統(tǒng)??偩€1603可包括一條或多條總線,其通過(guò)本領(lǐng)域熟知的各種橋接器、控制器和/或適配器相互連接。
[0129]上述內(nèi)容的多個(gè)部分可使用諸如專用邏輯電路的邏輯電路實(shí)現(xiàn),或使用微控制器或執(zhí)行程序代碼指令的處理核心的其他形式實(shí)現(xiàn)。從而,可使用諸如機(jī)器可執(zhí)行指令的程序代碼來(lái)執(zhí)行上述討論所教導(dǎo)的過(guò)程,所述機(jī)器可執(zhí)行指令使機(jī)器執(zhí)行這些指令以執(zhí)行某些函數(shù)。在該上下文中,“機(jī)器”可為將中間形式(或“抽象”)指令轉(zhuǎn)換為處理器專用指令(例如,諸如“虛擬機(jī)”(例如,Java虛擬機(jī))、解譯器、公共語(yǔ)言運(yùn)行時(shí)、高級(jí)語(yǔ)言虛擬機(jī)等的抽象執(zhí)行環(huán)境)的機(jī)器,和/或設(shè)置在半導(dǎo)體芯片(例如,使用晶體管實(shí)現(xiàn)的“邏輯電路”)上的電子電路,其設(shè)計(jì)用于執(zhí)行諸如通用處理器和/或?qū)S锰幚砥鞯闹噶?。上述討論所教?dǎo)的過(guò)程也可以通過(guò)(作為機(jī)器的替代或與機(jī)器結(jié)合)電子電路執(zhí)行,該電子電路設(shè)計(jì)用于執(zhí)行過(guò)程(或其一部分)而不執(zhí)行程序代碼。
[0130]制造的制品可用于存儲(chǔ)程序代碼。存儲(chǔ)程序代碼的制造的制品可體現(xiàn)為但不限于一個(gè)或多個(gè)存儲(chǔ)器(例如,一個(gè)或多個(gè)閃存存儲(chǔ)器、隨機(jī)存取存儲(chǔ)器(靜態(tài)、動(dòng)態(tài)或其他))、光盤(pán)、CD-ROM、DVD ROM、EPROM、EEPR0M、磁卡或光卡、或適用于存儲(chǔ)電子指令的其他類型的機(jī)器可讀介質(zhì)。也可借助于包含在傳播介質(zhì)(例如,通過(guò)通信鏈路(例如網(wǎng)絡(luò)連接))中的數(shù)據(jù)信號(hào)將程序代碼從遠(yuǎn)程計(jì)算機(jī)(例如,服務(wù)器)下載到請(qǐng)求計(jì)算機(jī)(例如,客戶端)。
[0131]已按照對(duì)計(jì)算機(jī)存儲(chǔ)器中的數(shù)據(jù)位進(jìn)行操作的算法和符號(hào)表示來(lái)呈現(xiàn)前面的詳細(xì)描述。這些算法描述和表示是數(shù)據(jù)處理領(lǐng)域技術(shù)人員所用的工具,而這些工具也能最有效地將其工作實(shí)質(zhì)傳達(dá)給該領(lǐng)域其他技術(shù)人員。算法在本文中并且通常被認(rèn)為是引導(dǎo)至所需結(jié)果的自相一致的操作序列。操作是需要實(shí)際操控物理量的那些操作。通常,盡管不是必須的,這些量采用能夠被存儲(chǔ)、傳輸、組合、比較以及換句話講操縱的電信號(hào)或磁信號(hào)的形式。已被證明的是,其在主要出于通用原因而將這些信號(hào)指代為位、值、元素、符號(hào)、字符、項(xiàng)、數(shù)字等時(shí)是方便的。
[0132]然而,應(yīng)當(dāng)牢記的是,所有這些以及類似的術(shù)語(yǔ)都與適當(dāng)?shù)奈锢砹肯嚓P(guān)聯(lián),并且只是應(yīng)用于這些量的方便標(biāo)簽。除非另外特別說(shuō)明,否則從上述討論中顯而易見(jiàn)的是,可以理解,在整個(gè)說(shuō)明書(shū)中,使用例如諸如“處理”或“運(yùn)算”或“計(jì)算”或“確定”或“顯示”等術(shù)語(yǔ)的討論是指計(jì)算機(jī)系統(tǒng)或類似的電子計(jì)算設(shè)備的操作和流程,其可對(duì)計(jì)算機(jī)系統(tǒng)寄存器和存儲(chǔ)器中表示為物理(電子)量的數(shù)據(jù)進(jìn)行操作,并將其轉(zhuǎn)換成在計(jì)算機(jī)系統(tǒng)存儲(chǔ)器或寄存器或其他此類信息存儲(chǔ)、傳輸或顯示設(shè)備中相似地顯示為物理量的其他數(shù)據(jù)。
[0133]本發(fā)明還涉及一種用于執(zhí)行本文所述操作的裝置。該裝置可專門構(gòu)造用于所需的目的,或者其可以包括由存儲(chǔ)在計(jì)算機(jī)中的計(jì)算機(jī)程序選擇性地激活或重新配置的通用計(jì)算機(jī)。此類計(jì)算機(jī)程序可存儲(chǔ)在計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)中,例如但不限于任何類型的盤(pán),包括軟盤(pán)、光盤(pán)、CD-ROM和磁光盤(pán),只讀存儲(chǔ)器(ROM)、RAM、EPROM、EEPR0M、磁卡或光卡、或適合用于存儲(chǔ)電子指令的任何類型的介質(zhì),并且每個(gè)均聯(lián)接到計(jì)算機(jī)系統(tǒng)總線。
[0134]本文中所呈現(xiàn)的過(guò)程和顯示并不固有地與任何特定計(jì)算機(jī)或其他裝置相關(guān)。根據(jù)本文的教導(dǎo)內(nèi)容,各種通用系統(tǒng)可以與程序一起使用,或者可以證明其便于構(gòu)造用于執(zhí)行所述操作的更專用的裝置。根據(jù)下文的描述,用于各種這些系統(tǒng)的所需結(jié)構(gòu)將是顯而易見(jiàn)的。此外,本發(fā)明未參照任何特定的編程語(yǔ)言進(jìn)行描述。應(yīng)當(dāng)理解,多種編程語(yǔ)言可用于實(shí)現(xiàn)如本文所述的本發(fā)明的教導(dǎo)內(nèi)容。
[0135]前面的討論僅描述了本發(fā)明的一些示例性實(shí)施例。本領(lǐng)域的技術(shù)人員將易于從這些討論、附圖和權(quán)利要求書(shū)中認(rèn)識(shí)到,可在不脫離本發(fā)明的實(shí)質(zhì)和范圍的情況下進(jìn)行各種修改。
【權(quán)利要求】
1.一種其內(nèi)具有指令的機(jī)器可讀非暫態(tài)存儲(chǔ)介質(zhì),所述指令在被機(jī)器執(zhí)行時(shí),使得所述機(jī)器執(zhí)行一種方法,所述方法包括: 檢查鍵的元數(shù)據(jù)以確定是否在當(dāng)前分配的數(shù)據(jù)對(duì)象中執(zhí)行查找操作以便在執(zhí)行代碼的運(yùn)行時(shí)期間訪問(wèn)數(shù)據(jù)對(duì)象的屬性,所述屬性由所述鍵索引,所述運(yùn)行時(shí)具有其中所述當(dāng)前分配的數(shù)據(jù)對(duì)象包括所述數(shù)據(jù)對(duì)象的運(yùn)行時(shí)狀態(tài),所述鍵的元數(shù)據(jù)包含全局信息,所述全局信息與和所述運(yùn)行時(shí)狀態(tài)的每個(gè)數(shù)據(jù)對(duì)象一致的所述鍵相關(guān); 如果所述鍵的元數(shù)據(jù)滿足某些條件,則針對(duì)所述數(shù)據(jù)對(duì)象的屬性直接執(zhí)行訪問(wèn)操作,而不執(zhí)行所述查找操作;以及 更新所述鍵的元數(shù)據(jù)以保持與所述運(yùn)行時(shí)狀態(tài)的一致性,所述運(yùn)行時(shí)狀態(tài)使用針對(duì)所述數(shù)據(jù)對(duì)象的屬性執(zhí)行的所述訪問(wèn)操作來(lái)更新。
2.根據(jù)權(quán)利要求1所述的介質(zhì),其中所述元數(shù)據(jù)包含多位結(jié)構(gòu),每個(gè)位具有二進(jìn)制值,所述二進(jìn)制值指示與關(guān)于所述鍵的所述位相關(guān)聯(lián)的斷言是否相對(duì)于所述運(yùn)行時(shí)狀態(tài)在全局范圍內(nèi)為真。
3.根據(jù)權(quán)利要求2所述的介質(zhì),其中所述斷言的驗(yàn)證與在相對(duì)于所述運(yùn)行時(shí)狀態(tài)下的所述鍵的當(dāng)前分配的數(shù)據(jù)對(duì)象中的搜索對(duì)應(yīng),并且其中所述元數(shù)據(jù)被保持以避免所述搜 索。
4.根據(jù)權(quán)利要求3所述的介質(zhì),其中所述多位結(jié)構(gòu)包含位,所述位指示是否在所述運(yùn)行時(shí)狀態(tài)下使用所述鍵。
5.根據(jù)權(quán)利要求2所述的介質(zhì),其中所述數(shù)據(jù)對(duì)象與包括所述屬性的一個(gè)或多個(gè)屬性相關(guān)聯(lián),其中所述屬性與被一個(gè)或多個(gè)鍵索引的散列結(jié)構(gòu)中的所述屬性的特性一起存儲(chǔ)。
6.根據(jù)權(quán)利要求5所述的介質(zhì),其中所述運(yùn)行時(shí)狀態(tài)包括鍵元數(shù)據(jù),所述鍵元數(shù)據(jù)存儲(chǔ)對(duì)應(yīng)于包括鍵的多個(gè)鍵的多個(gè)元數(shù)據(jù),并且其中所述鍵未用于索引所述運(yùn)行時(shí)狀態(tài)的所述當(dāng)前分配數(shù)據(jù)對(duì)象中的屬性。
7.根據(jù)權(quán)利要求6所述的介質(zhì),其中所述鍵的元數(shù)據(jù)包含特定的位,所述特定的位指示所述鍵未在所述運(yùn)行時(shí)狀態(tài)下使用。
8.根據(jù)權(quán)利要求7所述的介質(zhì),其中執(zhí)行所述訪問(wèn)操作以在被所述鍵索引的所述散列結(jié)構(gòu)中添加所述數(shù)據(jù)對(duì)象的新屬性。
9.根據(jù)權(quán)利要求8所述的介質(zhì),其中更新所述元數(shù)據(jù)以包含所述特定的位,所述特定的位指示所述鍵在所述運(yùn)行時(shí)狀態(tài)下使用。
10.根據(jù)權(quán)利要求1所述的介質(zhì),其中從源代碼編譯所述代碼,并且其中從所述源代碼識(shí)別所述鍵。
11.根據(jù)權(quán)利要求1所述的介質(zhì),其中在所述運(yùn)行時(shí)期間從所述代碼動(dòng)態(tài)地創(chuàng)建所述鍵。
12.根據(jù)權(quán)利要求1所述的介質(zhì),其中所述代碼為來(lái)自所述源代碼的優(yōu)化編譯代碼,其中所述全局信息包括所述鍵的屬性值,其中所述代碼包括與所述鍵的所述屬性值相關(guān)聯(lián)的代碼塊,并且其中更新所述元數(shù)據(jù)包括: 更新所述鍵的所述屬性值;以及 確定是否根據(jù)所述鍵的所述已更新屬性值使所述代碼塊失效。
13.根據(jù)權(quán)利要求12所述的介質(zhì),其中所述代碼塊將執(zhí)行所述數(shù)據(jù)對(duì)象的特定操作而不執(zhí)行搜索操作,還包括: 如果所述代碼塊失效,則使用獨(dú)立的代碼塊更新所述代碼以執(zhí)行所述數(shù)據(jù)對(duì)象的所述特定操作,其中所述獨(dú)立的代碼塊包括一個(gè)或多個(gè)搜索操作。
14.一種其內(nèi)具有指令的機(jī)器可讀非暫態(tài)存儲(chǔ)介質(zhì),所述指令在被機(jī)器執(zhí)行時(shí),使得所述機(jī)器執(zhí)行一種方法,所述方法包括: 針對(duì)與從所述源代碼編譯的代碼中的鍵相關(guān)聯(lián)的源代碼的多個(gè)部分推測(cè)生成編譯代碼,具有運(yùn)行時(shí)狀態(tài)的在運(yùn)行時(shí)期間執(zhí)行的所述代碼包括用一個(gè)或多個(gè)鍵索引的一個(gè)或多個(gè)散列數(shù)據(jù),所述鍵具有元數(shù)據(jù),所述元數(shù)據(jù)包括在所述運(yùn)行時(shí)狀態(tài)下的所述散列數(shù)據(jù)中的所述鍵的一個(gè)或多個(gè)全局屬性; 更新所述鍵的元數(shù)據(jù)以保持所述鍵的全局屬性與所述運(yùn)行時(shí)狀態(tài)之間的一致性; 確定與所述鍵相關(guān)聯(lián)的所述推測(cè)生成的編譯代碼是否因所述鍵的所述已更新元數(shù)據(jù)而失效,以保證所述推測(cè)生成的編譯代碼具有可靠性,而不會(huì)在所述散列數(shù)據(jù)上引發(fā)查找操作;以及 如果所述推測(cè)生成的編譯代碼失效,則針對(duì)與所述鍵相關(guān)聯(lián)的所述源代碼的所述多個(gè)部分更新所述代碼,其中執(zhí)行所述已更新代碼而不執(zhí)行所述推測(cè)生成的編譯代碼。
15.根據(jù)權(quán)利要求14所述的介質(zhì),其中使用被導(dǎo)向所述推測(cè)生成的編譯代碼的執(zhí)行路徑來(lái)執(zhí)行所述代碼而不執(zhí)行查找操作,并且其中執(zhí)行所述已更新代碼以重新導(dǎo)向來(lái)自所述推測(cè)生成的編譯代碼的所述執(zhí)行路徑,所述重新導(dǎo)向的執(zhí)行路徑包括在所述運(yùn)行時(shí)狀態(tài)的所述散列數(shù)據(jù)中的查找操作。
16.根據(jù)權(quán)利要求14所述的介質(zhì),其中所述鍵的所述全局屬性具有值,并且其中所述確定基于所述值是否滿足某些條件。
17.根據(jù)權(quán)利要求16所述的介質(zhì),其中所述推測(cè)生成的編譯代碼基于所述鍵的所述全局屬性的初始值。
18.根據(jù)權(quán)利要求17所述的介質(zhì),其中所述鍵的所述全局屬性指示是否在所述運(yùn)行時(shí)狀態(tài)下使用所述鍵來(lái)索引所述散列數(shù)據(jù),并且其中具有所述初始值的所述全局屬性指示所述鍵當(dāng)前未在所述運(yùn)行時(shí)狀態(tài)下使用。
19.根據(jù)權(quán)利要求14所述的介質(zhì),其中根據(jù)所述代碼的所述執(zhí)行來(lái)更新所述運(yùn)行時(shí)狀態(tài)下的所述一個(gè)或多個(gè)散列數(shù)據(jù),并且其中根據(jù)所述一個(gè)或多個(gè)已更新的散列數(shù)據(jù)來(lái)更新所述元數(shù)據(jù)以保持所述一致性。
20.根據(jù)權(quán)利要求14所述的介質(zhì),其中所述鍵從所述源代碼進(jìn)行概要分析。
21.—種計(jì)算機(jī)實(shí)現(xiàn)的方法,包括: 檢查鍵的元數(shù)據(jù)以確定是否在當(dāng)前分配的數(shù)據(jù)對(duì)象中執(zhí)行查找操作以便在執(zhí)行代碼的運(yùn)行時(shí)期間訪問(wèn)數(shù)據(jù)對(duì)象的屬性,所述屬性由所述鍵索引,所述運(yùn)行時(shí)具有其中所述當(dāng)前分配的數(shù)據(jù)對(duì)象包括所述數(shù)據(jù)對(duì)象的運(yùn)行時(shí)狀態(tài),所述鍵的元數(shù)據(jù)包含全局信息,所述全局信息與和所述運(yùn)行時(shí)狀態(tài)的每個(gè)數(shù)據(jù)對(duì)象一致的所述鍵相關(guān); 如果所述鍵的元數(shù)據(jù)滿足某些條件,則針對(duì)所述數(shù)據(jù)對(duì)象的屬性直接執(zhí)行訪問(wèn)操作而不執(zhí)行所述查找操作;以及 更新所述鍵的元數(shù)據(jù)以保持與所述運(yùn)行時(shí)狀態(tài)的一致性,所述運(yùn)行時(shí)狀態(tài)使用針對(duì)所述數(shù)據(jù)對(duì)象的屬性執(zhí)行的所述訪問(wèn)操作來(lái)更新。
22.—種計(jì)算機(jī)系統(tǒng),包括: 存儲(chǔ)可執(zhí)行指令的存儲(chǔ)器,所述可執(zhí)行指令包括從源代碼編譯的代碼; 動(dòng)態(tài)地獲取所述源代碼的接口 ;和 聯(lián)接到所述存儲(chǔ)器和所述接口以執(zhí)行所述指令的處理器,所述處理器被配置為:檢查鍵的元數(shù)據(jù)以確定是否在當(dāng)前分配的數(shù)據(jù)對(duì)象中執(zhí)行查找操作以便在執(zhí)行所述代碼的運(yùn)行時(shí)期間訪問(wèn)數(shù)據(jù)對(duì)象的屬性,所述屬性由所述鍵索引,所述運(yùn)行時(shí)具有其中所述當(dāng)前分配的數(shù)據(jù)對(duì)象包括所述數(shù)據(jù)對(duì)象的運(yùn)行時(shí)狀態(tài),所述鍵的元數(shù)據(jù)包含全局信息,所述全局信息與和所述運(yùn)行時(shí)狀態(tài)的每個(gè)數(shù)據(jù)對(duì)象一致的所述鍵相關(guān), 如果所述鍵的元數(shù)據(jù)滿足某些條件,則針對(duì)所述數(shù)據(jù)對(duì)象的所述屬性直接執(zhí)行訪問(wèn)操作而不執(zhí)行所述查找操作,以及 更新所述鍵的 元數(shù)據(jù)以保持與所述運(yùn)行時(shí)狀態(tài)的一致性,所述運(yùn)行時(shí)狀態(tài)使用針對(duì)所述數(shù)據(jù)對(duì)象的屬性執(zhí)行的所述訪問(wèn)操作來(lái)更新。
【文檔編號(hào)】G06F9/455GK104081350SQ201380007185
【公開(kāi)日】2014年10月1日 申請(qǐng)日期:2013年1月31日 優(yōu)先權(quán)日:2012年2月3日
【發(fā)明者】G·巴瑞克羅, F·J·皮茨羅 申請(qǐng)人:蘋(píng)果公司