專(zhuān)利名稱(chēng):帶有增量改變的高效不可變句法表示的制作方法
帶有增量改變的高效不可變句法表示
背景技術(shù):
在計(jì)算機(jī)科學(xué)中,樹(shù)是被鏈接的節(jié)點(diǎn)的分層數(shù)據(jù)結(jié)構(gòu)。樹(shù)是非循環(huán)連接圖,其中該樹(shù)中的每一節(jié)點(diǎn)具有零個(gè)或更多子節(jié)點(diǎn)以及最多一個(gè)父節(jié)點(diǎn)。節(jié)點(diǎn)可包含值、條件,或可表示分開(kāi)的數(shù)據(jù)結(jié)構(gòu)(諸如另一樹(shù))。按 照慣例,子節(jié)點(diǎn)在樹(shù)中位于其父母“之下”,就是說(shuō),計(jì)算機(jī)科學(xué)的樹(shù)(不像自然的樹(shù))是向下生長(zhǎng)而非向上生長(zhǎng)。具有孩子的節(jié)點(diǎn)被稱(chēng)為該孩子的父節(jié)點(diǎn)、其祖先或其上級(jí)節(jié)點(diǎn)。樹(shù)在計(jì)算機(jī)中由存儲(chǔ)器中的節(jié)點(diǎn)以及表示該樹(shù)中邊緣的引用來(lái)表示。每一父節(jié)點(diǎn)具有對(duì)其子節(jié)點(diǎn)的引用,但并非每一子節(jié)點(diǎn)都具有對(duì)其父節(jié)點(diǎn)的引用。沒(méi)有孩子的節(jié)點(diǎn)被稱(chēng)為葉子節(jié)點(diǎn)或端節(jié)點(diǎn)。節(jié)點(diǎn)的高度是從該節(jié)點(diǎn)至葉子的最長(zhǎng)向下路徑的長(zhǎng)度。根的高度是該樹(shù)的高度。節(jié)點(diǎn)的深度是至其根的路徑(即,其根路徑)長(zhǎng)度。樹(shù)中最上面的節(jié)點(diǎn)被稱(chēng)為根節(jié)點(diǎn)。根節(jié)點(diǎn)不具有父母。對(duì)樹(shù)的操作通常在根節(jié)點(diǎn)處開(kāi)始。樹(shù)中的任何節(jié)點(diǎn)可通過(guò)跟隨各節(jié)點(diǎn)之間的指針或鏈接從根節(jié)點(diǎn)到達(dá)。當(dāng)?shù)竭_(dá)樹(shù)中特定節(jié)點(diǎn)時(shí),操作被頻繁地執(zhí)行。中間節(jié)點(diǎn)是樹(shù)中具有子節(jié)點(diǎn)的任何節(jié)點(diǎn)。由此,因?yàn)槿~子節(jié)點(diǎn)沒(méi)有子節(jié)點(diǎn),所以葉子節(jié)點(diǎn)不是中間節(jié)點(diǎn)。樹(shù)中每一節(jié)點(diǎn)可被看作從該節(jié)點(diǎn)傳下來(lái)的子樹(shù)的根節(jié)點(diǎn)。術(shù)語(yǔ)“子樹(shù)”指的是包含樹(shù)中一節(jié)點(diǎn)以及樹(shù)中該節(jié)點(diǎn)的所有子孫的樹(shù)。對(duì)應(yīng)于根節(jié)點(diǎn)的子樹(shù)是整個(gè)樹(shù);對(duì)應(yīng)于任何其他節(jié)點(diǎn)的子樹(shù)被稱(chēng)為真子樹(shù)。樹(shù)可以用許多不同的方式來(lái)表示。某些常見(jiàn)表示將節(jié)點(diǎn)表示成被分配在堆(不要與堆數(shù)據(jù)結(jié)構(gòu)混淆)上帶有指向其子節(jié)點(diǎn)、其父親、或指向子節(jié)點(diǎn)和父節(jié)點(diǎn)兩者的指針的記錄,或被表示成陣列中的項(xiàng),該陣列(例如,二進(jìn)制堆)具有由各節(jié)點(diǎn)在陣列中的位置所確定的各節(jié)點(diǎn)之間的關(guān)系??赏ㄟ^(guò)跟隨一系列父節(jié)點(diǎn)和這些父節(jié)點(diǎn)的子節(jié)點(diǎn)之間的連接或指針來(lái)對(duì)樹(shù)進(jìn)行遍歷。前序遍歷在其到達(dá)父節(jié)點(diǎn)的子節(jié)點(diǎn)之前抵達(dá)該父節(jié)點(diǎn)。后序遍歷是其中在遍歷父節(jié)點(diǎn)之前遍歷該父節(jié)點(diǎn)的子節(jié)點(diǎn)的一種遍歷。解析樹(shù)或句法樹(shù)通常是根據(jù)某些形式語(yǔ)法來(lái)表示串的句法結(jié)構(gòu)的有序的有根樹(shù)。在解析樹(shù)中,內(nèi)部節(jié)點(diǎn)由語(yǔ)法的非終端來(lái)標(biāo)記,而葉子節(jié)點(diǎn)由語(yǔ)法的終端來(lái)標(biāo)記。產(chǎn)生這些樹(shù)的一種類(lèi)型的程序被稱(chēng)為解析器。解析樹(shù)或句法樹(shù)經(jīng)常在計(jì)算機(jī)編程語(yǔ)言的處理期間被生成。
發(fā)明內(nèi)容
不可變的樹(shù)可允許多線程上的多個(gè)客戶(hù)機(jī)使用同一樹(shù),而不會(huì)有觀察到由其他線程同時(shí)造成的改變的風(fēng)險(xiǎn)。此外,能夠使用并重復(fù)使用樹(shù)的各部分使得處理更為高效,因?yàn)楫?dāng)只有樹(shù)的小部分被改變時(shí)整個(gè)樹(shù)不必一次又一次地被創(chuàng)建。部分的樹(shù)可在單向樹(shù)中被重復(fù)使用,單向樹(shù)是其中該樹(shù)的節(jié)點(diǎn)僅指向或是直接在其之下或是直接在其之上的一個(gè)或多個(gè)節(jié)點(diǎn)的一種樹(shù)。即,在只在一個(gè)方向上具有指針的樹(shù)中,根可指向直接在其之下的節(jié)點(diǎn),且這些節(jié)點(diǎn)中的每一個(gè)可指向直接在其之下的一個(gè)或多個(gè)節(jié)點(diǎn)(依次類(lèi)推),但樹(shù)中任何節(jié)點(diǎn)都不指向其父節(jié)點(diǎn)和其子節(jié)點(diǎn)兩者。這是通常情況,然而,在兩個(gè)方向上都具有指針(雙向指針)的樹(shù)比具有單向指針的樹(shù)有用得多。傳統(tǒng)的具有雙向指針的樹(shù)不能重復(fù)使用,而不能重復(fù)使用的樹(shù)在處理資源方面成本較高,且因此通常較不高效。為使消費(fèi)者能夠創(chuàng)建由多個(gè)消費(fèi)者使用的新版本的樹(shù)而不犧牲高效性或數(shù)據(jù)完整性,創(chuàng)建了包括第一不可變私人樹(shù)和第二公共樹(shù)的數(shù)據(jù)結(jié)構(gòu)。公共樹(shù)控制對(duì)私人樹(shù)的訪問(wèn)。私人樹(shù)和公共樹(shù)的結(jié)合使得數(shù)據(jù)結(jié)構(gòu)中能夠存在向上引用和向下引用,且使得不可變(只讀或不能改變的)和可改變的特性能夠在同一數(shù)據(jù)結(jié)構(gòu)中共存。數(shù)據(jù)結(jié)構(gòu)的部分可在其他樹(shù)數(shù)據(jù)結(jié)構(gòu)中被重復(fù)使用。私人樹(shù)保留了允許其被重新組裝和重復(fù)使用的相對(duì)信息。公共樹(shù)保留了消費(fèi)者專(zhuān)用信息,且使得工具能夠搜索并將私人樹(shù)中的子樹(shù)定位目標(biāo)。公共樹(shù)(除根節(jié)點(diǎn)之外)的構(gòu)建可被推遲,直到公共樹(shù)中的節(jié)點(diǎn)被請(qǐng)求。響應(yīng)于對(duì)訪問(wèn)私人樹(shù)中節(jié)點(diǎn)的消費(fèi)者請(qǐng)求,可按需構(gòu)建公共樹(shù)。
上述數(shù)據(jù)結(jié)構(gòu)可用于以允許雙向指針的方式來(lái)呈現(xiàn)編譯器生成的諸如解析樹(shù)、句法樹(shù)、語(yǔ)義樹(shù)和綁定樹(shù)之類(lèi)的樹(shù),要呈現(xiàn)的消費(fèi)者專(zhuān)用且相對(duì)的位置是不可變的但是允許樹(shù)的高效創(chuàng)建和進(jìn)化,從而創(chuàng)建數(shù)據(jù)結(jié)構(gòu)的只讀樹(shù)的新版本而無(wú)需重新創(chuàng)建整個(gè)樹(shù)。提供本概述以便以簡(jiǎn)化形式介紹將在以下詳細(xì)描述中進(jìn)一步描述的一些概念。本概述并不旨在標(biāo)識(shí)所要求保護(hù)主題的關(guān)鍵特征或必要特征,也不旨在用于限制所要求保護(hù)主題的范圍。
在附圖中圖Ia是本領(lǐng)域已知的樹(shù)數(shù)據(jù)結(jié)構(gòu)的示例的框圖;圖Ib是本領(lǐng)域已知的樹(shù)數(shù)據(jù)結(jié)構(gòu)的另一示例的框圖;圖Ic是本領(lǐng)域已知的樹(shù)數(shù)據(jù)結(jié)構(gòu)的另一示例的框圖;圖Id示出了根據(jù)此處所公開(kāi)的主題的各方面的用于帶有增量改變的高效不可變句法表示的系統(tǒng)100的示例;圖Ie是根據(jù)此處所公開(kāi)的主題的各方面的數(shù)據(jù)結(jié)構(gòu)的框圖;圖2a是根據(jù)此處所公開(kāi)的主題的各方面的用于帶有增量改變的高效不可變句法表示的方法的示例的流程圖;圖2b是根據(jù)本文所公開(kāi)主題的各方面的根節(jié)點(diǎn)的示例的框圖;圖2c是根據(jù)此處所公開(kāi)的主題的各方面的非根節(jié)點(diǎn)的示例的框圖;圖2d是根據(jù)此處所公開(kāi)的主題的各方面的非根節(jié)點(diǎn)的另一示例的框圖;圖3是示出了其中可以實(shí)現(xiàn)此處所公開(kāi)的主題的各方面的計(jì)算環(huán)境的示例的框圖;以及圖4是根據(jù)此處所公開(kāi)的主題的各方面的集成開(kāi)發(fā)環(huán)境的示例的框圖。
具體實(shí)施例方式概覽諸如計(jì)算機(jī)語(yǔ)言解析樹(shù)(描述被拆分成語(yǔ)法元素的輸入源代碼的語(yǔ)言解析器的輸出)、句法樹(shù)、語(yǔ)義樹(shù)和綁定樹(shù)(包括諸如導(dǎo)出成員等的綁定信息的樹(shù))之類(lèi)的樹(shù)對(duì)于許多不同類(lèi)型的消費(fèi)者是有用的,包括諸如編譯器、調(diào)試器、源代碼編輯器、類(lèi)設(shè)計(jì)器、架構(gòu)資源管理器(architecture explorer)、諸如度量、規(guī)則檢查器和源代碼解構(gòu)工具等代碼分析器之類(lèi)的開(kāi)發(fā)工具。為給予多個(gè)消費(fèi)者在同一時(shí)間對(duì)同一樹(shù)的訪問(wèn)權(quán)同時(shí)維護(hù)數(shù)據(jù)完整性,樹(shù)可被表示成不可變(只讀)結(jié)構(gòu)。消費(fèi)者還可能希望能夠或是直接地或是間接地(例如,通過(guò)修改從中生成樹(shù)的文件中的文本來(lái)間接修改該樹(shù))對(duì)樹(shù)作出修改。然而,由于消費(fèi)者不能直接地修改共享的只讀樹(shù),因此必需構(gòu)建新的只讀樹(shù)以表示消費(fèi)者對(duì)樹(shù)的已修改版本,而仍然允許其他消費(fèi)者用原始樹(shù)來(lái)工作。理想地,至少部分的現(xiàn)有的樹(shù)會(huì)在構(gòu)建新樹(shù)時(shí)能夠被重復(fù)使用。樹(shù)數(shù)據(jù)結(jié)構(gòu)的消費(fèi)者常常希望具有向上和向下導(dǎo)航通過(guò)該結(jié)構(gòu)的能力,使得向上和向下引用都是有用的,但帶有向上和向下引用的樹(shù)的片段不能在其他樹(shù)中被重復(fù)使用。為理解為何如此,圖Ia示出了解析樹(shù),即可能被生成以表示“返回3. 14打~2”語(yǔ)句的樹(shù)10。樹(shù)10具有向下指(自父節(jié)點(diǎn)至子節(jié)點(diǎn))的單向指針?,F(xiàn)在參考圖lb,假設(shè)消費(fèi)者希望修改樹(shù)10以反映語(yǔ)句“返回Math. PI*r~2”(用表示“Math. PI”的節(jié)點(diǎn)來(lái)代替表示 “3. 14”的節(jié)點(diǎn))。圖Ib的樹(shù)12反映了新語(yǔ)句,即“返回Math.PI*r~2,,。如圖Ia和Ib中所示,樹(shù)10與樹(shù)12分開(kāi)。這意味著樹(shù)12與樹(shù)10基本使用相同的存儲(chǔ)器量,因?yàn)榕c樹(shù)10不共享任何節(jié)點(diǎn)的分開(kāi)的樹(shù)(樹(shù)12)已被構(gòu)建。對(duì)于包含數(shù)千個(gè)節(jié)點(diǎn)的大樹(shù),這樣的進(jìn)程缺乏高效性(是資源成本高的)。為使得創(chuàng)建表示已修改語(yǔ)句“返回Math. PI*r~2”的樹(shù)的該進(jìn)程更高效,樹(shù)10的未改變部分可由兩個(gè)樹(shù)共享。在樹(shù)10與同樹(shù)10共享某些節(jié)點(diǎn)的第二樹(shù)之間顯然不能共享的節(jié)點(diǎn)是表示“Math”的節(jié)點(diǎn)16、表示“PI”的節(jié)點(diǎn)18以及表示”的節(jié)點(diǎn)20。這些節(jié)點(diǎn)不能被共享,因?yàn)闃?shù)10中沒(méi)有與節(jié)點(diǎn)16和節(jié)點(diǎn)18對(duì)應(yīng)的節(jié)點(diǎn),并且與樹(shù)12中表示”的節(jié)點(diǎn)20對(duì)應(yīng)的節(jié)點(diǎn)是樹(shù)10中表示“3. 14”的節(jié)點(diǎn)22。顯然,節(jié)點(diǎn)20與節(jié)點(diǎn)22不相同。樹(shù)10中還有不能被重復(fù)使用的其他節(jié)點(diǎn)。樹(shù)12中表示的節(jié)點(diǎn)24與樹(shù)10中表示的節(jié)點(diǎn)26不相同,因?yàn)楣?jié)點(diǎn)26具有兩個(gè)子節(jié)點(diǎn),其中最左邊的一個(gè)是表示“3. 14”的節(jié)點(diǎn)22,而樹(shù)12的表示的節(jié)點(diǎn)24具有最左邊的表示”的子節(jié)點(diǎn)20。類(lèi)似地,盡管樹(shù)12中的節(jié)點(diǎn)28表示“Stmt”而樹(shù)10中的節(jié)點(diǎn)30也表示“Stmt”,但節(jié)點(diǎn)28與節(jié)點(diǎn)30不相同,因?yàn)楣?jié)點(diǎn)28的最右邊的孩子是節(jié)點(diǎn)24,該節(jié)點(diǎn)24與樹(shù)10中的節(jié)點(diǎn)26不是相同的節(jié)點(diǎn)。類(lèi)似地,樹(shù)12的節(jié)點(diǎn)32與樹(shù)10的節(jié)點(diǎn)34不是相同的節(jié)點(diǎn)。然而,其他節(jié)點(diǎn),即在兩個(gè)樹(shù)(圖Ia的樹(shù)10和圖Ib的樹(shù)12)中由間斷線表示的且由參考數(shù)字9標(biāo)記的節(jié)點(diǎn)可被共享。由于這些節(jié)點(diǎn)結(jié)構(gòu)上是相同的,因此它們可被重復(fù)使用。只要樹(shù)中的指針是單向的(在該示例中從父節(jié)點(diǎn)指向子節(jié)點(diǎn)),則所有用虛線表示的節(jié)點(diǎn)可被共享。圖Ic示出樹(shù)14(其中某些信息可在各樹(shù)之間被共享)是通過(guò)將新樹(shù)(即樹(shù)14)的節(jié)點(diǎn)指向樹(shù)10的未改變節(jié)點(diǎn)來(lái)共享的??梢岳斫猓瑯?shù)的各共享部分維護(hù)了數(shù)據(jù)完整性,直到樹(shù)中從孩子指向父親的指針被添加。例如,檢查圖Ic中樹(shù)10的節(jié)點(diǎn)36揭示了對(duì)于樹(shù)14的節(jié)點(diǎn)36、節(jié)點(diǎn)24以及樹(shù)10的節(jié)點(diǎn)24存在兩個(gè)可能的父節(jié)點(diǎn)。由此,對(duì)樹(shù)10和樹(shù)14進(jìn)行多個(gè)可能的后序遍歷是可能的。由于對(duì)樹(shù)10和14進(jìn)行多個(gè)可能的后序遍歷是可能的,因此數(shù)據(jù)完整性由于例如對(duì)于問(wèn)題“節(jié)點(diǎn)36的父節(jié)點(diǎn)是什么? ”存在兩個(gè)可能的回答而丟失。根據(jù)本文所公開(kāi)的主題的各方面,數(shù)據(jù)結(jié)構(gòu)包括私人樹(shù)和公共樹(shù),私人樹(shù)對(duì)一個(gè) 或多個(gè)消費(fèi)者不直接可用,而公共樹(shù)對(duì)一個(gè)或多個(gè)消費(fèi)者直接可用。公共樹(shù)提供對(duì)私人樹(shù)的間接訪問(wèn)。私人樹(shù)具有從父節(jié)點(diǎn)指向子節(jié)點(diǎn)的單向指針且可被重復(fù)使用。公共樹(shù)可以是不可重復(fù)使用的雙向引用樹(shù),或可以是可重復(fù)使用的單向指向樹(shù)。公共樹(shù)中的樹(shù)元素還可指向消費(fèi)者不可訪問(wèn)的私人樹(shù)中對(duì)應(yīng)或等效的樹(shù)元素。即,公共樹(shù)中的節(jié)點(diǎn)可指向其在公共樹(shù)中的父節(jié)點(diǎn),并且還可指向等效的私人樹(shù)節(jié)點(diǎn)。公共樹(shù)中的該節(jié)點(diǎn)還可具有指向其在公共樹(shù)中的子節(jié)點(diǎn)的指針。指向公共樹(shù)中子節(jié)點(diǎn)的指針可在消費(fèi)者請(qǐng)求時(shí)被懶惰地(按需)確定。如果公共樹(shù)中的節(jié)點(diǎn)不具有指向其在公共樹(shù)中的子節(jié)點(diǎn)的指針,則對(duì)于每一請(qǐng)求創(chuàng)建公共子節(jié)點(diǎn)且公共子節(jié)點(diǎn)不被保留或重復(fù)使用。因?yàn)閿?shù)據(jù)結(jié)構(gòu)對(duì)于一個(gè)或多個(gè)消費(fèi)者看起來(lái)具有雙向引用,而由于隱藏的私人樹(shù)仍維護(hù)數(shù)據(jù)完整性。上述特性允許對(duì)數(shù)據(jù)結(jié)構(gòu)的高效增量更新。假設(shè)消費(fèi)者希望創(chuàng)建與原始樹(shù)僅在單個(gè)節(jié)點(diǎn)上有區(qū)別的樹(shù)的版本。消費(fèi)者可創(chuàng)建包括新的公共樹(shù)以及新的不可訪問(wèn)的私人樹(shù)在內(nèi)的數(shù)據(jù)結(jié)構(gòu),新的公共樹(shù)表示已修改的語(yǔ)句,而新的不可訪問(wèn)的私人樹(shù)可與先前私人樹(shù)共享節(jié)點(diǎn)。為新的公共樹(shù)所創(chuàng)建的根表示具有區(qū)別節(jié)點(diǎn)的樹(shù),且可與原始樹(shù)的根共存而且最大地共享原始樹(shù)中的現(xiàn)有節(jié)點(diǎn)。
新樹(shù)可按需被創(chuàng)建,使得僅在消費(fèi)者作出請(qǐng)求以訪問(wèn)或改變?cè)紭?shù)所表示的語(yǔ)句 的情況下才產(chǎn)生新樹(shù)的子節(jié)點(diǎn)。作為結(jié)果,所描述的數(shù)據(jù)結(jié)構(gòu)提供了帶有雙向指針的不可變樹(shù)結(jié)構(gòu),從而使得能夠進(jìn)行允許預(yù)更新和后更新樹(shù)共存的高效非破壞性更新,所描述的數(shù)據(jù)結(jié)構(gòu)并且準(zhǔn)許在不同版本的私人樹(shù)之間共享。帶有增量改變的高效不可變句法表示圖Id示出了根據(jù)此處所公開(kāi)的主題的各方面的帶有增量改變的高效不可變句法表示的系統(tǒng)100的示例。系統(tǒng)100的全部或某些部分可以駐留在諸如下面參考圖3所描述的計(jì)算機(jī)之類(lèi)的一臺(tái)或多臺(tái)計(jì)算機(jī)上。系統(tǒng)100的全部或某些部分可以駐留在諸如下面參考圖4所描述的計(jì)算機(jī)之類(lèi)的一臺(tái)或多臺(tái)軟件開(kāi)發(fā)計(jì)算機(jī)(例如,計(jì)算機(jī)102)上。系統(tǒng)100或其一些部分可以包括諸如下面參考圖4所描述的和所示出的那些集成開(kāi)發(fā)環(huán)境(例如,IDE 104)的一部分。替代地,系統(tǒng)100或其一些部分可以作為獨(dú)立系統(tǒng)或作為插件或附加件來(lái)提供。系統(tǒng)100可包括以下各項(xiàng)中的一個(gè)或多個(gè)處理器(諸如處理器142)、存儲(chǔ)器144、和用于帶有增量改變的高效不可變句法表示的模塊106。也可以包括本領(lǐng)域已知的其他組件,但此處未示出。能夠理解,用于帶有增量改變的高效不可變句法表示的模塊106可以被加載到存儲(chǔ)器144中以致使諸如處理器142之類(lèi)的一個(gè)或多個(gè)處理器執(zhí)行以歸因于用于帶有增量改變的高效不可變句法表示的模塊106的動(dòng)作。根據(jù)本文所公開(kāi)的主題的各方面,用于帶有增量改變的高效不可變句法表示的模塊106可接收或生成諸如解析樹(shù)108之類(lèi)的只讀樹(shù),并且可產(chǎn)生包括如下文更完整地描述的一個(gè)或多個(gè)數(shù)據(jù)結(jié)構(gòu)110的輸出。用于帶有增量改變的高效不可變句法表示的模塊106可包括以下各項(xiàng)中的一個(gè)或多個(gè)編譯器,比如后臺(tái)編譯器、并行編譯器或增量編譯器;解析器,比如后臺(tái)解析器、并行解析器或增量解析器;或者插件、預(yù)處理器、或附件;或者對(duì)IDE、解析器、編譯器或預(yù)處理器的擴(kuò)展。用于帶有增量改變的高效不可變句法表示的模塊106可拆卸文本或非文本信息,并且可從中建立表示信息塊的樹(shù)。用于帶有增量改變的高效不可變句法表示的模塊106可被附連至交互式設(shè)計(jì)時(shí)源代碼編輯器、并入其內(nèi)或與其相關(guān)聯(lián),并且可能能夠解析任何編程語(yǔ)言,包括 C# (CSharp)、Visual Basic、C、C++、Java、Ruby、Perl、Python、Fortran、Cobol以及其他。在操作中,用于帶有增量改變的高效不可變句法表示的模塊106可生成或接收一個(gè)或多個(gè)樹(shù),包括但不限于諸如解析樹(shù)、句法樹(shù)、語(yǔ)義樹(shù)、綁定樹(shù)等編譯器生成的樹(shù),且可從中生成如下文更完整地描述的數(shù)據(jù)結(jié)構(gòu)?,F(xiàn)在參考圖le,給定只讀第一樹(shù)(如,私人樹(shù)),例如表示語(yǔ)句“返回Math. PI*r~2”的樹(shù)40,用于帶有增量改變的高效不可變句法表示的模塊106向消費(fèi)者隱藏第一樹(shù)、或使得第一樹(shù)對(duì)消費(fèi)者不可訪問(wèn)或不可用。用于帶有增量改變的高效不可變句法表示的模塊106可響應(yīng)于接收包括對(duì)訪問(wèn)或修改樹(shù)40中節(jié)點(diǎn)的請(qǐng)求的輸入來(lái)隱藏私人樹(shù),或另選地,樹(shù)可在來(lái)自消費(fèi)者的請(qǐng)求被接收之前向消費(fèi)者呈遞為不可用。樹(shù)40的不可用性在圖Ie中通過(guò)所示圍繞樹(shù)40的框42來(lái)表示。根據(jù)本文所公開(kāi)的主題的某些方面,通過(guò)創(chuàng)建諸如樹(shù)43之類(lèi)的控制對(duì)第一樹(shù)的訪問(wèn)的第二只讀樹(shù)(例如,只讀公共樹(shù)),來(lái)向消費(fèi)者授權(quán)對(duì)只讀第一樹(shù)的間接訪問(wèn)。第二樹(shù)(樹(shù)43)不能直接由消費(fèi)者修改,然而,可在一個(gè)或多個(gè)新樹(shù)的構(gòu)建中使用第二樹(shù),其中新樹(shù)表示以下信息作為對(duì)用于生成第二樹(shù)的信息的修改。 為創(chuàng)建第二樹(shù)(樹(shù)43),根節(jié)點(diǎn)(根節(jié)點(diǎn)44)被創(chuàng)建,該根節(jié)點(diǎn)(根節(jié)點(diǎn)44)覆蓋第一樹(shù)(樹(shù)40)的根節(jié)點(diǎn)46。第二樹(shù)的根節(jié)點(diǎn)擔(dān)當(dāng)?shù)谝粯?shù)的根節(jié)點(diǎn)周?chē)拇砘蛲庥^,但維持其自己的身份。與第一樹(shù)中的節(jié)點(diǎn)有關(guān)的任何信息可通過(guò)在第二樹(shù)中創(chuàng)建節(jié)點(diǎn)來(lái)獲取,其中所創(chuàng)建的第二樹(shù)的節(jié)點(diǎn)覆蓋第一樹(shù)中對(duì)應(yīng)的節(jié)點(diǎn)。為獲取與第一樹(shù)的特定節(jié)點(diǎn)有關(guān)的信息,對(duì)應(yīng)節(jié)點(diǎn)在第二樹(shù)中被創(chuàng)建,這些節(jié)點(diǎn)沿著至所請(qǐng)求的特定節(jié)點(diǎn)的路徑覆蓋第一樹(shù)的對(duì)應(yīng)節(jié)點(diǎn)。第二樹(shù)從第一樹(shù)獲取信息,并將來(lái)自第一樹(shù)的信息返回給消費(fèi)者。除了創(chuàng)建第二樹(shù)中的節(jié)點(diǎn),從孩子到父親的指針在第二樹(shù)中也被創(chuàng)建。例如,假設(shè)樹(shù)40中節(jié)點(diǎn)48的內(nèi)容是期望的。再次參考圖le,根節(jié)點(diǎn),即覆蓋根節(jié)點(diǎn)46的根節(jié)點(diǎn)44被創(chuàng)建。根節(jié)點(diǎn)44指向根節(jié)點(diǎn)46。根節(jié)點(diǎn)46的子指針被訪問(wèn)以尋找根節(jié)點(diǎn)46的子節(jié)點(diǎn),即節(jié)點(diǎn)52。指向節(jié)點(diǎn)52的節(jié)點(diǎn)54在樹(shù)43中被創(chuàng)建。節(jié)點(diǎn)54中的字段包括指向節(jié)點(diǎn)52的指針,即指針56。指向節(jié)點(diǎn)54的父節(jié)點(diǎn)(根節(jié)點(diǎn)44)的指針也被創(chuàng)建(例如,指針50)。對(duì)于只讀第一樹(shù)中沿著至期望節(jié)點(diǎn)的路徑的所有節(jié)點(diǎn)都遵循這一過(guò)程。通常,當(dāng)對(duì)樹(shù)的操作正被執(zhí)行時(shí),只有一小部分的樹(shù)被遍歷。假設(shè)例如消費(fèi)者正尋找樹(shù)40中的特定節(jié)點(diǎn)。假設(shè)消費(fèi)者正尋找樹(shù)(如,樹(shù)40)中特定位置處的節(jié)點(diǎn)。假設(shè)該特定位置處的節(jié)點(diǎn)是節(jié)點(diǎn)48,該節(jié)點(diǎn)的內(nèi)容為“Math”。在這一示例中,針對(duì)在至內(nèi)容為“Math”的節(jié)點(diǎn)的路徑上的節(jié)點(diǎn)(即,節(jié)點(diǎn)62、節(jié)點(diǎn)64和節(jié)點(diǎn)66 )來(lái)創(chuàng)建節(jié)點(diǎn)。在樹(shù)43中創(chuàng)建對(duì)應(yīng)于節(jié)點(diǎn)62的節(jié)點(diǎn)68。在樹(shù)43中創(chuàng)建對(duì)應(yīng)于節(jié)點(diǎn)64的節(jié)點(diǎn)70。在樹(shù)43中創(chuàng)建對(duì)應(yīng)于節(jié)點(diǎn)66的節(jié)點(diǎn)72。不創(chuàng)建與第一樹(shù)中任何其他節(jié)點(diǎn)對(duì)應(yīng)的節(jié)點(diǎn)。根據(jù)本文所公開(kāi)的主題的其他方面,對(duì)于第一樹(shù)中其他路徑,沒(méi)有節(jié)點(diǎn)在第二樹(shù)中被創(chuàng)建。根據(jù)本文所公開(kāi)的主題的各方面,只讀樹(shù)潛在的任何部分可通過(guò)創(chuàng)建第二樹(shù)中的節(jié)點(diǎn)來(lái)訪問(wèn),但節(jié)點(diǎn)只在它們是沿著至期望節(jié)點(diǎn)的路徑的情況下才被創(chuàng)建,因此給予樹(shù)操作中的高效性同時(shí)維護(hù)可由多個(gè)消費(fèi)者共享的只讀樹(shù),而不犧牲數(shù)據(jù)完整性。另選地,兩個(gè)分開(kāi)的樹(shù)在開(kāi)始時(shí)被創(chuàng)建,且完整的處理成本在開(kāi)始時(shí)被評(píng)估。根據(jù)本文所公開(kāi)的主題的各方面,在消費(fèi)者完成了使用第二樹(shù)時(shí),可由垃圾收集或內(nèi)務(wù)管理進(jìn)程將第二樹(shù)從存儲(chǔ)器中清除。不再由任何剩余第一或第二樹(shù)節(jié)點(diǎn)引用的第一樹(shù)的子樹(shù)也可從存儲(chǔ)器中被清除。
類(lèi)似地,當(dāng)代替檢查只讀樹(shù)中的節(jié)點(diǎn)時(shí),消費(fèi)者希望修改只讀樹(shù)中的節(jié)點(diǎn),新樹(shù)被創(chuàng)建。上述過(guò)程是針對(duì)公共只讀樹(shù)來(lái)執(zhí)行的,除了新樹(shù)中對(duì)應(yīng)節(jié)點(diǎn)不指向與只讀樹(shù)中節(jié)點(diǎn)對(duì)應(yīng)的、消費(fèi)者想要改變的節(jié)點(diǎn)的內(nèi)容。同樣,新樹(shù)的節(jié)點(diǎn)的內(nèi)容被設(shè)置成新值。即,新樹(shù)的內(nèi)容字段可被設(shè)置成與只讀公共樹(shù)中對(duì)應(yīng)節(jié)點(diǎn)中對(duì)應(yīng)域的值不同的值。例如,如果消費(fèi)者想要將樹(shù)43中節(jié)點(diǎn)58的內(nèi)容從“Math”改變成“PI”,則節(jié)點(diǎn)58的指針不會(huì)被創(chuàng)建,且與節(jié)點(diǎn)58對(duì)應(yīng)的新樹(shù)的節(jié)點(diǎn)的內(nèi)容會(huì)被設(shè)置成“PI”??砂葱鑼⒏郊庸?jié)點(diǎn)添加至新樹(shù),如通常所知的。由于新樹(shù)由單個(gè)消費(fèi)者使用,因此新樹(shù)中每一節(jié)點(diǎn)都可用于追蹤消費(fèi)者專(zhuān)用信息,諸如節(jié)點(diǎn)在特定文件或文檔中的絕對(duì)位置。例如,給定包括文本的文檔,該文檔中的每一單詞可存在于文本緩沖區(qū)內(nèi)與該文檔的版本相關(guān)聯(lián)的特定位置。單詞“Math”可以位于例如該文檔的文本緩沖區(qū)中的位置20。在新樹(shù)中與樹(shù)43中節(jié)點(diǎn)58相對(duì)應(yīng)的節(jié)點(diǎn)可包括絕對(duì)位置20,因?yàn)樾聵?shù)不可由另一消費(fèi)者重復(fù)使用。相反,對(duì)于只讀公共樹(shù)(如,樹(shù)43)中的節(jié)點(diǎn),由于每一消費(fèi)者的文本緩沖區(qū)很可能在不同位置處開(kāi)始,因此只讀公共樹(shù)中的節(jié)點(diǎn)包含相對(duì)位置信息,諸如節(jié)點(diǎn)的寬度或節(jié)點(diǎn)中的字符數(shù)。新樹(shù)可將至特定節(jié)點(diǎn)的路徑中的各節(jié)點(diǎn)的寬度求和,并且將該總和添加到文本緩沖區(qū)的開(kāi)始位置,以便確定節(jié)點(diǎn)在文檔中的絕對(duì)位置。圖2a是根據(jù)此處所公開(kāi)的主題的各方面的用于帶有增量改變的高效不可變句法表示的方法200的示例。根據(jù)此處所公開(kāi)的主題的某些方面,在202處,獲取、生成或接收只讀私人樹(shù)??赏ㄟ^(guò)創(chuàng)建公共樹(shù)的新根(其中公共樹(shù)的新根覆蓋私人樹(shù)的根節(jié)點(diǎn)并控制對(duì)私人樹(shù)的訪問(wèn))來(lái)使得私人樹(shù)對(duì)消費(fèi)者不可訪問(wèn)。現(xiàn)在參考圖2b,新的根節(jié)點(diǎn)(例如,新節(jié)點(diǎn)276)可包括以下字段中的一個(gè)或多個(gè)指向私人樹(shù)的根節(jié)點(diǎn)的指針270、以及指向子節(jié)點(diǎn)的一個(gè)或多個(gè)指針,如圖2b中指向子字段(child field)的指針272、274等所示。在204處,接收來(lái)自消費(fèi)者對(duì)訪問(wèn)或修改樹(shù)中節(jié)點(diǎn)的請(qǐng)求。響應(yīng)于此,向消費(fèi)者提供對(duì)表示公共樹(shù)的根節(jié)點(diǎn)的訪問(wèn),該公共樹(shù)控制對(duì)私人樹(shù)的訪問(wèn)。在206處,響應(yīng)于接收到該請(qǐng)求,公共樹(shù)中的附加節(jié)點(diǎn)可通過(guò)跟隨私人樹(shù)中的指針以便從私人樹(shù)中的路徑遍歷至所需節(jié)點(diǎn)來(lái)創(chuàng)建。只要到達(dá)私人樹(shù)中的下一節(jié)點(diǎn),就在公共樹(shù)中創(chuàng)建對(duì)應(yīng)節(jié)點(diǎn)。在208處,生成公共樹(shù)中的指針。例如,從所創(chuàng)建的或所生成的節(jié)點(diǎn)創(chuàng)建指針,該指針指向所生成的節(jié)點(diǎn)的父節(jié)點(diǎn)。非根節(jié)點(diǎn)結(jié)構(gòu)的示例在圖2c中示出。第二樹(shù)中的節(jié)點(diǎn)290可包括指向私人樹(shù)的對(duì)應(yīng)節(jié)點(diǎn)的指針的字段278、存儲(chǔ)內(nèi)容的一個(gè)或多個(gè)字段(字段280、282等)、從節(jié)點(diǎn)290指向其在公共樹(shù)中的父節(jié)點(diǎn)的指針284、以及指向公共樹(shù)中節(jié)點(diǎn)290的子節(jié)點(diǎn)的一個(gè)或多個(gè)指針(字段286、288等)。針對(duì)私人樹(shù)中的路徑中的每一節(jié)點(diǎn),在公共樹(shù)中創(chuàng)建各節(jié)點(diǎn),直到達(dá)到私人樹(shù)中的所需節(jié)點(diǎn)。如果消費(fèi)者請(qǐng)求是訪問(wèn)請(qǐng)求,則當(dāng)消費(fèi)者完成公共樹(shù)時(shí),它使用的空間可在210處由垃圾收集回收。消費(fèi)者可請(qǐng)求對(duì)公共樹(shù)進(jìn)行改變。在212處,這樣的請(qǐng)求導(dǎo)致要產(chǎn)生新的公共樹(shù)并且導(dǎo)致要產(chǎn)生新的消費(fèi)者不可訪問(wèn)的私人樹(shù)。新的不可訪問(wèn)的樹(shù)可與先前的私人樹(shù)共享節(jié)點(diǎn)。即,如果消費(fèi)者請(qǐng)求是創(chuàng)建包括對(duì)現(xiàn)有樹(shù)的修改的新樹(shù),則該新樹(shù)可重復(fù)使用原始私人樹(shù)的子樹(shù)。如果消費(fèi)者創(chuàng)建了這樣的樹(shù),則新創(chuàng)建的樹(shù)不可被共享。消費(fèi)者主動(dòng)地從舊的子樹(shù)與新片段的結(jié)合中創(chuàng)建新樹(shù),從而將新樹(shù)中對(duì)應(yīng)節(jié)點(diǎn)的內(nèi)容設(shè)置成新值。對(duì)于被添加到在只讀公共樹(shù)中不存在對(duì)應(yīng)節(jié)點(diǎn)的新樹(shù)的子樹(shù),可按需將附加節(jié)點(diǎn)添加、到新樹(shù)。在這一情況下,指向只讀樹(shù)的對(duì)應(yīng)節(jié)點(diǎn)的指針(字段278)被設(shè)置成空。另選地,第二非根節(jié)點(diǎn)類(lèi)型可能不具有指向只讀樹(shù)字段278的對(duì)應(yīng)節(jié)點(diǎn)的指針的字段,如圖2d的節(jié)點(diǎn)292所示。如果消費(fèi)者想要修改新樹(shù),則包含指向新樹(shù)的根節(jié)點(diǎn)的只讀根節(jié)點(diǎn)的另一樹(shù)可被創(chuàng)建。另選地,在例如消費(fèi)者請(qǐng)求訪問(wèn)或修改新樹(shù)中的節(jié)點(diǎn)的情況下,可構(gòu)建整個(gè)新樹(shù)的只讀副本、版本或快照。只讀樹(shù)的根節(jié)點(diǎn)可被覆蓋,從而使得通過(guò)創(chuàng)建指向第三樹(shù)的根節(jié)點(diǎn)的指針的第四可修改樹(shù),依次類(lèi)推。合適計(jì)算環(huán)境的示例為了提供有關(guān)本文所公開(kāi)的主題的各個(gè)方面的上下文,圖3以及以下討論旨在提供其中可以實(shí)現(xiàn)各實(shí)施例的合適計(jì)算環(huán)境510的簡(jiǎn)要概括描述。盡管本文所公開(kāi)的主題是在諸如程序模塊等由一個(gè)或多個(gè)計(jì)算機(jī)或其它計(jì)算設(shè)備執(zhí)行的計(jì)算機(jī)可執(zhí)行指令的通用上下文中描述的,但本領(lǐng)域技術(shù)人員將認(rèn)識(shí)到,本文所公開(kāi)的主題的各部分還能夠結(jié)合其它程序模塊和/或硬件和軟件的組合來(lái)實(shí)現(xiàn)。通常,程序模塊包括執(zhí)行特定任務(wù)或?qū)崿F(xiàn)特定數(shù)據(jù)類(lèi)型的例程、程序、對(duì)象、物理人為產(chǎn)物、數(shù)據(jù)結(jié)構(gòu)等。通常,程序模塊的功能可在各 個(gè)實(shí)施例中按需進(jìn)行組合或分布。計(jì)算環(huán)境510只是合適的操作環(huán)境的一個(gè)示例,并且不旨在對(duì)此處所公開(kāi)的主題的使用范圍或功能提出任何限制。參考圖3,描述了計(jì)算機(jī)512形式的用于軟件開(kāi)發(fā)計(jì)算設(shè)備。計(jì)算機(jī)512可包括處理單元514、系統(tǒng)存儲(chǔ)器516和系統(tǒng)總線518。處理單元514可以是各種可用處理器中的任何一種。也可以使用雙微處理器及其他多處理器體系結(jié)構(gòu)作為處理單元514。系統(tǒng)存儲(chǔ)器516可包括易失性存儲(chǔ)器520和非易失性存儲(chǔ)器522。非易失性存儲(chǔ)器522可包括只讀存儲(chǔ)器(ROM)、可編程ROM (PR0M)、電可編程ROM (EPROM)或閃存。易失性存儲(chǔ)器520可包括可充當(dāng)外高速緩沖存儲(chǔ)器的隨機(jī)存取存儲(chǔ)器(RAM)。系統(tǒng)總線518將包括系統(tǒng)存儲(chǔ)器516的系統(tǒng)物理人為產(chǎn)物耦合到處理單元514。系統(tǒng)總線518可以是幾種類(lèi)型的總線結(jié)構(gòu)中的任何一種,包括存儲(chǔ)器總線、存儲(chǔ)控制器、外圍總線、外總線或局部總線,并且可以使用各種可用總線體系結(jié)構(gòu)中的任一種。計(jì)算機(jī)512通常包括各種計(jì)算機(jī)可讀介質(zhì),諸如易失性和非易失性介質(zhì)、可移動(dòng)和不可移動(dòng)介質(zhì)。計(jì)算機(jī)存儲(chǔ)介質(zhì)可以通過(guò)用于存儲(chǔ)諸如計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或其它數(shù)據(jù)等信息的任何方法或技術(shù)來(lái)實(shí)現(xiàn)。計(jì)算機(jī)存儲(chǔ)介質(zhì)包括但不限于,RAM、ROM、EEPR0M、閃存或其它存儲(chǔ)器技術(shù)、⑶ROM、數(shù)字多功能盤(pán)(DVD)或其它光盤(pán)存儲(chǔ)、磁盒、磁帶、磁盤(pán)存儲(chǔ)或其它磁存儲(chǔ)設(shè)備、或可以用來(lái)儲(chǔ)存所期望的信息并可由計(jì)算機(jī)512訪問(wèn)的任何其他非瞬態(tài)介質(zhì)。將理解,圖3描述了可充當(dāng)用戶(hù)與計(jì)算機(jī)資源之間的媒介的軟件。該軟件可以包括可存儲(chǔ)在盤(pán)存儲(chǔ)524上的操作系統(tǒng)528,該操作系統(tǒng)可控制并分配計(jì)算機(jī)系統(tǒng)512的資源。盤(pán)存儲(chǔ)524可以是通過(guò)諸如接口 526的不可移動(dòng)存儲(chǔ)器接口連接到系統(tǒng)總線518的硬盤(pán)驅(qū)動(dòng)器。系統(tǒng)應(yīng)用程序530利用由操作系統(tǒng)528通過(guò)存儲(chǔ)在系統(tǒng)存儲(chǔ)器516或者存儲(chǔ)在盤(pán)存儲(chǔ)524上的程序模塊532和程序數(shù)據(jù)534對(duì)資源的管理??梢岳斫猓?jì)算機(jī)可用各種操作系統(tǒng)或操作系統(tǒng)的組合來(lái)實(shí)現(xiàn)。用戶(hù)可通過(guò)輸入設(shè)備536向計(jì)算機(jī)512輸入命令或信息。輸入設(shè)備536包括但不限于定點(diǎn)設(shè)備,諸如鼠標(biāo)、跟蹤球、指示筆、觸摸墊、鍵盤(pán)、話(huà)筒等。這些及其他輸入設(shè)備通過(guò)系統(tǒng)總線518經(jīng)由接口端口 538連接到處理單元514。接口端口 538可表示串行端口、并行端口、通用串行總線(USB)等。輸出設(shè)備540可與輸入設(shè)備使用相同類(lèi)型的端口。提供輸出適配器542以舉例說(shuō)明存在像監(jiān)視器、揚(yáng)聲器、以及打印機(jī)的需要特定適配器的一些輸出設(shè)備540。輸出適配器542包括但不限于,在輸出設(shè)備540和系統(tǒng)總線518之間提供連接的視頻卡和聲卡。其他設(shè)備和/或設(shè)備系統(tǒng),諸如遠(yuǎn)程計(jì)算機(jī)544,可提供輸入和輸出兩種能力。計(jì)算機(jī)512可以使用到諸如遠(yuǎn)程計(jì)算機(jī)544之類(lèi)的一個(gè)或多個(gè)遠(yuǎn)程計(jì)算機(jī)的邏輯連接來(lái)在聯(lián)網(wǎng)環(huán)境中操作。遠(yuǎn)程計(jì)算機(jī)544可以是個(gè)人計(jì)算機(jī)、服務(wù)器、路由器、網(wǎng)絡(luò)PC、對(duì)等設(shè)備或其它常見(jiàn)的網(wǎng)絡(luò)節(jié)點(diǎn),并且通常包括許多或所有以上相對(duì)于計(jì)算機(jī)512所描述的元件,盡管在圖4中僅示出了存儲(chǔ)器存儲(chǔ)設(shè)備546。遠(yuǎn)程計(jì)算機(jī)544可經(jīng)由通信連接550邏輯地連接。網(wǎng)絡(luò)接口 548涵蓋諸如局域網(wǎng)(LAN)和廣域網(wǎng)(WAN)這樣的通信網(wǎng)絡(luò),但也可包括其他網(wǎng)絡(luò)。通信連接550是指用來(lái)將網(wǎng)絡(luò)接口 548連接到總線518的硬件/軟件。連接550可以在計(jì)算機(jī)512內(nèi)或外并且包括諸如調(diào)制解調(diào)器(電話(huà)、電纜、DSL和無(wú)線)和ISDN 適配器、以太網(wǎng)卡等內(nèi)和外技術(shù)??梢岳斫?,所示網(wǎng)絡(luò)連接僅是示例,并且可以使用在計(jì)算機(jī)之間建立通信鏈路的其它手段。本領(lǐng)域的普通技術(shù)人員可以理解,計(jì)算機(jī)512或其它客戶(hù)機(jī)設(shè)備可作為計(jì)算機(jī)網(wǎng)絡(luò)的一部分來(lái)部署。在這一點(diǎn)上,本文所公開(kāi)的主題涉及具有任意數(shù)量的存儲(chǔ)器或存儲(chǔ)單元以及在任意數(shù)量的存儲(chǔ)單元或卷上發(fā)生的任意數(shù)量的應(yīng)用程序和進(jìn)程的任何計(jì)算機(jī)系統(tǒng)。本文所公開(kāi)的主題的各方面可應(yīng)用于具有部署在網(wǎng)絡(luò)環(huán)境中的具有遠(yuǎn)程或本地存儲(chǔ)的服務(wù)器計(jì)算機(jī)和客戶(hù)計(jì)算機(jī)的環(huán)境。本文所公開(kāi)的主題的各方面也可應(yīng)用于具有編程語(yǔ)言功能、解釋和執(zhí)行能力的獨(dú)立計(jì)算設(shè)備。圖4示出集成開(kāi)發(fā)環(huán)境(IDE)600和通用語(yǔ)言運(yùn)行時(shí)環(huán)境602。IDE 600可允許用戶(hù)(例如,開(kāi)發(fā)者、程序員、設(shè)計(jì)者、編碼者等)在計(jì)算機(jī)系統(tǒng)中設(shè)計(jì)、編碼、編譯、測(cè)試、運(yùn)行、編輯、調(diào)試或構(gòu)建程序、程序集、網(wǎng)站、web應(yīng)用和web服務(wù)。軟件程序可以包括在一個(gè)或多個(gè)源代碼語(yǔ)言(例如,Visual Basic、Visual J#、C++、C#、J#、Java Script、APL、COBOL、Pascal、Eiffel、Haskell、ML、Oberon、Perl> Python> Scheme、Smalltalk 等等)中創(chuàng)建的源代碼(組件610)。IDE 600可提供本機(jī)代碼開(kāi)發(fā)環(huán)境,或者可提供在虛擬機(jī)上運(yùn)行的托管代碼開(kāi)發(fā),或者可提供其組合。IDE 600可提供使用.NET框架的托管代碼開(kāi)發(fā)環(huán)境。可使用語(yǔ)言專(zhuān)用源編譯器620從源代碼組件610和本機(jī)代碼組件611創(chuàng)建中間語(yǔ)言組件650,并且在執(zhí)行應(yīng)用時(shí)使用中間語(yǔ)言編譯器660 (例如,即時(shí)(JIT)編譯器)從中間語(yǔ)言組件650創(chuàng)建本機(jī)代碼組件611 (例如,機(jī)器可執(zhí)行指令)。即,當(dāng)IL應(yīng)用被執(zhí)行時(shí),其在被執(zhí)行的同時(shí)被編譯成適合正在其上執(zhí)行它的平臺(tái)的合適機(jī)器語(yǔ)言,藉此使代碼能跨若干平臺(tái)便攜。替代地,在其他實(shí)施例中,程序可被編譯成適合其目標(biāo)平臺(tái)的本機(jī)代碼機(jī)器語(yǔ)言(未示出)。用戶(hù)可根據(jù)已知軟件編程技術(shù)以及與特定源語(yǔ)言相關(guān)聯(lián)的特定邏輯和句法規(guī)則經(jīng)由IDE 600中的用戶(hù)接口 640和源代碼編輯器651來(lái)創(chuàng)建和/或編輯源代碼組件。此后,源代碼組件610可經(jīng)由源編譯器620被編譯,藉此可創(chuàng)建該程序的中間語(yǔ)言表示,諸如匯編630。匯編630可包括中間語(yǔ)言組件650和元數(shù)據(jù)642。應(yīng)用設(shè)計(jì)可以能夠在部署前被驗(yàn)證。本文所述的各種技術(shù)可結(jié)合硬件或軟件,或在適當(dāng)時(shí)以其組合來(lái)實(shí)現(xiàn)。由此,本文所公開(kāi)的方法和裝置或其特定方面或部分可采取包含在諸如軟盤(pán)、CD-ROM、硬盤(pán)驅(qū)動(dòng)器或任何其它機(jī)器可讀存儲(chǔ)介質(zhì)等有形介質(zhì)中的程序代碼(即,指令)的形式,其中當(dāng)程序代碼被加載到諸如計(jì)算機(jī)等機(jī)器內(nèi)并由其執(zhí)行時(shí),該機(jī)器成為用于實(shí)現(xiàn)本文所公開(kāi)的主題的各方面的裝置。在程序代碼在可編程計(jì)算機(jī)上執(zhí)行的情況下,計(jì)算設(shè)備通常將包括處理器、該處理器可讀的存儲(chǔ)介質(zhì)(包括易失性和非易失性的存儲(chǔ)器和/或存儲(chǔ)元件)、至少一個(gè)輸入設(shè)備、以及至少一個(gè)輸出設(shè)備??衫缤ㄟ^(guò)使用數(shù)據(jù)處理API等來(lái)利用域?qū)S镁幊棠P透鞣矫娴膭?chuàng)建和/或?qū)崿F(xiàn)的一個(gè)或多個(gè)程序可用高級(jí)過(guò)程編程語(yǔ)言或面向?qū)ο蟮木幊陶Z(yǔ)言 來(lái)實(shí)現(xiàn)以與計(jì)算機(jī)系統(tǒng)通信。然而,如果需要,該程序可以用匯編語(yǔ)言或機(jī)器語(yǔ)言來(lái)實(shí)現(xiàn)。在任何情形中,語(yǔ)言可以是編譯語(yǔ)言或解釋語(yǔ)言,且與硬件實(shí)現(xiàn)相結(jié)合。雖然已結(jié)合附圖描述了本文所公開(kāi)的主題,但是應(yīng)理解,可作出修改以按不同方式執(zhí)行相同功能。
權(quán)利要求
1.一種系統(tǒng),包括 處理器和存儲(chǔ)器,所述存儲(chǔ)器包括一模塊,其被配置成使所述處理器執(zhí)行 創(chuàng)建至少ー個(gè)消費(fèi)者可訪問(wèn)的數(shù)據(jù)結(jié)構(gòu),所述數(shù)據(jù)結(jié)構(gòu)表示樹(shù),其中所述數(shù)據(jù)結(jié)構(gòu)包括 可重復(fù)使用的第一樹(shù),該第一樹(shù)表示所述至少一個(gè)消費(fèi)者不可直接訪問(wèn)的共享的只讀樹(shù)的,其中所述只讀樹(shù)中的節(jié)點(diǎn)具有單向指針,使得第一樹(shù)的所述節(jié)點(diǎn)不具有指向父節(jié)點(diǎn)的指針;以及 所述至少一個(gè)消費(fèi)者可訪問(wèn)的第二樹(shù),該第二樹(shù)包括控制所述至少ー個(gè)消費(fèi)者對(duì)第一樹(shù)的訪問(wèn)的至少ー個(gè)根節(jié)點(diǎn),其中第二樹(shù)的根節(jié)點(diǎn)包括指向第一樹(shù)的根節(jié)點(diǎn)的指針。
2.如權(quán)利要求I所述的系統(tǒng),其特征在于,第二樹(shù)是通過(guò)為第一樹(shù)中位于至第一樹(shù)中所請(qǐng)求的節(jié)點(diǎn)的路徑上的每ー節(jié)點(diǎn)在第二樹(shù)中生成節(jié)點(diǎn)而按需構(gòu)建的,其中所生成的節(jié)點(diǎn)與第一樹(shù)中位于至所請(qǐng)求的節(jié)點(diǎn)的路徑上的下ー節(jié)點(diǎn)相對(duì)應(yīng),所生成的節(jié)點(diǎn)包括指向第一樹(shù)的對(duì)應(yīng)節(jié)點(diǎn)的指針、以及指向在第二樹(shù)中所生成的節(jié)點(diǎn)的父節(jié)點(diǎn)的指針。
3.如權(quán)利要求I所述的系統(tǒng),其特征在于,第一樹(shù)是保留相對(duì)信息的私人樹(shù),而第ニ樹(shù)是保留消費(fèi)者專(zhuān)用信息的公共樹(shù)。
4.如權(quán)利要求I所述的系統(tǒng),其特征在于,所述樹(shù)是包括解析樹(shù)、句法樹(shù)、語(yǔ)義樹(shù)或綁定樹(shù)在內(nèi)的編譯器生成的樹(shù)。
5.如權(quán)利要求3所述的系統(tǒng),其特征在干,響應(yīng)于接收來(lái)自所述至少一個(gè)消費(fèi)者的對(duì)經(jīng)修改的樹(shù)的請(qǐng)求,新的公共樹(shù)被產(chǎn)生且新的私人樹(shù)被產(chǎn)生,其中所述新的私人樹(shù)重復(fù)使用第一樹(shù)的至少ー個(gè)子樹(shù)。
6.ー種方法,包括 在軟件開(kāi)發(fā)計(jì)算機(jī)的IDE中,生成消費(fèi)者可訪問(wèn)的數(shù)據(jù)結(jié)構(gòu),所述數(shù)據(jù)結(jié)構(gòu)表示 第一只讀私人單向指向樹(shù),其中第一樹(shù)中的至少ー個(gè)節(jié)點(diǎn)包括至少ー個(gè)單向指針,所述至少ー個(gè)單向指針包括從第一樹(shù)的父節(jié)點(diǎn)指向第一樹(shù)的子節(jié)點(diǎn)的指針;以及 第二消費(fèi)者可訪問(wèn)樹(shù),其中第二樹(shù)的節(jié)點(diǎn)包括雙向指針,所述雙向指針包括從第ニ樹(shù)的所述節(jié)點(diǎn)指向其在第二樹(shù)中的子節(jié)點(diǎn)(208)的指針、以及從第二樹(shù)中所述節(jié)點(diǎn)指向其在第二樹(shù)中的父節(jié)點(diǎn)的指針,且其中第二樹(shù)的所述節(jié)點(diǎn)包括從第二樹(shù)中所述節(jié)點(diǎn)指向第一樹(shù)中對(duì)應(yīng)節(jié)點(diǎn)的指針,其中第二樹(shù)的各節(jié)點(diǎn)是響應(yīng)于來(lái)自消費(fèi)者的對(duì)訪問(wèn)第一樹(shù)中的節(jié)點(diǎn)的請(qǐng)求來(lái)按需創(chuàng)建的,且其中第二樹(shù)控制對(duì)第一樹(shù)的訪問(wèn)。
7.如權(quán)利要求6所述的方法,其特征在于,還包括 響應(yīng)于接收對(duì)表示經(jīng)修改的第一樹(shù)的樹(shù)的請(qǐng)求,創(chuàng)建新的公共樹(shù)和新的私人樹(shù),其中所述新的私人樹(shù)表示與所述第一私人樹(shù)在至少ー個(gè)節(jié)點(diǎn)有區(qū)別的樹(shù),且其中所述新的公共樹(shù)表示與第二消費(fèi)者可訪問(wèn)樹(shù)在至少ー個(gè)節(jié)點(diǎn)有區(qū)別的樹(shù),其中所述第一樹(shù)的至少ー個(gè)子樹(shù)在所述新的私人樹(shù)中被重復(fù)使用。
8.如權(quán)利要求6所述的方法,其特征在于,還包括 在所述消費(fèi)者已完成使用第二樹(shù)時(shí),對(duì)第二樹(shù)進(jìn)行垃圾收集。
9.如權(quán)利要求6所述的方法,其特征在干, 其中,第一樹(shù)和第二樹(shù)包括句法樹(shù)、語(yǔ)義樹(shù)、解析樹(shù)或綁定樹(shù)。
10.如權(quán)利要求6所述的方法,其特征在干,還包括其中,第一樹(shù)是私人樹(shù)而第二樹(shù)是公共樹(shù)。
11.ー種包括當(dāng)執(zhí)行時(shí)使至少ー個(gè)處理器執(zhí)行下列操作的計(jì)算機(jī)可執(zhí)行指令的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì) 創(chuàng)建表示樹(shù)的數(shù)據(jù)結(jié)構(gòu),其中所述數(shù)據(jù)結(jié)構(gòu)包括 消費(fèi)者不可訪問(wèn)的第一只讀、可重復(fù)使用的樹(shù),該第一樹(shù)具有單向指針,使得第一樹(shù)中的父節(jié)點(diǎn)包括指向所述父節(jié)點(diǎn)的子節(jié)點(diǎn)的指針,且所述父節(jié)點(diǎn)不包括指向第一樹(shù)中所述父節(jié)點(diǎn)的父節(jié)點(diǎn)的指針;以及 所述消費(fèi)者可訪問(wèn)的、不可重復(fù)使用的第二樹(shù),該第二樹(shù)具有雙向指針,使得第二樹(shù)中的父節(jié)點(diǎn)包括指向所述父節(jié)點(diǎn)的子節(jié)點(diǎn)的指針,且所述父節(jié)點(diǎn)包括指向第二樹(shù)中所述父節(jié)點(diǎn)的父節(jié)點(diǎn)的指針,其中第二樹(shù)控制所述消費(fèi)者對(duì)第一樹(shù)的訪問(wèn)。
12.如權(quán)利要求11所述的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其特征在干,進(jìn)ー步包括當(dāng)執(zhí)行時(shí)使所述至少一個(gè)處理器執(zhí)行下列操作的計(jì)算機(jī)可執(zhí)行指令 創(chuàng)建所述數(shù)據(jù)結(jié)構(gòu),其中第二樹(shù)是響應(yīng)于所述消費(fèi)者對(duì)訪問(wèn)第一樹(shù)中節(jié)點(diǎn)的請(qǐng)求來(lái)按需創(chuàng)建的。
13.如權(quán)利要求11所述的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其特征在干,進(jìn)ー步包括當(dāng)執(zhí)行時(shí)使所述至少一個(gè)處理器執(zhí)行下列操作的計(jì)算機(jī)可執(zhí)行指令 創(chuàng)建所述數(shù)據(jù)結(jié)構(gòu),其中第一樹(shù)包括相對(duì)內(nèi)容而第ニ樹(shù)包括消費(fèi)者專(zhuān)用內(nèi)容。
14.如權(quán)利要求12所述的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其特征在干,進(jìn)ー步包括當(dāng)執(zhí)行時(shí)使所述至少一個(gè)處理器執(zhí)行下列操作的計(jì)算機(jī)可執(zhí)行指令 通過(guò)為第一樹(shù)中位于至所請(qǐng)求的節(jié)點(diǎn)的路徑上的每ー節(jié)點(diǎn)在第二樹(shù)中生成節(jié)點(diǎn)而按需生成第二樹(shù),其中該所生成的節(jié)點(diǎn)與第一樹(shù)中位于至所請(qǐng)求的節(jié)點(diǎn)的路徑上的下ー節(jié)點(diǎn)相對(duì)應(yīng),第二樹(shù)中該所生成節(jié)點(diǎn)包括指向第一樹(shù)的對(duì)應(yīng)節(jié)點(diǎn)的指針。
15.如權(quán)利要求11所述的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其特征在干,進(jìn)ー步包括當(dāng)執(zhí)行時(shí)使所述至少一個(gè)處理器執(zhí)行下列操作的計(jì)算機(jī)可執(zhí)行指令 響應(yīng)于接收來(lái)自所述消費(fèi)者對(duì)訪問(wèn)第二樹(shù)中節(jié)點(diǎn)的請(qǐng)求,創(chuàng)建第三樹(shù),該第三樹(shù)包括第二樹(shù)的只讀、可重復(fù)使用版本,該第三樹(shù)具有從第三樹(shù)中父節(jié)點(diǎn)指向第三樹(shù)中所述父節(jié)點(diǎn)的子節(jié)點(diǎn)的單向指針,并且該第三樹(shù)創(chuàng)建控制所述消費(fèi)者對(duì)該第三樹(shù)的訪問(wèn)的第四樹(shù),其中該第四樹(shù)包括所述消費(fèi)者可訪問(wèn)的不可重復(fù)使用的樹(shù),該第四樹(shù)具有雙向指針,所述雙向指針包括從該第四樹(shù)中父節(jié)點(diǎn)指向該第四樹(shù)中所述父節(jié)點(diǎn)的子節(jié)點(diǎn)的指針、以及從該第四樹(shù)中子節(jié)點(diǎn)指向該第四樹(shù)中孩子的父節(jié)點(diǎn)的指針、以及從第四樹(shù)中各節(jié)點(diǎn)指向該第三樹(shù)中對(duì)應(yīng)節(jié)點(diǎn)的指針。
全文摘要
通過(guò)創(chuàng)建數(shù)據(jù)結(jié)構(gòu)來(lái)啟用在增量改變下帶有父指針的高效不可變句法表示,該數(shù)據(jù)結(jié)構(gòu)包括至少一個(gè)允許在樹(shù)中進(jìn)行向上和向下引用兩者的樹(shù)結(jié)構(gòu)、以及不可變的(只讀)且允許其自身的部分在其他數(shù)據(jù)結(jié)構(gòu)中被重復(fù)使用的樹(shù)結(jié)構(gòu)。所描述的數(shù)據(jù)結(jié)構(gòu)使得工具能夠搜索并將特定的子樹(shù)定位目標(biāo)。該樹(shù)的表示被定為目標(biāo)的子樹(shù)的片段在使用時(shí)被產(chǎn)生。樹(shù)的其余部分不被產(chǎn)生。只讀樹(shù)保留相對(duì)信息,從而使其可被重新組裝和共享。
文檔編號(hào)G06F17/00GK102696026SQ201080060863
公開(kāi)日2012年9月26日 申請(qǐng)日期2010年12月31日 優(yōu)先權(quán)日2010年1月7日
發(fā)明者A·V·青高茲, A·Y·阿哈羅尼, D·N·舒艾奇, J·帕森斯, K·皮爾希-比森, M·J·沃倫, M·托格森, N·M·加夫特, P·戈?duì)柕? R·帕凱, 劉凱玲 申請(qǐng)人:微軟公司