lTucture 二二 ExpeKdStmcUjre) V= *(〇->index[OffsetOFF]);
[0057] else T 二 SlowPath民ead(o);
[005引 SlowPathReadO可表示包括執(zhí)行的對象讀取例程,W例如通過對象的動態(tài)結(jié)構(gòu)或 形狀經(jīng)由表格查找操作或散列操作來解析或定位對象的屬性或字段值。 ExpectedStruc化re可表示在運行時期間之前出現(xiàn)的對象類型,其中偏移量值Of f setOf F已 被解析。
[0059] 可根據(jù)對象(例如,0)是否已具有標引字段(例如,f)而W不同方式編譯用于訪問 對象的典型對象寫入程序聲明(例如,用于利用值V來更新對象O的屬性f的O . f = V)。由于動 態(tài)語言諸如化vaScript中的對象不必具有其預(yù)先聲明的字段,所W可能常見的是在運行時 期間執(zhí)行隨時動態(tài)產(chǎn)生新字段的對象寫入。同樣,如同在其他必要的編程語言中,常見的是 覆寫對象的現(xiàn)有字段的字段值。
[0060] 在其他實施例中,在經(jīng)由W下操作例如ExistingW;rite()可執(zhí)行對寫入到已存在 的字段(例如,用于將值V寫入對象O的現(xiàn)有字段f的O.f = V)的對象的寫入訪問(例如,o.f = V)的情況下: if (o->slTuct 山-e == Expends 化 UCtur 句 * (〇-> in 過樹'[0化6似 fF]) =V;-
[0061] ' else S10 W Pa 化 WW 化(0, V);
[0062] ExistingWriteO可包括例如經(jīng)由原子機器指令通過Cell. index的間接索引(例 如,加載指向指針的指針)。即使字段值改變,也可保證Cell, index處的指針的值保持不變。 SlowPatMriteQ可表示包括執(zhí)行的對象寫入例程,W解析類似于Slow化thReadO的對象 的字段值。
[0063] 在經(jīng)由W下操作例如AdditiveWriteO可執(zhí)行對用于寫入不存在的字段的對象的 寫入訪問(例如,o.f = V)的情況下: if (o->stmctm*e -二 Expei:edSi:mcture) { Value** oldindex = o->index; Value々吞 newindex 二 reallocatelndex(oldlndex); newIndex[OffsetOfF]二 new Value(v);
[0064] if(!CAS(&o->structure,&o->mdex,Expecl:edStTuc 山 re、 .ol進ndex,N'ewStmctgure, newl打dex)) SlowPa 化 Wri 化(o,v); } Else SlowPathWrite(o,v);
[0(?5]在一個實施例中,AdditiveW;rite()可保證Cell. stru州tre和Cell. index(例如, 表示對象的結(jié)構(gòu)和有效載荷)在一次原子操作諸如CASO操作中同時變化。
[0066] CAS(比較和切換)操作可為支持硬件或處理器的例程,W保證在不間斷的情況下 W原子形式完成比較操作和切換操作兩者。在一個實施例中,CAS操作可為兩個字詞原子W 同時改變對象的結(jié)構(gòu)(例如,Cell .structure)和索引(例如,Cell. index)兩者,只要兩個字 詞在存儲器中相鄰定位即可。
[0067] 索引值化Iue*條目可經(jīng)由'reallocatelndexQ '復(fù)制在AdditiveWriteO中,而無 需復(fù)制條目所標引的任何字段值。附加字段值或Value框可經(jīng)由'new化IueO '分配在存儲 器中W為對象保持一個字段或?qū)傩灾?。值V可被存儲到該新分配的化Iue框中。
[0068] 在一個實施例中,對用于基于并發(fā)對象模型來刪除對象的字段的對象的訪問可保 證對象的索引(例如,Cell, index)包含不變的指針。字段的重復(fù)刪除可迫使對象成為普通 散列表,其中可對對象訪問的優(yōu)化解激活。例如,如果在對象成為普通散列表之前添加對象 的所刪除的字段,并發(fā)對象模型可能未收回所刪除的字段的存儲器。一旦對象成為散列表 (例如,處于散列表模式),對對象的訪問可使用每個對象鎖定,W用于同步多次訪問。在某 些實施例中,垃圾收集機制可壓縮或收回不再使用的或不活動的對象索引。
[0069] 圖3為示出了用于執(zhí)行共享共同動態(tài)類型化對象的多個線程的一個示例性運行時 的框圖。運行時301可與圖2的系統(tǒng)200相關(guān)聯(lián)。例如,運行時301可包括圖2的運行時數(shù)據(jù)211 的一部分。在一個實施例中,共享堆303可包括經(jīng)由多個線程或過程諸如線程1 315、線程2 317或經(jīng)由一個或多個處理器的其他可適用線程或過程來共享的運行時數(shù)據(jù)或?qū)ο蟆?br>[0070] 例如,在線程1 315和線程2 317之間共享的動態(tài)類型化對象0 319可對應(yīng)于對象 單元307。對象0 319可具有經(jīng)由結(jié)構(gòu)305表示的動態(tài)屬性W及一個或多個屬性值311,313 等。結(jié)構(gòu)305可指定對象0 319的動態(tài)類型。例如,結(jié)構(gòu)305可包括動態(tài)屬性的屬性名和位置 信息諸如存儲器偏移量,W定位對應(yīng)屬性值。
[0071] 對象單元307可經(jīng)由直接指針或間接指針來標引其屬性。例如,對象單元307可包 括指向結(jié)構(gòu)305的直接指針和經(jīng)由索引309用于屬性值311,313的間接指針。索引309可存儲 指針陣列,每個指針指向一個屬性值(或?qū)傩源鎯ρb置)。針對每個屬性值在結(jié)構(gòu)305中的位 置信息可對應(yīng)于對索引309的指針陣列的索引。
[0072] 可經(jīng)由線程1 315和線程2 317來并發(fā)執(zhí)行訪問對象0 319的操作。對象訪問操作 可包括36日(1〇、6《131:;[叫¥1';[16()、4(1(1;[1:;[¥6¥1';[16()和/或0616160等。每個對象訪問操作 可要求多于一個原子機器指令。并發(fā)對象模型可允許向?qū)ο? 319添加附加屬性,而無需復(fù) 制現(xiàn)有屬性值311,313,從而避免復(fù)制屬性值與更新屬性值之間的競爭狀況。
[0073] 圖4示出了經(jīng)由并發(fā)執(zhí)行共享的動態(tài)類型化對象的示例性分配。實例400可基于圖 2的系統(tǒng)200的一些部件。例如,對象0 403可被分配在圖2的運行時數(shù)據(jù)211中。在時間實例 T1423處,對象0 403可具有在結(jié)構(gòu)401中指代的具有對應(yīng)屬性值10、12和8的屬性化、F、G)。 對象0 403可標引存儲指針陣列的索引405,其中指針指向?qū)傩灾怠?br>[0074] 在一個實施例中,結(jié)構(gòu)401可為每個屬性(例如,E、F或G)指定偏移量,W針對對應(yīng) 屬性值將指針定位在索引405中。例如,偏移量2可被識別用于結(jié)構(gòu)401中的屬性F,W將指針 定位在偏移量2處,從而指向存儲屬性值12的屬性存儲裝置411。時間T1423處的對象0 403 可具有與如化:10,F(xiàn):12,G:8)的名稱-值對(或字段值)對應(yīng)的動態(tài)屬性。
[0075] 線程Tl和T2409可同時訪問對象0 403,而無需采用軟件同步機制諸如鎖定、關(guān)鍵 部分等。例如,線程Tl可執(zhí)行程序聲明o.f = 3(例如,經(jīng)由ExistingWriteO) W利用值3來更 新屬性F。同時,線程T2可執(zhí)行程序聲明O . h = 5 (例如,經(jīng)由Addi ti veWr i te ()) W將具有值5 的新屬性H添加到對象0403。
[0076] 作為并發(fā)執(zhí)行或同步執(zhí)行Tl和T2409的結(jié)果,對象0 403可與單獨結(jié)構(gòu)413和單獨 索引415相關(guān)聯(lián),W動態(tài)地生長其結(jié)構(gòu),從而適應(yīng)新添加的屬性(或?qū)傩?、字段化。結(jié)構(gòu)413可 包括(前一個)結(jié)構(gòu)401的副本W(wǎng)及新添加屬性H的屬性。索引415可包括(前一個)索弓1415的 副本W(wǎng)及指向存儲屬性值5的新分配的屬性存儲裝置421的指針。換句話講,對象0 403的結(jié) 構(gòu)可從結(jié)構(gòu)401重新分配到結(jié)構(gòu)413,并且對象0 403的索引可從索引405重新分配到索引 415。
[0077] 用于現(xiàn)有屬性值的屬性存儲裝置諸如屬性E的屬性存儲裝置419保持不變。屬性存 儲裝置411利用屬性F的屬性值3進行更新。由于現(xiàn)有屬性值保持存儲在相同屬性存儲裝置 中,所W可避免更新和重新定位屬性值的競爭狀況。
[0078] 圖5為示出了用于生成用于訪問動態(tài)類型化對象的并發(fā)可執(zhí)行指令的過程的一個 實施例的流程圖。示例性過程500可由例如包括圖2的系統(tǒng)200的一些部件的處理邏輯部件 來執(zhí)行。在塊501處,過程500的處理邏輯部件可在運行時期間在存儲器中提供對象模型,W 表示在動態(tài)編程語言諸如化vaScript中的源代碼中指定的動態(tài)類型化對象。源代碼可包括 用于指定對象的聲明而無需聲明對象的類型或結(jié)構(gòu)。
[0079] 對象模型可包括屬性結(jié)構(gòu)、索引結(jié)構(gòu)和/或針對在源代碼中指定或標引的對象分 配的值存儲裝置。屬性結(jié)構(gòu)可為在存儲器(或存儲器的地址空間)中分配的結(jié)構(gòu)化數(shù)據(jù),W 存儲對象的一個或多個現(xiàn)有屬性。現(xiàn)有屬性可指示在運行時期間用于對象的當(dāng)前動態(tài)類 型。
[0080] 在一個實施例中,對象的值存儲裝置可被動態(tài)分配在存儲器中,W存儲對象的現(xiàn) 有屬性值。每個屬性值可單獨對應(yīng)于對象的現(xiàn)有屬性中的一個現(xiàn)有屬性。對象的索引結(jié)構(gòu) 可被動態(tài)分配,W為對應(yīng)現(xiàn)有屬性存儲對屬性值的標引。標引可為指向存儲器地址的直接 指針或間接指針(例如,經(jīng)由執(zhí)行代碼或其他可適用機制),W定位用于存儲屬性值的值存 儲裝置。
[0081] 在塊503處,過程中的處理邏輯部件可從源代碼生成第一指令W用于對對象的第 一訪問。源代碼可包括程序聲明,W利用第一訪問的所更新的屬性值來更新現(xiàn)有屬性中的 一個現(xiàn)有屬性。在一些實施例中,對所更新的屬性值的第一訪問可指示屬性已從對象中刪 除。第一指令可包括操作諸如ExistingWriteO ,DeleteQ等。
[0082] 在一些實施例中,可在源代碼中指定對對象的第一訪問,W利用所更新的屬性值 來更新對象的現(xiàn)有屬性??衫脙?nèi)聯(lián)高速緩存代碼來針對第一訪問編譯第一指令,從而包 括對對象的期望屬性結(jié)構(gòu)的標引。期望屬性結(jié)構(gòu)可指定偏移位置W用于針對現(xiàn)有屬性定位 屬性存儲裝置。例如,偏移位置可為對用于指向?qū)傩源鎯ρb置的指針的索引結(jié)構(gòu)的索引偏 移量。第一指令可針對對象的第一訪問嵌入偏移位置和對象的期望屬性結(jié)構(gòu)。
[0083] 在一些實施例中,第一指令可嵌入偏移位置和對象的期望屬性結(jié)構(gòu)W用于定位對 象的現(xiàn)有屬性的屬性值。偏移位置可在期望屬性結(jié)構(gòu)中指定。例如,偏移位置可包括對索引 結(jié)構(gòu)中的指針陣列的索引。在一個實施例中,第一指令可包括操作,W確定對象的屬性結(jié)構(gòu) 是否對應(yīng)于對象的期望屬性結(jié)構(gòu)。如果對象的屬性結(jié)構(gòu)對應(yīng)于期望屬性結(jié)構(gòu),則可執(zhí)行第 一指令W執(zhí)行第一訪問,從而經(jīng)由嵌入第一指令中的偏移位置利用所更新的屬性值來更新 屬性存儲裝置,而無需執(zhí)行表格查找操作。
[0084] 編譯器諸如圖2的編譯器205可基于與運行時執(zhí)行相關(guān)聯(lián)的運行時數(shù)據(jù)來為對象 生成具有期望屬性結(jié)構(gòu)的第一指令。例如,過程500的處理邏輯部件可分析運行時配置文件 諸如在圖2的運行時數(shù)據(jù)211中收集的配置文件數(shù)據(jù),W預(yù)測用于訪問對象的期望配置文件 結(jié)構(gòu)。另選地或可選地,過程500的處理邏輯部件可基于從外部輸入端諸如至其他處理模塊 的用戶輸入或界面提供的啟發(fā)或提示來確定對象的期望屬性結(jié)構(gòu)。
[0085] 在塊505處,過程500的處理邏輯部件可生成第二指令W用于對對象的第二訪問。 第二訪問可由源代碼指定W利用對象的附加屬性值來更新附加屬性。當(dāng)執(zhí)行第二指令W用 于對對象的第二訪問時,對象的現(xiàn)有屬性可不包括附加屬性。
[0086] 第二指令可被執(zhí)行W分配單獨屬性結(jié)構(gòu)、單獨索引結(jié)構(gòu)和針對對象存儲附加屬性 值的附加值存儲裝置,該單獨屬性結(jié)構(gòu)存儲現(xiàn)有屬性和附加屬性,該單獨索引結(jié)構(gòu)存儲對 值存儲裝置的單獨標引W及對與附加屬性對應(yīng)的附加值存儲裝置的附加標引。
[0087] 在一個實施例中,源代碼可針對對象的第二訪問來指定第二屬性標識符。過程500 的處理邏輯部件可確定第二屬性標識符是否識別在屬性結(jié)構(gòu)中存儲的現(xiàn)有屬性中的一個 現(xiàn)有屬性。例如,由于第二屬性標識符識別出在屬性結(jié)構(gòu)中沒有現(xiàn)有屬性(例如, AdditiveWrite()),所W過程500的處理邏輯部件可生成第二指令。
[0088] 在塊507處,過程500的處理邏輯部件可并發(fā)執(zhí)行第一指令和第二指令,W例如經(jīng) 由單獨線程來執(zhí)行對對象的第一訪問和第二訪問??蓤?zhí)行第一指令W更新值存儲裝置中的 與現(xiàn)有屬性中的一個現(xiàn)有屬性對應(yīng)的一個值存儲裝置(例如,ExistingWriteO )。可執(zhí)行第 二指令W向?qū)ο蟮默F(xiàn)有屬性添加附加屬性(例如,AdditiveWriteO)。
[0089] 根據(jù)某個實施例,對象模型(或并發(fā)對象模型)可包括屬性標引和索引標引。指向 屬性結(jié)構(gòu)的屬性標引可表示對象的動態(tài)類型。指向索引結(jié)構(gòu)的索引標引可表示對象在動態(tài) 類型下的動態(tài)數(shù)據(jù)值或?qū)傩灾?。屬性結(jié)構(gòu)可存儲相對于用于存儲對屬性值的指針或標引的 索引結(jié)構(gòu)的索引標引的偏移量。偏移量可允許經(jīng)由索引結(jié)構(gòu)的對屬性值的間接標引。
[0090] 在一個實施例中,對象的屬性標引可包括在執(zhí)行第一指令和第二指令之前指向?qū)?性結(jié)構(gòu)的指針。屬性標引可在并發(fā)執(zhí)行第一指令和第二指令之后指向單獨屬性結(jié)構(gòu)。
[0091] 在一些實施例中,第二指令可包括對對象的原子更新操作W同時更新屬性標引和 索引標引兩者。例如,可執(zhí)行原子更新操作W將屬性標引與對屬性結(jié)構(gòu)的標引進行比較,并 且如果基于比較該屬性標引對應(yīng)于對屬性結(jié)構(gòu)的標引,則設(shè)置屬性標引W指代所更新的屬 性結(jié)構(gòu)??山?jīng)由硬件來支持(例如,內(nèi)置于處理器中的邏輯部件中)W原子形式執(zhí)行的比較 操作和設(shè)置操作。
[0092] 過程500的處理邏輯部件可從源代碼生成第=指令W用于對對象的第=訪問。第 =訪問可在源代碼中被指定W獲取或讀取對象的屬性值。第=指令可包括內(nèi)聯(lián)高速緩存操 作,W確定對象的屬性標引是否指代屬性結(jié)構(gòu)。并發(fā)對象模型可允許并發(fā)執(zhí)行第二指令和 第=指令。
[0093] 圖6為示出了用于基于具有索引標號的對象模型來并發(fā)訪問對象的屬性值的過程 的一個實施例的流程圖。示例性過程600可由例如包括圖2的系統(tǒng)200的一些部件的處理邏 輯部件來執(zhí)行。在塊601處,過程600的處理邏輯部件可生成第一指令W用于對源代碼中指 定的對象的第一訪問。對象可具有用于標引指向一個或多個值存儲裝置的指針的索引標 引,該一個或多個值存儲裝置存儲對象的現(xiàn)有屬性值。第一指令可W原子形式來更新索引 標引W指代單獨指針,該單獨指針指代用于存儲現(xiàn)有屬性值的值存儲裝置和用于存儲附加 屬性值的附加值存儲裝置。
[0094] 在塊603處,過程600的處理邏輯部件可從源代碼生成第二指令W用于對對象的第 二訪問。第二訪問可在源代碼中指定,W利用所更新的屬性值來更新對象的現(xiàn)有屬性值中 的一個現(xiàn)有屬性值。
[00M]在塊605處,過程600的處理邏輯部件可并發(fā)執(zhí)行第一指令和第二指令,W執(zhí)行對 對象的第一訪問和第二訪問??杀WC對象在執(zhí)行之后具有包括所更新的屬性值和附加屬性 值的屬性值。
[00%]并發(fā)內(nèi)聯(lián)高速緩存優(yōu)化
[0097] 用于訪問用于并發(fā)設(shè)置中的優(yōu)化的內(nèi)聯(lián)高速緩存的動態(tài)類型化對象的內(nèi)聯(lián)高速 緩存代碼可在運行時期間自修改。內(nèi)聯(lián)高速緩存代碼可包括用于訪問動態(tài)對象的快速代碼 路徑和慢速代碼路徑。當(dāng)被執(zhí)行時,內(nèi)聯(lián)高速緩存代碼可根據(jù)遇到的對象動態(tài)類型或?qū)傩?來確定是否調(diào)用快速代碼路徑或慢速代碼路徑。
[0098] 在一個實施例中,并發(fā)設(shè)置可包括允許經(jīng)由多線程和/或由一個或多個處理器托 管的多次處理的并發(fā)執(zhí)行的操作環(huán)境。所修改的內(nèi)聯(lián)高速緩存代碼可在用于處理器的優(yōu)化 的內(nèi)聯(lián)高速緩存中復(fù)位,W觀測所修改的內(nèi)聯(lián)高速緩存代碼中的指令的變化。
[0099] 根據(jù)某個實施例,優(yōu)化的內(nèi)聯(lián)高速緩存可經(jīng)由初始操作和連鎖操作來修改內(nèi)聯(lián)高 速緩存代碼(例如,就地編輯)。可執(zhí)行初始操作來修改(或初始化)未設(shè)置的(或未初始化 的)內(nèi)聯(lián)高速緩存代碼,W為特定對象屬性或結(jié)構(gòu)指定內(nèi)聯(lián)高速緩存代碼。所指定的內(nèi)聯(lián)高 速緩存代碼可包括在遇到具有特定對象屬性的對象時被調(diào)用的快速代碼路徑。可執(zhí)行連鎖 操作W修改內(nèi)聯(lián)高速緩存代碼(例如,初始化的或未初始化的)W經(jīng)由所生成的短插忍(例 如,指向所生成的函數(shù)代碼的一段代碼或函數(shù)指針)來調(diào)用慢速代碼路徑。
[0100] 可執(zhí)行初始操作而無需處理器指令高速緩存進行