2016-10-26 5 views
4

私はRoslynコードベースを見て、2つのバージョンの構文(内部と外部)を持っていることに気付きました。多くの場合、これらは「赤」ノードおよび「緑」ノードと呼ばれるように見えます。私は誰かがこのような構文の2つのバージョンを持っている理由を説明できるかどうか疑問に思っています。なぜRoslynは言語ごとに2つのバージョンの構文を持っていますか?

+0

はhttp://stackoverflow.com/questions/10417169/are-roslyn-syntaxnodes-reused/10417510#10417510 –

+0

これに関する詳細な背景については、私はいくつかの時間前に書いた論文を読むことができますも参照してください。ページ35:https://www.dropbox.com/s/rc9edahndlog0je/MainPaper.pdf?dl=0 –

答えて

8

Persistence, Facades and Roslyn’s Red-Green Treesから:

「緑」の木は不変で、永続的な、親への参照を持っていない、「ボトムアップ」構築され、そしてすべてのノードは、その幅ではなく、その絶対位置を追跡しています。編集が行われると、編集によって影響を受けた緑色のツリーの部分のみが再構築されます。これは通常、ツリー内の総解析ノードのO(log n)あたりです。

"赤い"ツリーは、緑色のツリーの周りに構築された不変のファサードです。要求に応じて「トップダウン」で構築され、すべての編集時に破棄されます。それは、あなたが上からツリーを下っていくにつれて、それらを必要に応じて製造することによって親参照を計算する。あなたが降りると、幅からそれらを計算することによって、絶対位置を作ります。

Roslyn APIのコンシューマは、赤いツリーしか表示しません。緑色のツリーは実装の詳細です。 (また、デバッガを使用して解析ノードの内部状態を調べると、別のタイプの別の解析ノード(緑のツリーノード)への参照があることが実際に分かります。

ちなみに、これらは「赤/緑の木」と呼ばれています。なぜなら、それらはデザインミーティングでデータ構造を描くために使用したホワイトボードマーカーの色だったからです。色に他の意味はありません。

関連する問題