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