動態(tài)編程中的執(zhí)行防護的制作方法
【專利摘要】揭示了用于基于動態(tài)語言執(zhí)行機器代碼的方法。執(zhí)行防護被創(chuàng)建為存儲在數(shù)據(jù)結(jié)構(gòu)中的值。該值代表機器代碼的可重新使用部分的預(yù)期條件或條件集。代表所預(yù)期的條件的值與在機器代碼的一部分的執(zhí)行期間遇到的實際值進行比較。如果實際值對應(yīng)于代表所預(yù)期的條件的值,則可重新使用的機器代碼被執(zhí)行。如果任何預(yù)期的條件改變,則執(zhí)行防護被無效。
【專利說明】動態(tài)編程中的執(zhí)行防護
[0001 ] 背景
[0002]動態(tài)語言已經(jīng)在web編程中變得普遍。作為示例,JavaScript已經(jīng)因其靈活性、易于原型制作、以及可移植性而變成了針對客戶端側(cè)應(yīng)用的選擇的語言。由于web應(yīng)用變得更加復(fù)雜,計算正越來越多被委托到客戶端側(cè)以減少網(wǎng)絡(luò)流量并改善用戶體驗。由于各種原因,諸如JavaScript可容易地分布,因此JavaScript也在服務(wù)器側(cè)編程、游戲開發(fā)、以及桌面應(yīng)用的創(chuàng)建中變得普遍。
[0003]在JavaScript中,以及其它動態(tài)語言中,變量類型可在運行時被改變。因此,動態(tài)語言編譯器或引擎通常不生成專用于一種類型的機器代碼。相反,動態(tài)語言編譯器通常發(fā)出被適配來與各種類型組合一起運行的類屬代碼、或字節(jié)碼。相反,以更加傳統(tǒng)的語言(諸如C或C++寫的程序)包括類型信息,并且編譯器可為指定類型提供通用機器代碼。來自動態(tài)語言編譯器的字節(jié)碼通過解釋器來執(zhí)行,其可顯著慢于指定類型的機器代碼的執(zhí)行。簡單動態(tài)語言腳本的執(zhí)行低效率對用戶而言相對不易察覺。然而,在更加計算密集的應(yīng)用中,這些執(zhí)行低效率可能不利地影響用戶體驗。
[0004]部分歸因于動態(tài)語言在web編程中的普遍存在,動態(tài)編譯器或引擎被開發(fā)以減少與通過解釋器來執(zhí)行類屬代碼相關(guān)聯(lián)的低效率。一些優(yōu)化引擎嘗試標識類型穩(wěn)定的字節(jié)碼的序列,并將它們編譯成類型特定的機器代碼。這提供了字節(jié)碼序列的高效執(zhí)行同時條件如預(yù)期的那樣保持。如果引擎遇到未預(yù)期的條件,幫助者例程可從類型特定的機器代碼跳出并返回到使用針對該字節(jié)碼的解釋器。然而,當前用于確定條件是否預(yù)期的機制可能限制增加開銷并減少執(zhí)行效率。
[0005]概述
[0006]提供本概述以便以簡化的形式介紹將在以下的詳細描述中進一步描述的一些概念。本
【發(fā)明內(nèi)容】
并不旨在標識出所要求保護的主題的關(guān)鍵特征或必要特征,也不旨在用于限定所要求保護的主題的范圍。
[0007]本公開涉及用于基于動態(tài)語言,諸如JavaScript,執(zhí)行機器代碼的方法。執(zhí)行防護被創(chuàng)建為存儲在數(shù)據(jù)結(jié)構(gòu)中的值。該值代表機器代碼的可重新使用部分的預(yù)期條件。代表所預(yù)期的條件的值與稍后在機器代碼的一部分的執(zhí)行期間遇到的實際值進行比較。如果實際值對應(yīng)于代表所預(yù)期的條件的值,則可重新使用的機器代碼被執(zhí)行。如果實際值不對應(yīng)于代表所預(yù)期的條件的值,則執(zhí)行防護被無效。該方法可被實現(xiàn)為包括即時編譯器的引擎的部分。在一個示例中,該方法在運行時環(huán)境(諸如web瀏覽器)中被實現(xiàn)。
[0008]在很多情況中,單個執(zhí)行防護可被用于同時地檢查幾個預(yù)期條件,諸如對象的類型以及對象的特性的屬性。如果一個條件不如預(yù)期,則執(zhí)行防護對它被設(shè)計來檢查的全部條件而言無效。執(zhí)行防護可在從原型加載特性時、在向?qū)ο筇砑犹匦曰蛱匦约瘯r、在調(diào)用或者進入方法的內(nèi)聯(lián)代碼時、以及在構(gòu)建對象時等等被實現(xiàn)。
[0009]附圖簡述
[0010]包括附圖來提供了對各實施例的進一步理解,且這些附圖被合并在本發(fā)明書內(nèi)并構(gòu)成其一部分。附圖示出各實施例,并且與說明書一起用于解釋本發(fā)明的原理。其他實施例和各實施例的許多預(yù)期優(yōu)點將隨著參考下面的詳細描述進行更好的理解而得到認識。附圖的元素不一定相對于彼此而縮放。類似的附圖標號指定對應(yīng)的類似部分。
[0011 ]圖1是示出計算設(shè)備的示例的框圖。
[0012]圖2是示出可被配置成在圖1的計算設(shè)備上運行的示例動態(tài)語言引擎的框圖。
[0013]圖3是示出執(zhí)行從動態(tài)語言編譯的機器代碼的示例方法的框圖。
[0014]詳細描述
[0015]在以下具體實施例中,對附圖進行了參考,附圖構(gòu)成了實施例的一部分且在其中作為示例示出了可在其中實踐本發(fā)明的各特定實施例??梢岳斫?,可以利用其他實施例,并且可以作出結(jié)構(gòu)上或邏輯上的變化而不背離本發(fā)明的范圍。因此,以下詳細描述并不旨在限制,并且本發(fā)明的范圍由所附權(quán)利要求來限定。應(yīng)理解,此處描述的各示例性實施例的特征可相互組合,除非另外具體注明。
[0016]圖1示出可以在操作環(huán)境中使用并且用于主存或運行計算機應(yīng)用的示例性計算機系統(tǒng),該計算機應(yīng)用被包括在存儲計算機可執(zhí)行指令的一個或多個計算機可讀存儲介質(zhì)上,該計算機可執(zhí)行指令用于控制計算機系統(tǒng)(諸如計算設(shè)備)執(zhí)行過程。
[0017]示例性計算機系統(tǒng)包括計算設(shè)備,諸如計算設(shè)備100。在一基本硬件配置中,計算設(shè)備100通常包括具有一個或多個處理單元(S卩,處理器102)的處理器系統(tǒng)以及存儲器104。作為示例,處理單元可包括但不限于一個芯片上的兩個或更多個處理核或者兩個或更多個處理器芯片。在一些示例中,計算設(shè)備還可具有一個或多個附加的處理或?qū)S锰幚砥?未示出)以執(zhí)行從處理器102卸載的處理功能,附加的處理或?qū)S锰幚砥髦T如用于圖形處理器單元上的通用計算的圖形處理器。存儲器104可以布置在分層結(jié)構(gòu)中并且可包括一級或多級高速緩存。取決于計算設(shè)備的配置和類型,存儲器104可以是易失性的(如隨機存取存儲器(RAM))、非易失性的(諸如只讀存儲器(R0M)、閃存等)或兩者的某種組合。計算設(shè)備100可以采用若干形式中的一種或多種。此類形式包括平板、個人計算機、工作站、服務(wù)器、手持式設(shè)備、消費者電子設(shè)備(諸如視頻游戲控制臺或數(shù)字錄像機)、或其他,并且可以是獨立設(shè)備或被配置為計算機網(wǎng)絡(luò)、計算機群集、云服務(wù)基礎(chǔ)結(jié)構(gòu)或其他的一部分。
[0018]計算設(shè)備100還可具有附加特征或功能。例如,計算設(shè)備100還可包括附加存儲。此類存儲可以是可移動和/或不可移動的,并且可包括但不限于,磁盤或光盤或固態(tài)存儲器,或者閃速存儲設(shè)備,諸如可移動存儲108和不可移動存儲110。計算機存儲介質(zhì)包括以存儲諸如計算機可讀的指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或其他數(shù)據(jù)之類的信息的任何合適的方法或技術(shù)實現(xiàn)的易失性和非易失性、可移動和不可移動介質(zhì)。存儲器104、可移動存儲108和不可移動存儲110全部都是計算機存儲介質(zhì)的示例。計算機存儲介質(zhì)包括,但不限于,RAM、R0M、EEPR0M、閃存或其它存儲器技術(shù)、CD-ROM、數(shù)字多功能盤(DVD)或其它光盤存儲、磁帶盒、磁帶、磁盤存儲或其它磁性存儲設(shè)備、通用串行總線(USB)閃存驅(qū)動器、閃存卡、或能用于存儲所需信息且可以由計算設(shè)備100訪問的任何其它存儲介質(zhì)。計算機存儲介質(zhì)不包括瞬態(tài)傳播的信號。任何這樣的計算機存儲介質(zhì)都可以是計算設(shè)備100的一部分。
[0019]計算設(shè)備100常常包括一個或多個輸入和/或輸出連接,諸如USB連接、顯示器端口、專用連接、以及用于連接到各種設(shè)備以向計算設(shè)備提供輸入和輸出的其他連接。輸入設(shè)備112可包括諸如鍵盤、定點設(shè)備(例如鼠標)、筆、語音輸入設(shè)備、觸摸輸入設(shè)備或其他等設(shè)備。輸出設(shè)備111可包括諸如顯示器、揚聲器、打印機等設(shè)備。
[0020]計算設(shè)備100常常包括允許計算設(shè)備100與其它計算機/應(yīng)用115進行通信的一個或多個通信連接114。示例通信連接可包括但不限于,以太網(wǎng)接口、無線接口、總線接口、存儲區(qū)域網(wǎng)絡(luò)接口、專用接口。通信連接可以被用于將計算設(shè)備100耦合到計算機網(wǎng)絡(luò),所述計算機網(wǎng)絡(luò)可以根據(jù)各種各樣的特性(例如拓撲、連接方法和規(guī)模)被分類。網(wǎng)絡(luò)是計算設(shè)備以及可能的由通信信道互連的其它設(shè)備的集合,所述通信信道促成通信且允許在互連的設(shè)備中共享資源和信息。計算機網(wǎng)絡(luò)的示例包括局域網(wǎng)、廣域網(wǎng)、因特網(wǎng)或其它網(wǎng)絡(luò)。
[0021]計算設(shè)備100可被配置成運行操作系統(tǒng)軟件程序以及一個或多個計算機應(yīng)用,這些構(gòu)成系統(tǒng)平臺。被配置成在計算設(shè)備100上執(zhí)行的計算機應(yīng)用包括至少一個進程(或任務(wù)),所述至少一個進程(或任務(wù))是執(zhí)行程序。每個進程提供用于執(zhí)行該程序的資源。一個或多個線程在該進程的上下文中運行。線程是操作系統(tǒng)向其分配處理器102中的時間的基本單元。線程是為執(zhí)行而調(diào)度的進程內(nèi)的實體。進程的各線程可共享其虛擬地址空間和系統(tǒng)資源。每個線程可包括異常處理程序、調(diào)度優(yōu)先級、線程位置存儲、線程標識符、以及直到該線程被調(diào)度的線程上下文(或線程狀態(tài))。線程上下文包括線程的機器寄存器集、內(nèi)核棧、線程環(huán)境塊、以及與該線程對應(yīng)的過程的地址空間中的用戶堆。線程可以通過諸如消息傳遞等技術(shù)在處理期間彼此通信。
[0022]操作可以在與主應(yīng)用線程分開的線程中執(zhí)行。當應(yīng)用調(diào)用用于執(zhí)行操作的方法時,在該方法執(zhí)行其任務(wù)的同時應(yīng)用可以繼續(xù)執(zhí)行其線程。用于共享存儲器多處理器的并發(fā)編程可包括多個線程訪問同一數(shù)據(jù)的能力。共享存儲器模型是多線程通信的最常部署的方法。多個線程在多個處理器、多個處理器核、單個處理器核中的多個邏輯節(jié)點、和/或附連到在處理器之間共享的存儲器的其他類的并行機構(gòu)上執(zhí)行。
[0023]配置用于在計算設(shè)備100上執(zhí)行的計算機應(yīng)用通常作為用編程語言(諸如動態(tài)編程語言)寫的指令集而被提供。術(shù)語“動態(tài)編程語言”被用來描述一類高級編程語言,它們在運行時執(zhí)行其它用于可能在運行前編譯期間(即編譯時)執(zhí)行的許多共同行為。這些行為可包括通過添加新的代碼、通過擴展對象和定義、或通過修改類型系統(tǒng)(全都在程序執(zhí)行期間)的程序的擴展。在本公開中,動態(tài)編程語言包括與值(而不是變量)相關(guān)聯(lián)的類型。值是不能夠再更進一步評估的表達,而變量是存儲位置以及相關(guān)聯(lián)的符號名稱(諸如標識符),其可包含信息的一些已知或未知的量(諸如值)。例如,在動態(tài)語言中,變量可綁定到數(shù)字并且隨后重新綁定到串。同樣,類型或?qū)ο笙到y(tǒng)可在運行時以動態(tài)語言被修改,如在本公開中使用的。這可意味著從運行時定義中或基于現(xiàn)有類型或?qū)ο蟮幕旌蟻砩尚碌膶ο?。這也可意味著改變繼承或類型樹并改變現(xiàn)有類型表現(xiàn)的方式,例如對于方法的調(diào)用。
[0024]盡管本公開中許多示例與JavaScript相關(guān),但是本領(lǐng)域技術(shù)人員可以認識到各示例也可以用其它動態(tài)編程語言來實現(xiàn)。這個定義內(nèi)的動態(tài)編程語言的一些流行的示例包括以ECMAScript 的形式(諸如Act1nScr ipt、JavaScript、和 JScript)、PHP、Python、Per 1、Ruby N VBScript N Common Lisp 以及其它。
[0025]圖2示出示例動態(tài)語言引擎200。引擎200可被實現(xiàn)為web瀏覽器子系統(tǒng)、操作系統(tǒng)的特征、或其它計算機應(yīng)用。例如,JavaScript通常依賴于運行時環(huán)境,諸如web瀏覽器,來提供對象和方法,各應(yīng)用可通過它們來與環(huán)境(諸如web頁DOM文檔對象模型)進行交互。弓丨擎200包括一起工作以處理并執(zhí)行用動態(tài)語言(諸如JavaScript代碼)寫的計算機程序的的若干組件。當引擎接收文件202時,諸如當web瀏覽器下載JavaScr ipt文件時,文件的內(nèi)容可被提供到解析器204來驗證語法正確性。在一個示例中,解析器204提供應(yīng)用于整個文件202的一個引擎操作,并且后續(xù)步驟可在包括全局函數(shù)的每個函數(shù)上單獨地執(zhí)行。由于函數(shù)要被執(zhí)行,解析器204構(gòu)建代碼的抽象語法樹(AST)206表示。AST 206表示被提供給字節(jié)碼生成器208,其產(chǎn)生適于由解釋器212執(zhí)行的中間形式,諸如函數(shù)字節(jié)碼210。在一個示例中,函數(shù)字節(jié)碼210不適于直接由CPU執(zhí)行。AST 206和函數(shù)字節(jié)碼210兩者可被保留在存儲器(諸如存儲器104)中,使得它們在后續(xù)執(zhí)行上可被重新使用。解釋器212被調(diào)用來運行來自字節(jié)碼的函數(shù)。如所討論的,應(yīng)用字節(jié)碼通過解釋器的執(zhí)行可導(dǎo)致隨機器代碼的執(zhí)行的執(zhí)行低效率。
[0026]引擎200包括解決執(zhí)行字節(jié)碼210的執(zhí)行低效率的問題的組件。例如,隨著解釋器212執(zhí)行單個操作,它也將關(guān)于它在操作中遇到的輸入的類型的信息收集在簡檔中,對函數(shù)被調(diào)用幾次、以及對確定字節(jié)碼210是否可被編譯到機器代碼中或如何被編譯到機器代碼中有用的其它信息保持跟蹤。在對函數(shù)的調(diào)用的次數(shù)達到特定閾值時,例如,解釋器對特定函數(shù)字節(jié)碼214進行排隊以供用諸如即時(JIT)編譯器216之類的編譯器來進行編譯。例如,如果函數(shù)被調(diào)用相對少的次數(shù),諸如一次或兩次,則對應(yīng)的字節(jié)碼可不被編譯,因為編譯花費的開銷將超過任何來自解釋的性能損害。在一個示例中,JIT編譯器216可運行在分開的專用線程上來減少對腳本執(zhí)行的干擾。JIT編譯器216為編譯隊列中每個函數(shù)生成優(yōu)化的機器代碼218。一旦函數(shù)被編譯,則機器代碼218的可用性被信號化到主線程。在對經(jīng)編譯的函數(shù)的下一次調(diào)用之際,函數(shù)的入口點被重新定向到新編譯的機器代碼218,且執(zhí)行220在諸如CPU之類的處理器222上直接進行。在一個示例中,機器代碼218可以與字節(jié)碼214同時執(zhí)行。
[0027]引擎200可包括其他特征。JavaScript是受管理的運行時,因為存儲器管理被向開發(fā)者隱藏,并由自動垃圾收集器(其周期性地運行以清理任何不再使用的對象)執(zhí)行。垃圾收集器可包括保守的、準世代的、標記并掃除,垃圾收集器在專用線程上同時進行其大部分工作以最小化將打擾用戶體驗的腳本執(zhí)行暫停。示例體系結(jié)構(gòu)允許引擎200在頁面加載期間幾乎立刻開始執(zhí)行JavaScript代碼。此外,在密集JavaScript活動期間,引擎可通過同時運行腳本、編譯并收集垃圾來并行化工作并使多個核飽和。
[0028]JIT編譯器216生成基于簡檔的、類型指定的機器代碼218。更具體地,JIT編譯器216生成為特定形狀和特定類型值的對象特制的機器代碼218。為發(fā)出合適的機器代碼218,信息被提供給JIT編譯器216來確定期望什么類型的輸入值。例如,在特性可被添加到對象之前,作出關(guān)于該特性是否在這個對象的全部原型上可寫的判斷。同樣,在特性可從原型加載之前,作出關(guān)于該原型是否未在鏈中的更多導(dǎo)出的原型中被蓋寫的判斷。此信息在動態(tài)語言的源代碼中不可用,因此解釋器212被適配來在運行時在運行時簡檔中收集它。當函數(shù)被安排用于編譯時,JIT編譯器216檢查解釋器212收集的運行時簡檔,并基于假設(shè)發(fā)送為預(yù)期輸入定制的代碼218。
[0029]盡管解釋器212為其觀察的運行收集信息,程序的執(zhí)行可能導(dǎo)致違反在所收集的優(yōu)化代碼中作出的假設(shè)的運行時值。因此,對于作出的每個假設(shè),JIT編譯器216發(fā)出運行時檢查或執(zhí)行防護。如果稍后的執(zhí)行導(dǎo)致未預(yù)期的值,則檢查失敗,并且執(zhí)行跳出專用機器代碼,并且在解釋器中繼續(xù)。跳出的原因即失敗的檢查被記錄,并且解釋器212收集附加的簡檔信息。函數(shù)可最終用不同假設(shè)來重新編譯。
[0030]類型檢查或形狀檢查已被使用作為執(zhí)行防護的形式。在此方法中,每個對象被分配一個形狀,其編碼在對象的存儲器中何處定位每個特性。形狀檢查的限制是它僅可驗證對象的布局。例如,形狀檢查不確認對像的給定的特性是否可寫。通常,一個以上的這樣的檢查必須(諸如在加載來自具有原型繼承的語言中的原型的特性中)被執(zhí)行。
[0031]圖3示出了用于應(yīng)用執(zhí)行防護的過程300。在302,基于運行時簡檔,執(zhí)行防護作為存儲在數(shù)據(jù)結(jié)構(gòu)中的值被創(chuàng)建,并代表發(fā)出的專用機器代碼的給定假設(shè)、或預(yù)期、或假設(shè)或預(yù)期的集合。在304,當所發(fā)出的專用機器代碼218后來基于那些假設(shè)被執(zhí)行時,用于專用機器代碼218的值與對應(yīng)的執(zhí)行防護中持有的值進行比較,以確定所假設(shè)的條件是否仍然有效。如果任何假設(shè)的條件改變了,則執(zhí)行防護被無效。如果代表所預(yù)期條件的值對應(yīng)于專用機器代碼218中的實際值,則專用機器代碼在306被執(zhí)行。替換地,如果執(zhí)行防護已經(jīng)被無效,在308將執(zhí)行從專用機器代碼中跳出。執(zhí)行防護可作為執(zhí)行程序的某些其它部分的結(jié)果而被無效,執(zhí)行程序的某些其它部分改變了專用機器代碼假設(shè)的一個或多個條件。
[0032]再循環(huán)器可被用于在編譯期間在存儲器中分配防護,并且數(shù)據(jù)結(jié)構(gòu)的地址被硬編碼在專用機器代碼中以允許快速訪問。再循環(huán)器可將對象分配為防護。在一個示例中,預(yù)先確定的空隙,諸如對象的第一指針大小空隙,被用作防護值,對象內(nèi)容的其余在比較中可以不相關(guān)。該示例提供了快速對象構(gòu)造,其中構(gòu)造器高速緩存被用作執(zhí)行防護。使用對象的一部分來持有防護值減少了用于在執(zhí)行期間檢查防護的存儲器引用的數(shù)量。防護的預(yù)期值可以是除了指示防護是無效的所選值之外的任何值。例如,值可以是預(yù)期類型,且指示防護是無效的所選值可以是零。
[0033]當稍后的執(zhí)行代碼遇到防護的地址時,執(zhí)行代碼中的值與防護的地址處的值進行比較。單個防護可被用來檢查多個條件或多個特性。因此,單個比較操作可被用來驗證關(guān)于特性列表的假設(shè)。這在將若干特性添加到對象時可以是有用的,這在構(gòu)造器中常見。
[0034]如果任何特性的屬性改變了,那么通過在防護的地址處寫選擇的無效值(諸如零)防護被無效。同樣,防護可在其它或附加的情況下被無效,不考慮該情況是否與特性相關(guān)。例如,當構(gòu)造器的原型改變時防護可被選擇性地無效。再循環(huán)器可被用來從可能仍需要防護的任何機器代碼跟蹤對防護的引用。被無效的防護為仍使用該防護的活躍執(zhí)行的任何代碼或可能仍被執(zhí)行的代碼而保留在原地,但是沒有新發(fā)出的代碼可求助于被無效的防護。相反,再循環(huán)器為新生成的代碼分配新防護,使得被無效的防護再也不被新發(fā)出的代碼使用。這簡化了確保沒有依賴現(xiàn)在無效假設(shè)的代碼將被執(zhí)行的過程。這也消除了搶先跟蹤這樣的代碼并通過某些外部裝置顯式地無效它(這對于已經(jīng)在調(diào)用棧上的這樣的代碼而言將是特別麻煩的)的需求。任何現(xiàn)有代碼一旦它遇到被無效的諸如對可恢復(fù)解釋的處理例程的防護就將簡單地跳出。
[0035]特性防護可在從原型加載特性時被實現(xiàn)。用動態(tài)語言編譯器從原型加載特性的高效實現(xiàn)是硬編碼從其加載特性的原型對象。防護可被用來檢查對象是否仍包括特性并且該特性未被刪除,或檢查該特性是否還未被在更多導(dǎo)出的原型中被蓋寫。此外,防護可確定具有硬編碼的原型的對象的類型是否是預(yù)期的。一個防護可被用來作出全部這些確定。
[0036]此外,防護可在向?qū)ο筇砑犹匦曰蛱匦约瘯r被實現(xiàn)。防護可被用來驗證對象的類型是如預(yù)期的并且要添加的全部的打算的特性在原型鏈上可寫。再一次,單個防護可諸如在防護包含對象的預(yù)期類型時作出這些確定,并且如果任何特性變得只讀就被注冊失效。
[0037]防護也可在調(diào)用或進入方法的內(nèi)聯(lián)代碼時被實現(xiàn)。例如,防護可被用來驗證擁有該方法的對象的類型,并且對象上的該方法仍與硬編碼方法匹配。再一次,這可用單個防護檢查來確定,其中防護中的值是對象的類型并在方法被蓋寫時可被無效,諸如設(shè)為零。
[0038]此外,防護可在構(gòu)建對象時被實現(xiàn)。在此上下文中,需要為對象分配合適數(shù)量的存儲器,寫要被添加到預(yù)定空隙的特性,并確定構(gòu)造函數(shù)的原型是否未變。這可通過將構(gòu)造器高速緩存它本身注冊為針對被構(gòu)造器添加的全部特性的特性防護來實現(xiàn)。如果構(gòu)造器的原型被改變則防護可被顯式地無效。在運行時,單個檢查足以實現(xiàn)驗證全部上述條件。
[0039]盡管此處說明并描述了具體實施例,但本領(lǐng)域技術(shù)人員可以理解,可用各種替換和/或等價實現(xiàn)來替換所示出并描述的具體實施例而不背離本發(fā)明的范圍。本申請旨在覆蓋在此討論的具體實施例的任何改變或變型。因此,本發(fā)明旨在僅受權(quán)利要求及其等價物的限制。
【主權(quán)項】
1.一種用于基于動態(tài)語言執(zhí)行機器代碼的方法,包括: 將防護創(chuàng)建為存儲在數(shù)據(jù)結(jié)構(gòu)中的值,且所述值代表所述機器代碼的可重新使用部分的預(yù)期條件; 將代表預(yù)期條件的值與稍后在所述機器代碼的一部分的執(zhí)行期間遇到的實際值進行比較; 如果所述實際值與代表所述預(yù)期條件的值相對應(yīng),則執(zhí)行所述機器代碼;以及 如果任何預(yù)期條件改變,則無效所述防護。2.如權(quán)利要求1所述的方法,其特征在于,創(chuàng)建所述防護包括在存儲器中分配要作為防護的對象。3.如權(quán)利要求2所述的方法,其特征在于,對象的預(yù)先確定的空隙被用作所述防護。4.如權(quán)利要求3所述的方法,其特征在于,保留對象內(nèi)容在將代表所述預(yù)期條件的值與稍后在所述機器代碼的一部分的執(zhí)行期間遇到的實際值進行比較中不相關(guān)。5.如權(quán)利要求1所述的方法,其特征在于,將代表所述預(yù)期條件的值與稍后在所述機器代碼的一部分的執(zhí)行期間遇到的實際值進行比較允許多個預(yù)期的同時驗證。6.如權(quán)利要求1所述的方法,其特征在于,如果所述相關(guān)聯(lián)的條件的一個或多個改變則所述防護的無效發(fā)生。7.如權(quán)利要求1所述的方法,其特征在于,無效所述防護包括選擇性地無效所述防護。8.如權(quán)利要求7所述的方法,其特征在于,在構(gòu)造器的原型改變時所述防護的無效發(fā)生。9.如權(quán)利要求1所述的方法,其特征在于,被無效的防護不再被重新生效。10.如權(quán)利要求8所述的方法,其特征在于,一旦防護已經(jīng)被無效就沒有新生成的機器代碼求助于該防護。11.如權(quán)利要求1所述的方法,其特征在于,被無效的防護為了仍使用該防護的現(xiàn)有代碼而保留在原地。12.如權(quán)利要求11所述的方法,其特征在于,仍使用被無效的防護的現(xiàn)有代碼在調(diào)用棧上。13.如權(quán)利要求11所述的方法,其特征在于,遇到被無效的防護的機器代碼跳出到處理例程。14.如權(quán)利要求1所述的方法,其特征在于,所述機器代碼用即時編譯器從字節(jié)碼中被編譯。15.如權(quán)利要求1所述的方法,其特征在于,創(chuàng)建所述防護包括用再循環(huán)器在存儲器中分配要作為防護的對象。
【文檔編號】G06F9/44GK105849698SQ201480069786
【公開日】2016年8月10日
【申請日】2014年12月18日
【發(fā)明人】J·米亞多維茨, C·C-C·曼, L·拉弗里尼爾
【申請人】微軟技術(shù)許可有限責任公司