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