動(dòng)態(tài)語(yǔ)言的優(yōu)化執(zhí)行的制作方法【專(zhuān)利摘要】通過(guò)包括執(zhí)行上下文和執(zhí)行代碼庫(kù)的動(dòng)態(tài)執(zhí)行模塊來(lái)執(zhí)行動(dòng)態(tài)語(yǔ)言的程序代碼。程序代碼的指令被轉(zhuǎn)換為存儲(chǔ)在執(zhí)行代碼庫(kù)中的機(jī)器代碼,執(zhí)行上下文通過(guò)執(zhí)行以及跨越執(zhí)行跟蹤程序的運(yùn)行時(shí)狀態(tài)和持久狀態(tài)。使用執(zhí)行代碼庫(kù)和執(zhí)行上下文,動(dòng)態(tài)執(zhí)行模塊使重復(fù)的機(jī)器代碼生成最小化,同時(shí)保留了程序的動(dòng)態(tài)方面。【專(zhuān)利說(shuō)明】動(dòng)態(tài)語(yǔ)言的優(yōu)化執(zhí)行【
技術(shù)領(lǐng)域:
】[0001]本公開(kāi)一般地涉及動(dòng)態(tài)計(jì)算機(jī)程序語(yǔ)言和即時(shí)(just-in-time)代碼生成領(lǐng)域。具體地,本公開(kāi)描述了一種通過(guò)上下文跟蹤和即時(shí)代碼生成來(lái)優(yōu)化執(zhí)行動(dòng)態(tài)計(jì)算機(jī)程序語(yǔ)言的系統(tǒng)、方法和過(guò)程。【
背景技術(shù):
】[0002]針對(duì)web開(kāi)發(fā)和應(yīng)用開(kāi)發(fā)已大量采用了諸如PHP:超文本預(yù)處理器(PHP)、Python、Ruby和Perl的動(dòng)態(tài)語(yǔ)言,因?yàn)樗鼈兪沟瞄_(kāi)發(fā)者產(chǎn)率高。這些語(yǔ)言有許多特征有助于它們的多產(chǎn)特性,但是最重要的兩個(gè)特征是運(yùn)行時(shí)鍵入和將新數(shù)據(jù)動(dòng)態(tài)地評(píng)價(jià)為代碼的能力。這些特性允許開(kāi)發(fā)者編寫(xiě)能夠比以諸如C、Java或C++的語(yǔ)言編寫(xiě)的靜態(tài)代碼更靈活地使用的代碼。例如,動(dòng)態(tài)語(yǔ)言通過(guò)在運(yùn)行時(shí)允許開(kāi)發(fā)者有條件地從現(xiàn)有代碼生成新的可執(zhí)行代碼以處理新數(shù)據(jù),來(lái)使得能夠進(jìn)行更靈活的開(kāi)發(fā)實(shí)踐。[0003]動(dòng)態(tài)語(yǔ)言的缺點(diǎn)在于它們的執(zhí)行通常顯著慢于靜態(tài)語(yǔ)言(其可能強(qiáng)制編譯時(shí)靜態(tài)鍵入并且可能不允許動(dòng)態(tài)代碼執(zhí)行)。由于在編譯時(shí)函數(shù)和變量的類(lèi)型是已知的,并且由于可執(zhí)行代碼的全范圍是編譯器已知的,所以可在程序的執(zhí)行之前有效地將靜態(tài)語(yǔ)言轉(zhuǎn)換成機(jī)器代碼。在動(dòng)態(tài)語(yǔ)言的情況下,在代碼被執(zhí)行的時(shí)刻之前,可執(zhí)行代碼的全范圍未知,并且許多函數(shù)和變量的類(lèi)型可能未知。由于這些原因,動(dòng)態(tài)語(yǔ)言無(wú)法在執(zhí)行之前被完全地轉(zhuǎn)換為機(jī)器代碼。另外,即使向機(jī)器代碼的運(yùn)行時(shí)轉(zhuǎn)換常常也是不可行的,因?yàn)榧磿r(shí)編譯過(guò)程本身可能需要大量執(zhí)行資源,導(dǎo)致執(zhí)行期間的性能下降。【
發(fā)明內(nèi)容】[0004]所公開(kāi)的配置包括一種通過(guò)動(dòng)態(tài)執(zhí)行模塊來(lái)執(zhí)行計(jì)算機(jī)程序的系統(tǒng)、方法和計(jì)算機(jī)可讀介質(zhì)。所公開(kāi)的配置包括一種計(jì)算機(jī)實(shí)現(xiàn)的方法,其中,接收?qǐng)?zhí)行程序代碼的第一請(qǐng)求。這里,所述程序代碼包括初始代碼和運(yùn)行時(shí)條件代碼。響應(yīng)于第一請(qǐng)求,從初始代碼生成執(zhí)行資源,其中所述執(zhí)行資源包括執(zhí)行代碼庫(kù)(executioncodebase)和執(zhí)行上下文(executioncontext)。所述執(zhí)行代碼庫(kù)包括從初始代碼生成的機(jī)器代碼,并且所述執(zhí)行上下文包括存儲(chǔ)的對(duì)針對(duì)初始代碼中的函數(shù)、變量和用戶定義類(lèi)型生成的元素的引用。執(zhí)行代碼庫(kù)中的機(jī)器代碼被執(zhí)行,并且使用運(yùn)行時(shí)條件代碼來(lái)更新執(zhí)行代碼庫(kù)和執(zhí)行上下文。然后接收?qǐng)?zhí)行程序代碼的第二請(qǐng)求,并且使用更新的執(zhí)行上下文來(lái)執(zhí)行更新的執(zhí)行代碼庫(kù)中的機(jī)器代碼。【專(zhuān)利附圖】【附圖說(shuō)明】[0005]圖1是示出執(zhí)行環(huán)境中的動(dòng)態(tài)執(zhí)行模塊的示例實(shí)施例的高級(jí)框圖。[0006]圖2是示出示例計(jì)算機(jī)的高級(jí)框圖。[0007]圖3是示出根據(jù)一個(gè)實(shí)施例的動(dòng)態(tài)執(zhí)行模塊內(nèi)的組件的詳細(xì)視圖的框圖。[0008]圖4是示出使用動(dòng)態(tài)執(zhí)行模塊的一個(gè)實(shí)施例來(lái)執(zhí)行程序代碼的過(guò)程的流程圖。【具體實(shí)施方式】[0009]附圖和以下描述僅以例示方式描述特定實(shí)施例。本領(lǐng)域技術(shù)人員將容易從以下描述認(rèn)識(shí)到在不脫離本文所述的原理的情況下可采用本文所示的結(jié)構(gòu)和方法的替選實(shí)施例。現(xiàn)在將詳細(xì)參照若干實(shí)施例,其示例示出于附圖中。需要注意的是,只要可行,相似或相同的參考數(shù)字可用在圖中并且可指示相似或相同的功能。[0010]圖1示出在執(zhí)行環(huán)境120中的程序代碼100和動(dòng)態(tài)執(zhí)行模塊101。執(zhí)行環(huán)境120包括可托管并執(zhí)行計(jì)算機(jī)程序指令的一個(gè)或多個(gè)計(jì)算機(jī)系統(tǒng)。在一個(gè)實(shí)施例中,執(zhí)行環(huán)境120是單個(gè)計(jì)算機(jī)系統(tǒng),例如web服務(wù)器。在另一實(shí)施例中,執(zhí)行環(huán)境包括通過(guò)網(wǎng)絡(luò)連接的若干算機(jī)系統(tǒng),例如數(shù)據(jù)中心中的服務(wù)器計(jì)算機(jī)。[0011]例如,程序代碼100包括以諸如?5^11〇11、?61'1、1^^、?即等的計(jì)算機(jī)語(yǔ)言的計(jì)算機(jī)源代碼。程序代碼100可包括初始代碼106和運(yùn)行時(shí)條件代碼107。初始代碼106包括在發(fā)起程序代碼100的執(zhí)行時(shí)被加載的計(jì)算機(jī)指令。例如,初始代碼106可包括具有程序的"主函數(shù)"或"主循環(huán)"的文件。初始代碼106在被執(zhí)行時(shí)可加載調(diào)用運(yùn)行時(shí)條件代碼107的附加計(jì)算機(jī)程序指令。運(yùn)行時(shí)條件代碼107可基于在已發(fā)起執(zhí)行之后確定的情況來(lái)有條件地加載。例如,運(yùn)行時(shí)條件代碼107可包括在運(yùn)行時(shí)基于程序代碼100的當(dāng)前執(zhí)行從數(shù)據(jù)庫(kù)加載的計(jì)算機(jī)指令。[0012]動(dòng)態(tài)執(zhí)行模塊101是執(zhí)行環(huán)境120的組件,其使得程序代碼100能夠更有效地執(zhí)行。動(dòng)態(tài)執(zhí)行模塊101取代了用于諸如PHP、Perl、Python或Ruby的編程語(yǔ)言的標(biāo)準(zhǔn)虛擬機(jī)或解析器。動(dòng)態(tài)執(zhí)行模塊101可以是在還執(zhí)行執(zhí)行環(huán)境120的其它進(jìn)程的硬件上執(zhí)行的軟件模塊,或者其可以在它自己的專(zhuān)用硬件資源上執(zhí)行。當(dāng)程序代碼100在執(zhí)行環(huán)境120中執(zhí)行時(shí),動(dòng)態(tài)執(zhí)行模塊101管理并監(jiān)視該執(zhí)行以確保執(zhí)行既快速還有效。動(dòng)態(tài)執(zhí)行模塊101可通過(guò)使用即時(shí)機(jī)器代碼生成、代碼片段跟蹤、機(jī)器代碼重用、上下文跟蹤以及其它技術(shù)來(lái)改善程序代碼100的執(zhí)行。本文中更詳細(xì)地描述了這些技術(shù)中的一些。[0013]動(dòng)態(tài)執(zhí)行模塊101包括執(zhí)行資源102和執(zhí)行支持模塊105。執(zhí)行資源102是為特定程序代碼100生成的資源,其中一些資源可跨越相同代碼的若干調(diào)用一直存在。執(zhí)行資源102包括執(zhí)行上下文103和執(zhí)行代碼庫(kù)104。執(zhí)行上下文103存儲(chǔ)特定程序在執(zhí)行時(shí)的動(dòng)態(tài)運(yùn)行時(shí)狀態(tài)以及可跨越不同執(zhí)行一直存在的程序代碼100的結(jié)構(gòu)和狀態(tài)。執(zhí)行上下文103包括結(jié)構(gòu),該結(jié)構(gòu)存儲(chǔ)對(duì)針對(duì)程序代碼100中的函數(shù)、變量和用戶定義類(lèi)型(例如類(lèi)、結(jié)構(gòu)等)生成的元素的引用。執(zhí)行上下文103可在程序代碼100的調(diào)用之間被重置,以防止來(lái)自一個(gè)調(diào)用的動(dòng)態(tài)值污染代碼的下一調(diào)用。然而,執(zhí)行上下文重置可被執(zhí)行為使得保持非易失性數(shù)據(jù)(其可在調(diào)用之間迀移)。執(zhí)行代碼庫(kù)104存儲(chǔ)在程序的該執(zhí)行以及先前執(zhí)行期間從程序代碼100生成的機(jī)器代碼。執(zhí)行代碼庫(kù)104用作從程序代碼100生成的機(jī)器代碼的緩存,使得在程序的調(diào)用之間不需要重復(fù)代碼生成。執(zhí)行上下文103用于跟蹤執(zhí)行代碼庫(kù)104中與程序的當(dāng)前調(diào)用相關(guān)的機(jī)器代碼部分(例如,用于當(dāng)前調(diào)用的函數(shù)定義的機(jī)器代碼等)。執(zhí)行支持模塊105為動(dòng)態(tài)執(zhí)行模塊101提供運(yùn)行時(shí)支持,例如即時(shí)機(jī)器代碼生成、執(zhí)行管理等。[0014]圖1所示的實(shí)體利用一個(gè)或多個(gè)計(jì)算機(jī)或者這樣的計(jì)算機(jī)內(nèi)的模塊來(lái)實(shí)現(xiàn)。圖2是示出示例計(jì)算機(jī)200的高級(jí)框圖。計(jì)算機(jī)200包括耦合到芯片集204的至少一個(gè)處理器202。芯片集204包括存儲(chǔ)器控制器中心(hub)220和輸入/輸出(I/O)控制器中心222。存儲(chǔ)器(memory)206和圖形適配器212耦合到存儲(chǔ)器控制器中心220,顯示器218耦合到圖形適配器212。存儲(chǔ)裝置208、鍵盤(pán)210、指示裝置214和網(wǎng)絡(luò)適配器216耦合到I/O控制器中心222。計(jì)算機(jī)200的其它實(shí)施例具有不同的架構(gòu)。[0015]存儲(chǔ)裝置208是諸如硬盤(pán)驅(qū)動(dòng)器、壓縮盤(pán)只讀存儲(chǔ)器(⑶-ROM)、DVD或固態(tài)存儲(chǔ)裝置的非瞬時(shí)性計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)。存儲(chǔ)器206保存處理器202所使用的指令和數(shù)據(jù)。指示裝置214是鼠標(biāo)、跟蹤球或其它類(lèi)型的指示裝置,并且與鍵盤(pán)210組合使用以向計(jì)算機(jī)200輸入數(shù)據(jù)。圖形適配器212在顯示器218上顯示圖像和其它信息。網(wǎng)絡(luò)適配器216將計(jì)算機(jī)200親合到一個(gè)或多個(gè)計(jì)算機(jī)網(wǎng)絡(luò)。[0016]計(jì)算機(jī)200適于執(zhí)行計(jì)算機(jī)程序模塊以提供本文所述的功能。如本文所用,術(shù)語(yǔ)"模塊"是指用于提供指定功能的計(jì)算機(jī)程序邏輯。因此,模塊可實(shí)現(xiàn)于硬件、固件和/或軟件中。在一個(gè)實(shí)施例中,程序模塊被存儲(chǔ)在存儲(chǔ)裝置208上,被加載到存儲(chǔ)器206中,并由處理器202執(zhí)行。[0017]圖1的實(shí)體所使用的計(jì)算機(jī)200的類(lèi)型可根據(jù)實(shí)施例以及實(shí)體所需的處理能力而變化。例如,執(zhí)行環(huán)境120可以包括一起工作以提供本文所述的功能的多個(gè)刀片服務(wù)器。計(jì)算機(jī)200可缺少上述組件中的一些,例如鍵盤(pán)210、圖形適配器212和顯示器218。[0018]圖3是示出根據(jù)一個(gè)實(shí)施例的動(dòng)態(tài)執(zhí)行模塊101內(nèi)的組件的詳細(xì)視圖的高級(jí)框圖。如前所述,動(dòng)態(tài)執(zhí)行模塊101包括執(zhí)行資源102和執(zhí)行支持模塊105。執(zhí)行資源102進(jìn)一步包括執(zhí)行上下文103和執(zhí)行代碼庫(kù)104。[0019]如前所述,執(zhí)行上下文103存儲(chǔ)捕獲程序執(zhí)行的當(dāng)前運(yùn)行時(shí)狀態(tài)的數(shù)據(jù)以及可跨越程序調(diào)用一直存在以加速同一程序代碼的未來(lái)執(zhí)行的信息。執(zhí)行上下文103包括函數(shù)表301、變量表302、分配表304、源表示庫(kù)309和包含表(includetable)310。執(zhí)行上下文103還可包括用于各種用戶定義類(lèi)型的表,例如類(lèi)表303。用戶定義類(lèi)型所需的表將取決于動(dòng)態(tài)執(zhí)行模塊101所執(zhí)行的特定動(dòng)態(tài)語(yǔ)言。在PHP的情況下,可使用類(lèi)表303,但是在沒(méi)有類(lèi)的非面向?qū)ο蟮恼Z(yǔ)言的情況下,類(lèi)表303可沒(méi)有必要,而可利用相似的表來(lái)跟蹤其它用戶定義類(lèi)型。[0020]分配表304是數(shù)據(jù)結(jié)構(gòu),其包含初始代碼106中定義的非易失性數(shù)據(jù)以及在運(yùn)行時(shí)在程序的調(diào)用期間動(dòng)態(tài)分配的元素。例如,分配表304存儲(chǔ)程序代碼100中聲明的變量、結(jié)構(gòu)和用戶定義類(lèi)型(例如類(lèi))。動(dòng)態(tài)執(zhí)行模塊101可通過(guò)基于程序代碼100的先前調(diào)用所使用的存儲(chǔ)器在分配表304中預(yù)先分配空間并且通過(guò)在執(zhí)行上下文103的重置之間保持分配表304中的非易失性數(shù)據(jù),來(lái)減少程序代碼100所進(jìn)行的運(yùn)行時(shí)存儲(chǔ)器分配的量??缭匠绦虼a100的單獨(dú)的執(zhí)行一直存在的數(shù)據(jù)的示例包括全局常量、全局變量、全局類(lèi)等。存儲(chǔ)在分配表304中的元素可被變量表302和類(lèi)表303中的條目引用。[0021]函數(shù)表301是按照名稱(chēng)和代碼上下文將函數(shù)映射至執(zhí)行代碼庫(kù)104中的編譯的機(jī)器代碼的數(shù)據(jù)結(jié)構(gòu)。代碼上下文是利用其調(diào)用函數(shù)的上下文,例如參數(shù)、包含、命名空間等。在動(dòng)態(tài)語(yǔ)言中,函數(shù)調(diào)用的代碼上下文可改變函數(shù)調(diào)用所執(zhí)行的代碼。例如,改變綁定至函數(shù)名稱(chēng)的代碼的函數(shù)調(diào)用之前的條件包含語(yǔ)句可導(dǎo)致該函數(shù)調(diào)用與它在先前執(zhí)行中所調(diào)用的不同的代碼片段,即使函數(shù)名稱(chēng)和參數(shù)相同。[0022]當(dāng)程序代碼100被執(zhí)行并且遇到對(duì)先前在相同代碼上下文中(在程序代碼100的先前執(zhí)行中或者在早前時(shí)間的相同執(zhí)行期間)定義的函數(shù)的調(diào)用時(shí),該函數(shù)的機(jī)器代碼生成將沒(méi)有必要,因?yàn)榭赏ㄟ^(guò)函數(shù)表301中的映射來(lái)訪問(wèn)相同代碼上下文中針對(duì)相同函數(shù)先前生成的機(jī)器代碼。另一方面,如果遇到新函數(shù),或者如果在新的代碼上下文中遇到已知函數(shù),則可針對(duì)該函數(shù)生成新機(jī)器代碼,并且可將對(duì)該機(jī)器代碼的引用插入函數(shù)表301中的適當(dāng)條目中。這樣,過(guò)去已產(chǎn)生的機(jī)器代碼可被重用,而不會(huì)犧牲基于上下文調(diào)用不同代碼的動(dòng)態(tài)生成的函數(shù)的靈活性。[0023]變量表302將變量名稱(chēng)映射至分配表304中存儲(chǔ)的變量。類(lèi)似地,用戶定義類(lèi)型可具有將那些類(lèi)型的命名實(shí)例映射至分配表304中的分配的表。例如,類(lèi)表303將類(lèi)名稱(chēng)映射至分配表304中存儲(chǔ)的類(lèi)??稍谶\(yùn)行時(shí)基于變量或用戶定義類(lèi)型的改變代碼上下文來(lái)修改該映射。這使得動(dòng)態(tài)執(zhí)行模塊101能夠支持運(yùn)行時(shí)對(duì)變量和用戶定義類(lèi)型的動(dòng)態(tài)改變,同時(shí)在變量和用戶定義類(lèi)型是非易失性的情況下仍能夠優(yōu)化和重用。[0024]函數(shù)表301、變量表302以及用于用戶定義類(lèi)型的表(例如類(lèi)表303)可使得沒(méi)有被動(dòng)態(tài)修改的無(wú)條件內(nèi)置數(shù)據(jù)能夠跨越程序代碼100的獨(dú)立執(zhí)行而一直存在。無(wú)條件內(nèi)置數(shù)據(jù)的該持續(xù)性可通過(guò)使內(nèi)置非易失性數(shù)據(jù)所需的初始化最小化來(lái)加速程序代碼100的新調(diào)用所需的初始設(shè)置。[0025]源表示庫(kù)309包括程序代碼100中已由動(dòng)態(tài)執(zhí)行模塊101處理的指令的表示。源表示庫(kù)309可按照能夠更快訪問(wèn)指令結(jié)構(gòu)以便于動(dòng)態(tài)執(zhí)行模塊101處理的方式來(lái)存儲(chǔ)程序代碼100的指令。例如,在一個(gè)實(shí)施例中,來(lái)自程序代碼100的指令按照控制流圖(CFG)的形式存儲(chǔ)在源表示庫(kù)309中。在另一實(shí)施例中,程序代碼100的指令按照抽象語(yǔ)法樹(shù)(AST)的形式存儲(chǔ)。這樣的結(jié)構(gòu)實(shí)施例可加速代碼生成和代碼索引。[0026]例如,假設(shè)程序代碼100包括如下PHP指令:[0027]【權(quán)利要求】1.一種用于通過(guò)動(dòng)態(tài)執(zhí)行模塊執(zhí)行計(jì)算機(jī)程序的計(jì)算機(jī)實(shí)現(xiàn)的方法,所述方法包括:接收?qǐng)?zhí)行程序代碼的第一請(qǐng)求,所述程序代碼包括初始代碼和運(yùn)行時(shí)條件代碼;響應(yīng)于所述第一請(qǐng)求,從所述初始代碼生成執(zhí)行資源,所述執(zhí)行資源包括執(zhí)行代碼庫(kù)和執(zhí)行上下文,所述執(zhí)行代碼庫(kù)包括從所述初始代碼生成的機(jī)器代碼,W及所述執(zhí)行上下文包括存儲(chǔ)的對(duì)針對(duì)所述初始代碼中的函數(shù)、變量和用戶定義類(lèi)型生成的元素的引用;使用所述執(zhí)行上下文來(lái)執(zhí)行所述執(zhí)行代碼庫(kù)中的機(jī)器代碼;響應(yīng)于執(zhí)行所述執(zhí)行代碼庫(kù)中的機(jī)器代碼,使用所述運(yùn)行時(shí)條件代碼來(lái)更新所述執(zhí)行代碼庫(kù)和所述執(zhí)行上下文;接收?qǐng)?zhí)行所述程序代碼的第二請(qǐng)求;W及使用更新的執(zhí)行上下文來(lái)執(zhí)行更新的執(zhí)行代碼庫(kù)中的機(jī)器代碼。2.根據(jù)權(quán)利要求1所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其中,使用所述執(zhí)行上下文來(lái)執(zhí)行所述執(zhí)行代碼庫(kù)中的機(jī)器代碼還包括使用存儲(chǔ)的引用來(lái)訪問(wèn)針對(duì)函數(shù)、變量和用戶定義類(lèi)型生成的元素。3.根據(jù)權(quán)利要求1所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其中,更新所述執(zhí)行代碼庫(kù)還包括將從所述運(yùn)行時(shí)條件代碼生成的機(jī)器代碼存儲(chǔ)在所述執(zhí)行代碼庫(kù)中。4.根據(jù)權(quán)利要求1所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其中,所述執(zhí)行上下文還包括包含存儲(chǔ)的對(duì)元素的引用的函數(shù)表、變量表和類(lèi)表。5.根據(jù)權(quán)利要求4所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其中,更新所述執(zhí)行上下文還包括在所述函數(shù)表、變量表和類(lèi)表中存儲(chǔ)對(duì)針對(duì)所述運(yùn)行時(shí)條件代碼中的函數(shù)、變量和類(lèi)生成的元素的引用。6.根據(jù)權(quán)利要求5所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其中,所述執(zhí)行上下文還包括源表示庫(kù),W及更新所述執(zhí)行上下文還包括將所述運(yùn)行時(shí)條件代碼的一部分的表示存儲(chǔ)在所述源表不庫(kù)中。7.根據(jù)權(quán)利要求6所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其中,所述執(zhí)行上下文還包括包含表,W及更新所述執(zhí)行上下文還包括在所述包含表中生成條目,所述條目包括到所述源表示庫(kù)中的引用和到所述執(zhí)行代碼庫(kù)中的引用。8.根據(jù)權(quán)利要求1所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其中,所述執(zhí)行上下文還包括分配表,所述分配表包括針對(duì)所述程序代碼中的所述變量和用戶定義類(lèi)型分配的元素。9.根據(jù)權(quán)利要求1所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其中,所述程序代碼、所述初始代碼和所述運(yùn)行時(shí)條件代碼包括PHP計(jì)算機(jī)指令。10.-種用于通過(guò)動(dòng)態(tài)執(zhí)行模塊執(zhí)行計(jì)算機(jī)程序的計(jì)算機(jī),所述計(jì)算機(jī)包括:非瞬時(shí)性計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),所述非瞬時(shí)性計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)存儲(chǔ)用于通過(guò)動(dòng)態(tài)執(zhí)行模塊來(lái)執(zhí)行計(jì)算機(jī)程序的可執(zhí)行計(jì)算機(jī)程序指令,所述指令能夠被執(zhí)行W執(zhí)行下述步驟:接收?qǐng)?zhí)行程序代碼的第一請(qǐng)求,所述程序代碼包括初始代碼和運(yùn)行時(shí)條件代碼;響應(yīng)于所述第一請(qǐng)求,從所述初始代碼生成執(zhí)行資源,所述執(zhí)行資源包括執(zhí)行代碼庫(kù)和執(zhí)行上下文,所述執(zhí)行代碼庫(kù)包括從所述初始代碼生成的機(jī)器代碼,W及所述執(zhí)行上下文包括存儲(chǔ)的對(duì)針對(duì)所述初始代碼中的函數(shù)、變量和用戶定義類(lèi)型生成的元素的引用;使用所述執(zhí)行上下文來(lái)執(zhí)行所述執(zhí)行代碼庫(kù)中的機(jī)器代碼;響應(yīng)于執(zhí)行所述執(zhí)行代碼庫(kù)中的機(jī)器代碼,使用所述運(yùn)行時(shí)條件代碼來(lái)更新所述執(zhí)行代碼庫(kù)和所述執(zhí)行上下文;接收?qǐng)?zhí)行所述程序代碼的第二請(qǐng)求;W及使用更新的執(zhí)行上下文來(lái)執(zhí)行更新的執(zhí)行代碼庫(kù)中的機(jī)器代碼;W及處理器,所述處理器用于執(zhí)行所述計(jì)算機(jī)程序指令。11.根據(jù)權(quán)利要求10所述的計(jì)算機(jī),其中,使用所述執(zhí)行上下文來(lái)執(zhí)行所述執(zhí)行代碼庫(kù)中的機(jī)器代碼還包括使用存儲(chǔ)的引用來(lái)訪問(wèn)針對(duì)函數(shù)、變量和用戶定義類(lèi)型生成的元素。12.根據(jù)權(quán)利要求10所述的計(jì)算機(jī),其中,更新所述執(zhí)行代碼庫(kù)還包括將從所述運(yùn)行時(shí)條件代碼生成的機(jī)器代碼存儲(chǔ)在所述執(zhí)行代碼庫(kù)中。13.根據(jù)權(quán)利要求10所述的計(jì)算機(jī),其中,所述執(zhí)行上下文還包括包含存儲(chǔ)的對(duì)元素的引用的函數(shù)表、變量表和類(lèi)表。14.根據(jù)權(quán)利要求13所述的計(jì)算機(jī),其中,更新所述執(zhí)行上下文還包括在所述函數(shù)表、變量表和類(lèi)表中存儲(chǔ)對(duì)針對(duì)所述運(yùn)行時(shí)條件代碼中的函數(shù)、變量和類(lèi)生成的元素的引用。15.根據(jù)權(quán)利要求14所述的計(jì)算機(jī),其中,所述執(zhí)行上下文還包括源表示庫(kù),W及更新所述執(zhí)行上下文還包括將所述運(yùn)行時(shí)條件代碼的一部分的表示存儲(chǔ)在所述源表示庫(kù)中。16.根據(jù)權(quán)利要求15所述的計(jì)算機(jī),其中,所述執(zhí)行上下文還包括包含表,W及更新所述執(zhí)行上下文還包括在所述包含表中生成條目,所述條目包括到所述源表示庫(kù)中的引用和到所述執(zhí)行代碼庫(kù)中的引用。17.根據(jù)權(quán)利要求10所述的計(jì)算機(jī),其中,所述執(zhí)行上下文還包括分配表,所述分配表包括針對(duì)所述程序代碼中的所述變量和用戶定義類(lèi)型分配的元素。18.根據(jù)權(quán)利要求10所述的計(jì)算機(jī),其中,所述程序代碼、所述初始代碼和所述運(yùn)行時(shí)條件代碼包括PHP計(jì)算機(jī)指令。19.一種存儲(chǔ)用于通過(guò)動(dòng)態(tài)執(zhí)行模塊執(zhí)行計(jì)算機(jī)程序的可執(zhí)行計(jì)算機(jī)程序指令的非瞬時(shí)性計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),所述指令能夠被執(zhí)行W執(zhí)行下述步驟:接收?qǐng)?zhí)行程序代碼的第一請(qǐng)求,所述程序代碼包括初始代碼和運(yùn)行時(shí)條件代碼;響應(yīng)于所述第一請(qǐng)求,從所述初始代碼生成執(zhí)行資源,所述執(zhí)行資源包括執(zhí)行代碼庫(kù)和執(zhí)行上下文,所述執(zhí)行代碼庫(kù)包括從所述初始代碼生成的機(jī)器代碼,W及所述執(zhí)行上下文包括存儲(chǔ)的對(duì)針對(duì)所述初始代碼中的函數(shù)、變量和用戶定義類(lèi)型生成的元素的引用;使用所述執(zhí)行上下文來(lái)執(zhí)行所述執(zhí)行代碼庫(kù)中的機(jī)器代碼;響應(yīng)于執(zhí)行所述執(zhí)行代碼庫(kù)中的機(jī)器代碼,使用所述運(yùn)行時(shí)條件代碼來(lái)更新所述執(zhí)行代碼庫(kù)和所述執(zhí)行上下文;接收?qǐng)?zhí)行所述程序代碼的第二請(qǐng)求;W及利用更新的執(zhí)行上下文來(lái)執(zhí)行更新的執(zhí)行代碼庫(kù)中的機(jī)器代碼。20.根據(jù)權(quán)利要求19所述的計(jì)算機(jī)可讀介質(zhì),其中,所述程序代碼、所述初始代碼和所述運(yùn)行時(shí)條件代碼包括PHP計(jì)算機(jī)指令。【文檔編號(hào)】G06F15/16GK104471557SQ201380038085【公開(kāi)日】2015年3月25日申請(qǐng)日期:2013年6月17日優(yōu)先權(quán)日:2012年6月18日【發(fā)明者】所羅門(mén)·布洛斯,杰里米·休格曼申請(qǐng)人:谷歌公司