(57)【要約】少なくとも１つの木構造を含むデータ構造を生成することにより、漸進的変化のもとで親ポインタを伴う効率的な不変構文表現を可能とする。当該木構造は、不変（読取専用）である木および木構造において上方参照および下方参照の両方を可能とし、その一部を他のデータ構造で再利用できるようにする。当該データ構造により、ツールが特定の部分木を検索し対象とすることが可能となる。対象の部分木を表す木の断片を、使用時に生成する。当該木の残りは生成されない。読取専用の木は相対的な情報を保持し、これにより、当該読取専用の木を再構築し共有することができる。
2013516701.tif 000002
【特許請求の範囲】
【請求項１】
プロセッサと、
モジュールを含むメモリであって、前記モジュールは、前記プロセッサに、少なくとも１つのコンシューマがアクセス可能な、木を表すデータ構造を生成させるように構成され、前記データ構造は、
前記少なくとも１つのコンシューマが直接にはアクセスできない共有の読取専用の木を表す再利用可能な第１の木であって、前記読取専用の木のノードは単方向のポインタを有し、前記第１の木の前記ノードは親ノードへのポインタを有さない、第１の木と、
前記少なくとも１つのコンシューマの前記第１の木へのアクセスを制御する少なくとも１つの根ノードを含む、前記少なくとも１つのコンシューマがアクセス可能な第２の木であって、前記第２の木の前記根ノードは前記第１の木の根ノードへのポインタを含む、第２の木と
を含む、メモリと
を備えたことを特徴とするシステム。
【請求項２】
前記第１の木の要求されたノードへの経路上にある前記第１の木のノードごとに前記第２の木にノードを生成することにより、前記第２の木を要求に応じて構築し、前記生成されたノードは、前記要求されたノードへの前記経路上にある前記第１の木における次のノードに対応し、前記生成されたノードは、前記第１の木の対応する前記ノードへのポインタ、および前記第２の木の前記生成されたノードの親ノードへのポインタを含むことを特徴とする請求項１に記載のシステム。
【請求項３】
前記第１の木は、相対的な情報を保持する秘密木であり、前記第２の木は、コンシューマ固有の情報を保持する公開木であることを特徴とする請求項１に記載のシステム。
【請求項４】
前記木は、解析木、構文木、意味木、または束縛木を含むコンパイラ生成型の木であることを特徴とする請求項１に記載のシステム。
【請求項５】
前記少なくとも１つのコンシューマから変更した木の要求を受信したことに応答して、新たな公開木および新たな秘密木を生成し、前記新たな秘密木は、前記第１の木の少なくとも１つの部分木を再利用することを特徴とする請求項３に記載のシステム。
【請求項６】
ソフトウェア開発コンピュータのＩＤＥにおいて、コンシューマがアクセス可能なデータ構造を生成するステップであって、前記データ構造は、
読取専用で秘密の、単方向をポイントする第１の木であって、前記第１の木における少なくとも１つのノードは、前記第１の木の親ノードから前記第１の木の子ノードへのポインタを含む少なくとも１つの単方向ポインタを含む、第１の木と、
コンシューマがアクセス可能な第２の木であって、前記第２の木のノードは、前記第２の木の前記ノードから前記第２の木の前記ノードの子ノードへのポインタ、および前記第２の木の前記ノードから前記第２の木の前記ノードの親ノードへのポインタを含み、前記第２の木の前記ノードは、前記第２の木の前記ノードから前記第１の木における対応するノードへのポインタを含み、前記第２の木のノードを、前記第１の木のノードへのアクセス要求をコンシューマから受信したことに応答して、要求に応じて生成し、前記第２の木は前記第１の木へのアクセスを制御する、第２の木と
を表す、生成するステップを備えたことを特徴とする方法。
【請求項７】
変更した第１の木を表す木の要求を受信したことに応答して、新たな公開木および新たな秘密木を生成するステップをさらに備え、前記新たな秘密木は、前記第１の秘密木と少なくとも１つのノードにおいて異なる木を表し、前記新たな公開木は、少なくとも１つのノードにおいて前記コンシューマがアクセス可能な第２の木と異なる木を表し、前記第１の木の少なくとも１つの部分木を、前記新たな秘密木においで再利用することを特徴とする請求項６に記載の方法。
【請求項８】
前記コンシューマは、前記第２の木を用いて処理を終了したときに、前記第２の木をガベージ・コレクションするステップをさらに備えたことを特徴とする請求項６に記載の方法。
【請求項９】
前記第１の木および前記第２の木は、構文木、意味木、解析木、または束縛木を含むことを特徴とする請求項６に記載の方法。
【請求項１０】
前記第１の木は秘密木であり、前記第２の木は公開木であることを特徴とする請求項６に記載の方法。
【請求項１１】
実行時に少なくとも１つのプロセッサに木を表すデータ構造を生成させるコンピュータ実行可能命令を備えたコンピュータ可読記憶媒体であって、前記データ構造は、
コンシューマがアクセスできない読取専用で再利用可能な第１の木であって、前記第１の木は単方向のポインタを有し、前記第１の木の親ノードは、前記親ノードの子ノードへのポインタを含み、前記親ノードは、前記第１の木の前記親ノードの親ノードへのポインタを含まない、第１の木と、
前記コンシューマがアクセス可能である再利用不能な第２の木であって、前記第２の木は双方向のポインタを有し、前記第２の木の親ノードは前記親ノードの子ノードへのポインタを含み、前記親ノードは前記第２の木の前記親ノードの親ノードへのポインタを含み、前記第２の木は前記第１の木へのコンシューマのアクセスを制御する、第２の木と
を含むことを特徴とするコンピュータ可読記憶媒体。
【請求項１２】
実行時に前記少なくとも１つのプロセッサに前記データ構造を生成させるコンピュータ実行可能命令をさらに備え、前記第２の木を、前記第１の木のノードへの前記コンシューマのアクセス要求に応答して、要求に応じて生成することを特徴とする請求項１１に記載のコンピュータ可読記憶媒体。
【請求項１３】
実行時に前記少なくとも１つのプロセッサに前記データ構造を生成させるコンピュータ実行可能命令をさらに備え、前記第１の木は相対的な内容を含み、前記第２の木はコンシューマ固有の内容を含むことを特徴とする請求項１１に記載のコンピュータ可読記憶媒体。
【請求項１４】
実行時に前記少なくとも１つのプロセッサに、前記第１の木の前記要求されたノードへの経路上にあるノードごとに前記第２の木にノードを生成することによって、要求に応じて前記第２の木を生成させるコンピュータ実行可能命令をさらに備え、前記生成されたノードは、前記要求されたノードへの前記経路上の前記第１の木における次のノードに対応し、前記第２の木の前記生成されたノードは、前記第１の木の対応するノードへのポインタを含むことを特徴とする請求項１２に記載のコンピュータ可読記憶媒体。
【請求項１５】
実行時に前記少なくとも１つのプロセッサに、前記第２の木のノードへのアクセス要求を前記コンシューマから受信したことに応答して、前記第２の木の読取専用で再利用可能なバージョンを含む第３の木を生成させるコンピュータ実行可能命令をさらに備え、前記第３の木は、前記第３の木の親ノードから前記第３の木の前記親ノードの子ノードへの単方向ポインタを有し、前記第３の木への前記コンシューマのアクセスを制御する第４の木を生成し、前記第４の木は、前記コンシューマがアクセス可能な再利用不能な木を含み、前記第４の木は、前記第４の木の親ノードから前記第４の木の前記親ノードの子ノードへのポインタと、前記第４の木の子ノードから前記第４の木の前記子ノードの親ノードへのポインタと、前記第４の木のノードから前記第３の木の対応するノードへのポインタとを含む双方向のポインタを有することを特徴とする請求項１１に記載のコンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、漸進的変化を伴う効率的な不変構文表現に関する。
【背景技術】
【０００２】
コンピュータ科学では、木とは、接続されたノードからなる階層的なデータ構造である。木は非周期的な接続グラフであり、木の中の各ノードは零個以上の子ノードおよび多くて１つの親ノードを有する。ノードは値、条件を含むことができ、または独立したデータ構造（例えば、別の木）を表現することもできる。慣習的には、木の中で子ノードはその親の「下」にある。つまり、コンピュータ科学の木は、自然における木とは異なり、上ではなく下に成長する。子を有するノードは、当該子の親ノード、その先祖、またはその上位ノードと呼ばれる。
【０００３】
木は、コンピュータ内で、メモリ内のノードおよび木の枝を表す参照によって表される。各親ノードはその子ノード（複数可）への参照を有するが、全ての子ノードがその親ノードへの参照を有するわけではない。子ノードを有さないノードは葉ノードまたは終端ノードと呼ばれる。ノードの高さは、そのノードから葉への最も長い下方の経路の長さである。根の高さは、木の高さである。ノードの深さは、その根への経路（即ち、そのルート経路）の長さである。木の最上位のノードは根ノードと呼ばれる。根ノードは親を有さない。木に対する操作は一般に根ノードから始まる。木の任意のノードへは、ノード間のポインタまたはリンクを辿ることで根ノードから到達することができる。しばしば、木の特定のノードに到達したときに操作が実施される。内部ノードは、子ノードを有する木の任意のノードである。したがって、葉ノードは子ノードを有さないので内部ノードではない。
【０００４】
木の各ノードを、そのノードから下る部分木の根ノードとみなすことができる。「部分木」という用語は、木のノードおよび木の当該ノードの全ての子孫から構成される木を指す。根ノードに対応する部分木は木全体であり、他の任意のノードに対応する部分木は真部分木と呼ばれる。木を多種多様に表現することができる。ある一般的な表現には、ヒープ（ヒープ・データ構造と混同しないこと）に割り当てた、子ノード（複数可）、親、もしくは子ノード（複数可）および親ノードの両方へのポインタ（複数可）を有するレコードとしてノードが表現され、または、配列内の項目として表現されて、ノード間の関係が配列（例えば、２値ヒープ）内のノードの位置で決定されるものもある。
【０００５】
一連の親ノードとその子ノード（複数可）との間の接続またはポインタを辿ることにより、木を走査することができる。先順走査では、親ノードに到達してから、当該親ノードの子ノード（複数可）に到達する。後順走査は、親ノードの子ノードを走査してから、当該親ノードを走査するものである。
【０００６】
解析木または構文木は一般に、ある形式文法に従う文字列の構文構造を表す、根を伴う順序木である。解析木では、内部ノードには文法の非終端記号を付し、葉ノードには文法の終端記号を付す。このような木を生成するプログラムの一種は構文解析器と呼ばれる。解析木または構文木はしばしば、コンピュータ・プログラミング言語の処理中に生成される。
【発明の概要】
【０００７】
変更不能な木により、複数のスレッド上の複数のクライアントが、他のスレッドが同時に行う変更に注意するというリスクなしに、同一の木を利用できるようにすることができる。さらに、木の一部を利用し再利用することで処理がより効率的になる。なぜならば、木のごく一部分が変更されたときに何度も木全体を生成する必要がないからである。木の一部を単方向の木で再利用することができる。単方向の木とは、その木の各ノードが、直下または直上の何れかにある１つまたは複数のノードのみをポイントする木である。即ち、１方向のみのポインタを有する木においては、根は直下のノードをポイントすることができ、これらのノードの各々はその直下の１つまたは複数のノードをポイントすることができる（等である）が、木のどのノードもその親ノードおよび子ノード（複数可）の両方をポイントすることはできない。しかし、両方向のポインタ（双方向ポインタ）を有する木が、単方向ポインタを有する木よりも非常に有用である場合がよくある。双方向ポインタを有する従来の木は再利用可能ではなく、再利用可能でない木はリソース処理の点でよりコストが高く、従って一般には効率が悪い。
【０００８】
コンシューマが、効率性またはデータ完全性を犠牲にすることなく、複数のコンシューマが利用する新たな木を生成するために、第１の不変の秘密木および第２の公開木を含むデータ構造を生成する。公開木は秘密木へのアクセスを制御する。秘密木と公開木との組合せにより、データ構造内で上方および下方の両方の参照が可能となり、不変の（読取専用または変更不可である）特性および変更可能な特性が同じデータ構造内で共存することができる。当該データ構造の一部を他の木データ構造で再利用することができる。秘密木は相対的な情報を保持し、当該情報により、当該秘密木を再構築し再利用することができる。公開木は、コンシューマ固有の情報を保持し、ツールが秘密木内の特定の部分木を検索して対象とできるようにする。（根ノードを除く）公開木の構築を、当該公開木内のノードが要求されるまで保留することができる。公開木を、コンシューマによる秘密木のノードへのアクセス要求に応答して、要求に応じて構築することができる。
【０００９】
上述のデータ構造を用いて、双方向ポインタおよびコンシューマ固有の相対的な位置を表現でき、不変でありながら木の効率的な生成および成長を可能とするように、解析木、構文木、意味木（ｓｅｍａｎｔｉｃ  ｔｒｅｅ）、および束縛木（ｂｏｕｎｄ  ｔｒｅｅ）のようなコンパイラ生成型の木を提示し、木全体を再生成することなく新しい読取専用の木データ構造を生成することができる。
【００１０】
本発明の概要は、選択した概念を簡潔な形で導入するために与えたものである。その概念は、下記の発明を実施するための形態においてさらに説明する。本発明の概要は、特許請求する主題の主要な特徴または本質的な特徴を特定しようとするものではなく、特許請求する主題の範囲を限定するために使用しようとするものでもない。
【図面の簡単な説明】
【００１１】
【図１ａ】当技術分野で周知の木データ構造の１例のブロック図である。
【図１ｂ】当技術分野で周知の木データ構造の別の例のブロック図である。
【図１ｃ】当技術分野で周知の木データ構造の別の例のブロック図である。
【図１ｄ】本明細書で開示した主題の諸態様に従う、漸進的変化を伴う効率的な不変構文表現のためのシステム１００の１例を示す図である。
【図１ｅ】本明細書で開示した主題の諸態様に従うデータ構造のブロック図である。
【図１ｆ】
【図１ｇ】
【図２】
【図２ａ】本明細書で開示した主題の諸態様に従う、漸進的変化を伴う効率的な不変構文表現のための方法の１例の流れ図を示す図である。
【図２ｂ】本明細書で開示した主題の諸態様に従う根ノードの１例のブロック図である。
【図２ｃ】本明細書で開示した主題の諸態様に従う根ノード以外の１例のブロック図である。
【図２ｄ】本明細書で開示した主題の諸態様に従う根ノード以外の別の例のブロック図である。
【図３】本明細書で開示した主題の諸態様を実装できるコンピューティング環境の１例を示すブロック図である。
【図４】本明細書で開示した主題の諸態様に従う統合開発環境の１例のブロック図である。
【発明を実施するための形態】
【００１２】
概要
コンピュータ言語の解析木（文法要素に分解された入力されたソース・コードを記述する、言語構文解析器の出力）、構文木、意味木、および束縛木（派生メンバ等、束縛情報を含む木）のような木は、多種多様なコンシューマに有用である。当該コンシューマには、コンパイラ、デバッガ、ソース・コード・エディタ、クラス・デザイナ、アーキテクチャ・エクスプローラ、メトリックのようなコード・アナライザ、ルール・チェッカ、およびソース・コード・リファクタリング・ツール等のような開発ツールが含まれる。データ完全性を維持しつつ同一の木に対して同時に複数のコンシューマがアクセスできるようにするために、木を不変の（読取専用の）構造として表現することができる。
【００１３】
コンシューマはまた、木を直接的または間接的に修正（例えば、木がそこから生成されるファイル内のテキストを修正することにより、木を間接的に修正）できることを望む場合がある。しかし、コンシューマが共有の読取専用の木を直接修正できないため、そのコンシューマが修正した木を表す新たな読取専用の木を構築して、他のコンシューマが依然として元の木で作業できるようにしなければならない。新たな木を構築するとき、既存の木の少なくとも一部を再利用できることが理想的であるはずである。木データ構造のコンシューマはしばしばデータ構造を上下にナビゲートする機能を欲するので、上方および下方の両方の参照が有用であるが、上方参照および下方参照を伴う木の部分を他の木で再利用することはできない。
【００１４】
なぜそうなのかを理解するために、図１ａでは解析木である木１０を示す。木１０は、「Ｒｅｔｕｒｎ  ３．１４  ＊  ｒ＾２」という文を表現するために生成されたものであり得る。木１０は、（親ノードから子ノードへ）下方にポイントする単方向ポインタを有する。ここで図１ｂを参照し、コンシューマが木１０を修正して「Ｒｅｔｕｒｎ  Ｍａｔｈ．ＰＩ  ＊  ｒ＾２」という文を表す必要がある（「３．１４」を表すノードを「Ｍａｔｈ．ＰＩ」を表すノードで置き換える）と仮定する。図１ｂの木１２が、この新たな文である「Ｒｅｔｕｒｎ  Ｍａｔｈ．ＰＩ  ＊  ｒ＾２」を表す。図１ａおよび１ｂで示すように、木１０は木１２とは異なる。これは、木１２が、木１０と実質的に同量のメモリを使用することを意味する。なぜならば、木１０とノードを共有しない別の木（木１２）を構築したからである。何千ものノードを含む大規模な木に対しては、かかるプロセスでは効率が悪い（リソースを大量に消費する）。
【００１５】
修正された文「Ｒｅｔｕｒｎ  Ｍａｔｈ．ＰＩ  ＊  ｒ＾２」を表現する木の生成プロセスをより効率的にするために、木１０の不変の部分を２つの木で共有することができる。木１０と、幾つかのノードを木１０と共有する第２の木との間で明らかに共有できないノードは、「Ｍａｔｈ」を表すノード１６、「ＰＩ」を表すノード１８、および「．」を表すノード２０である。木１０にノード１６およびノード１８に対応するノードがなく、木１２の「．」を表すノード２０に対応するノードが木１０の「３．１４」を表すノード２２であるため、これらのノードを共有することはできない。明らかに、ノード２０はノード２２と同じではない。
【００１６】
木１０には、他に再利用できないノードもある。木１２で「＊」を表すノード２４は、木１０で「＊」を表すノード２６とは同じではない。なぜならば、ノード２６は２つの子ノードを有し、その最左の子ノードが「３．１４」を表すノード２２である一方、「＊」を表す木１２のノード２４は「．」を表す最左の子ノード２０を有するからである。同様に、木１２のノード２８は「Ｓｔｍｔ」を表し、木１０のノード３０も「Ｓｔｍｔ」を表すが、ノード２８とノード３０は同じではない。なぜならば、ノード２８の最右の子が、木１０のノード２６と同じノードではないノード２４であるからである。同様に、木１２のノード３２は木１０のノード３４と同じノードではない。
【００１７】
しかし、残りのノード、即ち、図１ａの木１０および図１ｂの木１２の２つの木において、不連続線で示し参照番号９を付したノードを共有することはできる。これらのノードは、構造的に同一なので再利用することができる。木のポインタが単方向である（本例では、親ノードから子ノードへポイントする）限り、破線で示した全てのノードを共有することができる。図１ｃは木１４を示し、木１４においては、新たな木である木１４のノードを木１０の不変のノードにポイントさせることで、木の間で共有できる情報の一部を共有する。
【００１８】
木の子から親へポイントするポインタが追加されるまでは、木の共有部分のデータ完全性が保たれることは理解されよう。例えば、図１ｃの木１０のノード３６を検証すると、ノード３６には２つの可能な親ノード、即ち木１４のノード２４および木１０のノード２６があることが分かる。したがって、木１０および木１４の複数の後順走査が可能である。木１０および木１４の複数の後順走査が可能であるので、データ完全性は失われる。なぜならば、例えば、「ノード３６の親ノードは何か？」という問いに対して２つの考えられる回答があるからである。
【００１９】
本明細書で開示した主題の諸態様によれば、データ構造は、１つまたは複数のコンシューマが直接にはアクセス可能でない秘密木、および当該１つまたは複数のコンシューマが直接アクセス可能な公開木を含む。公開木は秘密木に対する間接的なアクセスを提供する。秘密木は、親ノードから子ノードをポイントする単方向ポインタを有し、再利用可能である。公開木は、再利用不能な双方向に参照する木とすることができ、再利用可能な単方向にポイントする木とすることもできる。公開木の木要素が、コンシューマがアクセス不能な秘密木の中の対応するまたは等価な木要素をポイントすることもできる。即ち、公開木のノードが、その公開木の親ノードをポイントすることができ、等価な秘密木のノードをポイントすることもできる。公開木のノードが、その公開木の子ノードへのポインタを有してもよい。公開木の子ノードへの当該ポインタを、コンシューマが要求したときに遅延的に（要求に応じて）決定することもできる。公開木のノードがその公開木の子ノードに対するポインタを有しない場合は、この公開木の子ノードを要求ごとに生成し、保持または再利用はしない。したがって、１つまたは複数のコンシューマにはデータ構造が双方向参照を有するように見えるが、隠蔽された秘密木があるのでデータ完全性は依然として保たれている。
【００２０】
上述の特徴により、データ構造を効率的に漸進的に更新することができる。コンシューマが、元の木と１つのノードでのみ相違する木を生成する必要があると仮定する。コンシューマは、修正された文を表す新たな公開木、および以前の秘密木とノードを共有できる新たなアクセス不能な秘密木を含むデータ構造を生成することができる。当該新たな公開木に対して生成した根は、差分のノードを有する木を表し、元の木の根と共存して、当該元の木の既存のノードを最大限共有することができる。
【００２１】
新たな木を要求に応じて生成して、コンシューマが元の木で表された文へのアクセスまたは当該文の変更を要求した場合に、新たな木の子ノードのみが生成されるようにすることができる。その結果、説明したデータ構造は双方向ポインタを有する不変の木構造を提供し、事前更新型および事後更新型の木が共存できる効率的な非破壊的更新が可能となり、様々な版の秘密木の間で共有を行うことができる。
【００２２】
漸進的変化を伴う効率的な不変構文表現
図１ｄは、本明細書で開示した主題の諸態様に従う、漸進的変化を伴う効率的な不変構文表現のためのシステム１００の１例を示す。システム１００の全部または一部が、図３に関して後述するコンピュータのような１つまたは複数のコンピュータに存在することができる。システム１００の全部または一部が、図４に関して後述するコンピュータのような１つまたは複数のソフトウェア開発コンピュータ（例えば、コンピュータ１０２）に存在することもできる。システム１００またはその一部が、図４に関して後に説明および例示するもののような統合開発環境（例えば、ＩＤＥ１０４）の一部を備えることができる。あるいは、システム１００またはその一部を、スタンドアロンのシステムまたはプラグインもしくはアドインとして提供することができる。
【００２３】
システム１００が、プロセッサ（例えば、プロセッサ１４２）、メモリ１４４、および漸進的変化を伴う効率的な不変構文表現向けのモジュール１０６のうち１つまたは複数を備えることができる。当技術分野で周知の他のコンポーネントを含めることができるが、ここでは図示していない。漸進的変化を伴う効率的な不変構文表現向けのモジュール１０６をメモリ１４４にロードして、プロセッサ１４２のような１つまたは複数のプロセッサに漸進的変化を伴う効率的な不変構文表現向けのモジュール１０６に属する動作を実行させることができることは理解されよう。漸進的変化を伴う効率的な不変構文表現向けのモジュール１０６が、本明細書で開示した主題の諸態様に従って、解析木１０８のような読取専用の木を受け取るかまたは生成し、下記でより完全に説明する１つまたは複数のデータ構造１１０を含む出力を生成することができる。
【００２４】
漸進的変化を伴う効率的な不変構文表現向けのモジュール１０６が、バックグラウンド・コンパイラ、並列コンパイラもしくはインクリメンタル・コンパイラのようなコンパイラ、バックグラウンド・パーサ、並列パーサもしくはインクリメンタル・パーサもしくはプラグインのような構文解析器、プリプロセッサ、またはＩＤＥ、構文解析器、コンパイラもしくはプリプロセッサに対するアドインもしくは拡張のうち１つまたは複数を備えることができる。漸進的変化を伴う効率的な不変構文表現向けのモジュール１０６がテキスト情報または非テキスト情報を分解することができ、そこから情報ブロックを表す木を構築することができる。漸進的変化を伴う効率的な不変構文表現向けのモジュール１０６を、対話的な設計時ソース・コード・エディタに取り付け、当該エディタと統合し、または当該エディタに関連付けることができ、当該モジュールが、Ｃ＃（Ｃシャープ）、Ｖｉｓｕａｌ  Ｂａｓｉｃ、Ｃ、Ｃ＋＋、Ｊａｖａ（登録商標）、Ｒｕｂｙ、Ｐｅｒｌ、Ｐｙｔｈｏｎ、Ｆｏｒｔｒａｎ、Ｃｏｂｏｌ、およびその他を含む任意のプログラミング言語（複数可）を構文解析可能とすることができる。
【００２５】
動作において、漸進的変化を伴う効率的な不変構文表現向けのモジュール１０６は、１つまたは複数の木を生成または受け取ることができ、そこから下記でより完全に説明するデータ構造を生成することができる。当該１つまたは複数の木には、解析木、構文木、意味木、束縛木等のようなコンパイラ生成型の木が含まれるがこれらに限らない。図１ｅを参照すると、「Ｒｅｔｕｒｎ  Ｍａｔｈ．｜＊  ｒ＾２」という文を表す読取専用の第１の木（例えば、秘密木）、例えば木４０、が与えられると、漸進的変化を伴う効率的な不変構文表現向けのモジュール１０６は当該第１の木をコンシューマから隠蔽するか、または、コンシューマが当該第１の木にアクセスできないもしくは当該第１の木を利用できないようにする。漸進的変化を伴う効率的な不変構文表現向けのモジュール１０６が、木４０のノードへのアクセス要求または木４０のノードの修正要求を含む入力を受け取ったことに応答して秘密木を隠蔽することができ、あるいは、コンシューマから要求を受け取る前にコンシューマが木を利用できないようにすることができる。木４０が利用できないことを、図１ｅで木４０の周囲に示した箱４２により表す。本明細書で開示した主題の幾つかの態様によれば、木４３のような第２の読取専用の木（例えば、読取専用の公開木）を生成することで、読取専用の第１の木に対する間接的なアクセスをコンシューマに与える。当該第２の読取専用の木は、第１の木に対するアクセスを制御する。コンシューマは第２の木である木４３を直接修正することはできないが、当該第２の木を１つまたは複数の新たな木の構築に際して利用することができる。この場合、当該新たな木（複数可）は、第２の木を生成するのに用いられる情報の修正である情報を表す。
【００２６】
第２の木である木４３を生成するために、第１の木である木４０の根ノード４６をラップする根ノードである根ノード４４を生成する。第２の木の根ノードは、第１の木の根ノード周囲のプロキシまたはファサードとして動作するが、第１の木の同一性は維持する。第１の木のノードに関する任意の情報を、第２の木のノードを生成することにより取得することができる。この場合、生成した第２の木のノードが第１の木の対応するノードをラップする。第１の木の特定のノードに関する情報を取得するために、対応するノードを第２の木に生成する。これらのノードは、要求された特定のノードへの経路にそって第１の木の対応するノードをラップする。第２の木は、当該情報を第１の木から取得し、当該情報を第１の木からコンシューマに返す。第２の木でノードを生成することに加えて、第２の木において子から親へのポインタを生成する。
【００２７】
例えば、木４０のノード４８の内容が要求されていると仮定する。図１ｅを再度参照すると、根ノード４６をラップする根ノードである根ノード４４を生成する。根ノード４４は根ノード４６をポイントする。根ノード４６の子ポインタにアクセスして、根ノード４６の子ノードであるノード５２を見つける。ノード５２をポイントするノード５４を木４３に生成する。ノード５４内のフィールドには、ノード５２へのポインタ、即ち、ポインタ５６が含まれる。また、ノード５４の親ノードである根ノード４４へのポインタ（例えば、ポインタ５０）を生成する。このプロセスを、所望のノードへの経路に沿った、読取専用の第１の木における全てのノードに対して行う。
【００２８】
一般に、木に対して操作を行っているとき、当該木のごく一部のみが走査される。例えば、コンシューマが木４０内の特定のノードを検索していると仮定する。コンシューマが、木、例えば木４０の特定の位置にあるノードを検索していると仮定する。当該位置にあるノードがノード４８であり、その内容が「Ｍａｔｈ」であると仮定する。この例では、内容が「Ｍａｔｈ」であるノードへの経路上にあるノード、即ち、ノード６２、ノード６４、およびノード６６に対してノードを生成する。ノード６２に対応して、ノード６８を木４３に生成する。ノード６４に対応して、ノード７０を木４３に生成する。ノード６６に対応して、ノード７２を木４３に生成する。第１の木の他の任意のノードに対応するノードは生成されない。
【００２９】
本明細書で開示した主題の他の諸態様によれば、第１の木の他の経路に対しては、第２の木でノードは生成されない。本明細書で開示した主題の諸態様によれば、第２の木でノードを生成することによって読取専用の木の潜在的に任意の部分にアクセスすることができるが、ノードは、それらが所望のノードへの経路に沿っている場合にのみ生成され、したがって、複数のコンシューマが共有できる読取専用の木を保持しつつも木の操作を効率化することができ、データ完全性を犠牲にすることはない。あるいは、２つの別々の木を最初に生成し、処理コスト全体を最初に評価する。本明細書で開示した主題の諸態様によれば、コンシューマが第２の木の利用を終えたときに、ガベージ・コレクションまたはハウスキーピング処理により第２の木をメモリから消去することができる。どの残存する第１または第２の木のノードからも最早参照されない第１の木の部分木をメモリから消去することができる。
【００３０】
同様に、コンシューマが読取専用の木のノードを検査するのではなく読取専用の木のノードを修正したいときは、新たな木を生成する。コンシューマが変更したい読取専用の木のノードに対応するノードの内容が新たな木の対応するノードによってポイントされないことを除き、上述のプロセスを公開読取専用木で実施する。また、新たな木のノードの内容を新たな値に設定する。即ち、新たな木のコンテンツ・フィールドを、読取専用の公開木の対応するノードの対応するフィールドの値とは異なる値に設定することができる。例えば、コンシューマが木４３のノード５８の内容を「Ｍａｔｈ」から「ＰＩ」に変更する必要がある場合は、ノード５８へのポインタは生成されず、ノード５８に対応する新たな木のノードの内容は「ＰＩ」に設定されるはずである。必要に応じてノードを、一般的に知られているように新たな木にさらに追加することができる。
【００３１】
新たな木が１つのコンシューマによって利用されるので、新たな木の各ノードを使用して、特定のファイルまたはドキュメントのノードの絶対位置のような、コンシューマ固有の情報を追跡し続けることができる。例えば、テキストを含むドキュメントが与えられた場合、当該ドキュメント内の各単語が、そのバージョンのドキュメントに関連付けられたテキスト・バッファ内の特定の位置に存在することができる。例えば、「Ｍａｔｈ」という単語が、そのドキュメントのテキスト・バッファの位置２０に存在することができる。木４３のノード５８に対応する新たな木のノードが絶対位置２０を含むことができる。なぜならば、当該新たな木は別のコンシューマによって再利用可能ではないからである。対照的に、読取専用の公開木、例えば木４３のノードでは、各コンシューマのテキスト・バッファが別々の位置で開始する可能性が高いので、当該読取専用の公開木のノードは、ノードの幅またはノード内の文字数のような、相対的な位置情報を含む。新たな木では、特定のノードへの経路にあるノードの幅を総和し、その和をテキスト・バッファの開始位置に加算して、ドキュメント内のノードの絶対位置を求める。
【００３２】
図２ａは、本明細書で開示した主題の諸態様に従う、漸進的変化を伴う効率的な不変構文表現のための方法２００の１例を示す。本明細書で開示した主題の幾つかの態様によれば、２０２で、読取専用の秘密木を取得、生成、または受け取る。公開木に対して新たな根を生成することでコンシューマが当該秘密木にアクセスできないようにすることができる。この場合、公開木に対する新たな根が、秘密木の根ノードをラップし、秘密木へのアクセスを制御する。ここで図２ｂを参照すると、新たな根ノード、例えば根ノード２７６が、図２ｂで子フィールド２７２、２７４等へのポインタで示すように、秘密木２７０の根ノードへのポインタ、子ノードへの１つまたは複数のポインタ、のうち１つまたは複数のフィールドを含むことができる。２０４で、木のノードにアクセスし当該ノードを修正する要求をコンシューマから受け取る。それに応答して、コンシューマに対して、秘密木へのアクセスを制御する公開木を表す根ノードへのアクセスを提供する。
【００３３】
２０６で、当該要求を受け取ったことに応答して、秘密木のポインタを辿って秘密木の所望のノードへの経路を走査することによって、公開木のノードをさらに生成することができる。秘密木において次のノードに到達するときは常に、公開木において対応するノードを生成する。２０８で、公開木においてポインタを生成する。例えば、生成されたノードの親ノードをポイントする、生成されたノードを起点とするポインタを生成する。根ノード以外の構造の１例を図２ｃに示す。第２の木のノード２９０が、秘密木の対応するノードへのポインタに対するフィールド２７８、内容を格納するための１つまたは複数のフィールドであるフィールド２８０、２８２等、公開木２８４におけるノード２９０からその親ノードへのポインタおよび当該公開木におけるノード２９０の子ノードへの１つまたは複数のポインタであるフィールド２８６、２８８等を含むことができる。秘密木の所望のノードに到達するまで、秘密木の経路におけるノードごとに公開木でノードを生成する。
【００３４】
コンシューマの要求がアクセス要求であった場合は、コンシューマが公開木の処理を完了したときに、２１０で、コンシューマが使用した空間をガベージ・コレクションにより回収することができる。コンシューマは公開木の変更を要求することができる。かかる要求により、２１２で、新たな公開木を生成し、コンシューマがアクセス不能な新たな秘密木を生成する。この新たなアクセス不能な木が、以前の秘密木とノードを共有することができる。即ち、コンシューマの要求が、既存の木の修正を含む新たな木を生成する要求であった場合は、当該新たな木が元の秘密木の部分木を再利用することができる。コンシューマがかかる木を生成する場合は、新たに生成した木を共有することはできない。コンシューマは古い部分木と新たな部分との組合せから新たな木を積極的に構築して、新たな木の対応するノードの内容を新たな値に設定する。読取専用の公開木に対応するノードがない部分木を新たな木に追加する必要に応じて、新たな木にノードをさらに追加することができる。この場合、読取専用の木の対応するノードへのポインタであるフィールド２７８を空に設定する。あるいは、図２ｄのノード２９２で示すように、第２の根ノード以外のタイプが、読取専用の木の対応するノードへのポインタに対するフィールドであるフィールド２７８を有さなくともよい。コンシューマが新たな木を修正したい場合は、新たな木の根ノードをポイントする読取専用の根ノードを含む別の木を生成することができる。あるいは、例えば、コンシューマが新たな木のノードへのアクセスまたは新たな木のノードの修正を要求する場合は、新たな木全体の読取専用のコピー、バージョン、またはスナップショットを構築することができる。第３の木の根ノードをポイントする第４の修正可能な木を生成すること等によって、読取専用の木の根ノードをラップすることができる。
【００３５】
適切なコンピューティング環境の例
本明細書で開示した主題の様々な態様に対するコンテキストを提供するため、図３および以下の議論は、様々な実施形態を実装できる適切なコンピューティング環境５１０の簡潔で一般的な説明を提供しようとするものである。本明細書で開示した主題を、プログラム・モジュールのような、１つまたは複数のコンピュータまたは他のコンピューティング装置により実行されるコンピュータ実行可能命令の一般的なコンテキストで説明するが、本明細書で開示した主題の一部を他のプログラム・モジュールとの組合せおよび／またはハードウェアとソフトウェアとの組合せで実装することもできることは当業者には理解されよう。一般に、プログラム・モジュールは、特定のタスクを実施するかまたは特定のデータ型を実装するルーチン、プログラム、オブジェクト、物理的中間生成物、データ構造等を含む。一般に、プログラム・モジュールの機能を様々な実施形態において必要に応じて組み合わせるかまたは分散させることができる。コンピューティング環境５１０は適切な動作環境の１例にすぎず、本明細書で開示した主題の使用範囲または機能範囲を限定しようとするものではない。
【００３６】
図３を参照すると、ソフトウェア開発用のコンピューティング装置がコンピュータ５１２の形で記載されている。コンピュータ５１２は、処理装置５１４、システム・メモリ５１６、およびシステム・バス５１８を備えてもよい。処理装置５１４は、様々な利用可能なプロセッサのうち任意のものであることができる。デュアル・マイクロプロセッサおよび他のマルチプロセッサ・アーキテクチャを処理装置５１４として使用することもできる。システム・メモリ５１６には、揮発性メモリ５２０および不揮発性メモリ５２２を含めてもよい。不揮発性メモリ５２２には、ＲＯＭ（ｒｅａｄ  ｏｎｌｙ  ｍｅｍｏｒｙ）、ＰＲＯＭ（ｐｒｏｇｒａｍｍａｂｌｅ  ＲＯＭ）、ＥＰＲＯＭ（ｅｌｅｃｔｒｉｃａｌｌｙ  ｐｒｏｇｒａｍｍａｂｌｅ  ＲＯＭ）またはフラッシュ・メモリを含めることができる。揮発性メモリ５２０には、外部キャッシュ・メモリとして動作し得るＲＡＭ（ｒａｎｄｏｍ  ａｃｃｅｓｓ  ｍｅｍｏｒｙ）を含めることができる。システム・バス５１８は、システム・メモリ５１６を含むシステム物理アーチファクトを処理装置５１４に接続する。システム・バス５１８は、メモリ・バス、メモリ・コントローラ、周辺バス、外部バス、またはローカル・バスを含む幾つかの種類のうち任意のものであることができ、任意の様々な利用可能なバス・アーキテクチャを利用することができる。
【００３７】
コンピュータ５１２は一般に、揮発性および不揮発性の媒体、取外し可能および取外し不能な媒体のような、様々なコンピュータ可読媒体を含む。コンピュータ記憶媒体を、コンピュータ可読命令、データ構造、プログラム・モジュール、または他のデータのような情報を記憶するための任意の方法または技術で実装することができる。コンピュータ記憶媒体には、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、フラッシュ・メモリもしくは他のメモリ技術、ＣＤＲＯＭ、ＤＶＤ（ｄｉｇｉｔａｌ  ｖｅｒｓａｔｉｌｅ  ｄｉｓｋ）もしくは他の光ディスク記憶装置、磁気カセット、磁気テープ、磁気ディスク記憶装置もしくは他の磁気記憶装置、または所望の情報の記憶に使用できコンピュータ５１２がアクセス可能な他の任意の非一時的媒体（ｎｏｎ−ｔｒａｎｓｉｔｏｒｙ  ｍｅｄｉｕｍ）が含まれるがこれらに限らない。
【００３８】
図３はユーザとコンピュータ・リソースとの間の中間体として動作できるソフトウェアを説明するものであることは理解されよう。当該ソフトウェアには、ディスク記憶装置５２４に格納できるオペレーティング・システム５２８を含めてもよい。オペレーティング・システム５２８は、コンピュータ・システム５１２のリソースを制御し割り当てることができる。ディスク記憶装置５２４は、インタフェース５２６のような取外し不能なメモリ・インタフェースを介してシステム・バス５１８に接続されるハード・ディスク・ドライブであってもよい。システム・アプリケーション５３０は、システム・メモリ５１６またはディスク記憶装置５２４の何れかに格納されたプログラム・モジュール５３２およびプログラム・データ５３４を通じて、オペレーティング・システム５２８によるリソース管理を利用する。コンピュータを様々なオペレーティング・システムまたはオペレーティング・システムの組合せで実装できることは理解されよう。
【００３９】
ユーザは、入力装置（複数可）５３６を介してコマンドまたは情報をコンピュータ５１２に入力することができる。入力装置５３６には、マウスのようなポインティング・デバイス、トラックボール、スタイラス・ペン、タッチ・パッド、キーボード、マイクロフォン等が含まれるがこれらに限らない。これらおよび他の入力装置は、インタフェース・ポート（複数可）５３８を介してシステム・バス５１８により処理装置５１４に接続される。インタフェース・ポート（複数可）５３８は、シリアル・ポート、パラレル・ポート、ＵＳＢ（ｕｎｉｖｅｒｓａｌ  ｓｅｒｉａｌ  ｂｕｓ）等を表すことができる。出力装置（複数可）５４０が、入力装置が使用するのと同じ種類のポートを利用することができる。特定のアダプタを要するモニタ、スピーカ、およびプリンタのような幾つかの出力装置５４０が存在することを示すために、出力アダプタ５４２が提供されている。出力アダプタ５４２には、出力装置５４０とシステム・バス５１８との間の接続を提供するビデオ・カードおよびサウンド・カードが含まれるがこれらに限らない。他の装置および／もしくはシステムまたはリモート・コンピュータ（複数可）５４４のような装置が、入力機能および出力機能の両方を提供することができる。
【００４０】
コンピュータ５１２は、リモート・コンピュータ（複数可）５４４のような１つまたは複数のリモート・コンピュータへの論理接続を用いてネットワーク環境で動作することができる。リモート・コンピュータ５４４は、パーソナル・コンピュータ、サーバ、ルータ、ネットワークＰＣ、ピア・デバイス、または他の共通ネットワーク・ノードであることができ、一般に、コンピュータ５１２に関して上述した要素のうち多数または全部を含むが、図４ではメモリ記憶装置５４６のみ示してある。リモート・コンピュータ（複数可）５４４を、通信接続５５０を介して論理的に接続することができる。ネットワーク・インタフェース５４８は、ＬＡＮ（ｌｏｃａｌ  ａｒｅａ  ｎｅｔｗｏｒｋ）およびＷＡＮ（ｗｉｄｅ  ａｒｅａ  ｎｅｔｗｏｒｋ）のような通信ネットワークを包含するが、他のネットワークを含むことができる。通信接続（複数可）５５０は、ネットワーク・インタフェース５４８をバス５１８に接続するために使用されるハードウェア／ソフトウェアを指す。接続５５０は、コンピュータ５１２の内部または外部にあることができ、（電話、ケーブル、ＤＳＬ、および無線の）モデム、ＩＳＤＮアダプタ、イーサネット・カード等のような内部および外部の技術を含むことができる。
【００４１】
図示したネットワーク接続は例にすぎず、コンピュータ間の通信リンクを確立するための他の手段を利用してもよいことは理解されよう。コンピュータ５１２または他のクライアント装置をコンピュータ・ネットワークの一部として展開できることは当業者には理解されよう。これに関して、本明細書で開示した主題は、任意数のメモリまたは記憶ユニット、および任意数の記憶ユニットまたはボリュームにわたって生ずる任意数のアプリケーションおよびプロセスを有する任意のコンピュータ・システムに関するものであってもよい。本明細書で開示した主題の諸態様を、リモートまたはローカルの記憶装置を有する、ネットワーク環境に展開したサーバ・コンピュータおよびクライアント・コンピュータを有する環境に適用することができる。本明細書で開示した主題の諸態様を、プログラミング言語の機能、解釈実行機能を有する、スタンドアロンのコンピューティング装置に適用することができる。
【００４２】
図４は、ＩＤＥ（ｉｎｔｅｇｒａｔｅｄ  ｄｅｖｅｌｏｐｍｅｎｔ  ｅｎｖｉｒｏｎｍｅｎｔ）６００および共通言語ランタイム環境６０２を示す。ＩＤＥ６００によりユーザ（例えば、開発者、プログラマ、デザイナ、コーダ等）は、プログラム、１組のプログラム、ウェブサイト、ウェブ・アプリケーション、およびウェブ・サービスを、１つのコンピュータ・システムで設計、コーディング、コンパイル、テスト、実行、編集、デバッグ、またはビルドすることができる。ソフトウェア・プログラムは、１つまたは複数のソース・コード言語（例えば、Ｖｉｓｕａｌ  Ｂａｓｉｃ、Ｖｉｓｕａｌ  Ｊ＃、Ｃ＋＋、Ｃ＃、Ｊ＃、Ｊａｖａ  Ｓｃｒｉｐｔ（登録商標）、ＡＰＩ、ＣＯＢＯＬ、Ｐａｓｃａｌ、Ｅｉｆｆｅｌ、Ｈａｓｋｅｌｌ、ＭＬ、Ｏｂｅｒｏｎ、Ｐｅｒｌ、Ｐｙｔｈｏｎ、Ｓｃｈｅｍｅ、Ｓｍａｌｌｔａｌｋ等）で生成されたソース・コード（コンポーネント６１０）を含むことができる。ＩＤＥ６００が、ネイティブ・コードの開発環境、もしくは、仮想マシン上で実行されるマネージ・コード環境を提供することができ、または、その組合せを提供することができる。ＩＤＥ６００は、．ＮＥＴフレームワークを用いてマネージ・コード開発環境を提供することができる。中間言語コンポーネント６５０を、言語固有のソース・コンパイラ６２０を用いてソース・コード・コンポーネント６１０およびネイティブ・コード・コンポーネント６１１から生成することができ、ネイティブ・コード・コンポーネント６１１は、アプリケーションの実行時に、中間言語コンパイラ６６０（例えば、ＪＩＴ（ｊｕｓｔ−ｉｎ−ｔｉｍｅ）コンパイラ）を用いて中間言語コンポーネント６５０から生成される。即ち、ＩＬアプリケーションが実行されたとき、実行中に当該ＩＬアプリケーションを、それが実行されているプラットフォームに適した機械語にコンパイルし、それにより、コードを幾つかのプラットフォームに移植できるようにする。あるいは、他の実施形態では、意図したプラットフォームに適するようにプログラムをネイティブ・コードの機械語（図示せず）にコンパイルすることができる。
【００４３】
ユーザは、周知のソフトウェア・プログラミング技法、および特定のソース言語に関連付けられた具体的で論理的な構文規則に則り、ＩＤＥ６００のユーザ・インタフェース６４０およびソース・コード・エディタ６５１を介して、ソース・コード・コンポーネントを生成および／または編集することができる。その後、ソース・コンパイラ６２０を介してソース・コード・コンポーネント６１０をコンパイルすることができ、それにより、アセンブリ６３０のような、プログラムの中間言語表現を生成することができる。アセンブリ６３０は、中間言語コンポーネント６５０およびメタデータ６４２を含むことができる。アプリケーションのデザインは、展開前に検証可能とすることができる。
【００４４】
本明細書で説明した様々な技法を、ハードウェアもしくはソフトウェアと関連して、または必要に応じてその両方の組合せで、実装することができる。したがって、本明細書で説明した方法および装置、またはその特定の態様もしくは部分が、フロッピ・ディスク（登録商標）、ＣＤ−ＲＯＭ、ハード・ドライブ、または他の任意の機械可読記憶媒体のような有形の媒体で具体化されたプログラム・コード（即ち、命令）の形をとってもよく、プログラム・コードがコンピュータのような機械にロードされ当該機械により実行されると、当該機械は本明細書で開示した主題の諸態様を実施するための装置になる。プログラム可能コンピュータ上でプログラム・コードを実行する場合は、コンピューティング装置は一般に、プロセッサ、当該プロセッサ可読記憶媒体（揮発性および不揮発性のメモリならびに／または記憶要素を含む）、少なくとも１つの入力装置、および少なくとも１つの出力装置を含む。例えばデータ処理ＡＰＩ等の利用を通じて、ドメイン固有のプログラミング・モデルの諸態様の生成および／または実装を利用できる１つまたは複数のプログラムを、高レベルの手続型またはオブジェクト指向のプログラミング言語で実装してコンピュータ・システムと通信することができる。しかし、必要ならば、プログラム（複数可）をアセンブリ言語または機械語で実装することができる。いずれにせよ、言語はコンパイル型またはインタプリタ型の言語とすることができ、ハードウェア実装と組み合わせることができる。
【００４５】
本明細書で開示した主題を添付の図面と関連して説明したが、修正を加えて同じ機能を様々な方法で実施してもよいことは理解されよう。
【図１ａ】
2013516701.tif 000003
【図１ｂ】
2013516701.tif 000004
【図１ｃ】
2013516701.tif 000005
【図１ｄ】
2013516701.tif 000006
【図１ｅ】
2013516701.tif 000007
【図１ｆ】
2013516701.tif 000008
【図１ｇ】
2013516701.tif 000009
【図２】
2013516701.tif 000010
【図３】
2013516701.tif 000011
【図４】
2013516701.tif 000012
【国際調査報告】
2013516701.tif 000013
2013516701.tif 000014