2016-10-26 1 views
4

Ich habe die Roslyn Code-Basis betrachtet und festgestellt, dass sie zwei Versionen der Syntax haben (eine interne und eine öffentliche). Oft scheinen diese als "rote" Knoten und "grüne" Knoten bezeichnet zu werden. Ich frage mich, ob irgendjemand erklären kann, was die Gründe dafür sind, zwei Versionen der Syntax zu haben.Warum hat Roslyn zwei Syntaxversionen pro Sprache?

+0

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

+0

Weitere Hintergrund auf diesem können Sie ein Papier las ich vor einiger Zeit geschrieben habe. Seite 35: https://www.dropbox.com/s/rc9edahndlog0je/MainPaper.pdf?dl=0 –

Antwort

8

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

Der „grüne“ Baum ist unveränderlich, ausdauernd, hat keine übergeordneten Referenzen, gebaut wird „bottom-up“, und jeder Knoten verfolgt seine Breite, aber nicht seine absolute Position. Wenn eine Bearbeitung stattfindet, erstellen wir nur die Teile des grünen Baums neu, die von der Bearbeitung betroffen waren. Dies ist in der Regel etwa O (log n) der gesamten Parse-Knoten in der Struktur.

Der "rote" Baum ist eine unveränderliche Fassade, die um den grünen Baum herum gebaut ist; Es wird bei Bedarf "top-down" erstellt und bei jeder Bearbeitung weggeworfen. Er berechnet Elternreferenzen, indem er sie bei Bedarf herstellt, während Sie von oben durch den Baum absteigen. Er erzeugt absolute Positionen, indem er sie beim Abstieg aus den Breiten berechnet.

Sie, der Verbraucher der Roslyn API, sehen immer nur den roten Baum; Der grüne Baum ist ein Implementierungsdetail. (Und wenn Sie den Debugger verwenden, um in den internen Zustand eines Parsing-Knotens zu gucken, sehen Sie tatsächlich, dass dort ein Verweis auf einen anderen Parsknoten eines anderen Typs ist; das ist der grüne Baumknoten.)

Übrigens werden diese "Rot/Grün-Bäume" genannt, weil dies die Whiteboard-Marker-Farben waren, die wir zum Zeichnen der Datenstruktur in der Design-Sitzung verwendet haben. Die Farben haben keine andere Bedeutung.

Verwandte Themen