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?
Antwort
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.
- 1. Warum hat friendly_id standardmäßig zwei Bindestriche?
- 2. Warum zwei Bedingungen hat unterschiedliche Ergebnis: @Autowired
- 3. Warum hat dieser Code zwei verschiedene Ergebnisse?
- 4. Warum hat std :: vector zwei Zuweisungsoperatoren?
- 5. Warum hat diese Abfrage zwei Auswahlmöglichkeiten?
- 6. Hat die prozedurale Sprache Entwurfsmuster?
- 7. Warum Roslyn Methodencode ohne Leerzeichen generiert
- 8. Warum Renamer in Roslyn AnonymousObjectMemberDeclarator nicht umbenennen?
- 9. Hat die Sprache D "proprietäres" Gepäck?
- 10. Roslyn SyntaxTree Diff
- 11. Pro/Contras verschiedener Sprache Workbench-Tools wie Xtext und MPS?
- 12. Roslyn hat den Inhalt in die Baugruppe eingebettet
- 13. Werden Roslyn SyntaxNodes wiederverwendet?
- 14. Roslyn und Debugging
- 15. Roslyn Scripting
- 16. Warum das Roslyn-Team DocumentationComment als intern markiert
- 17. Roslyn ObjectPool Struct Wrapper
- 18. Hat eine reguläre Sprache L unendliche Wörter?
- 19. Welche Sprache/Plattform hat keine feste Stapelgröße?
- 20. Sprache geändert, aber CLLocationManager hat nicht beeinflusst?
- 21. Roslyn in F verwenden #
- 22. Warum hat ActionScript keine "Generika"?
- 23. Ionic: Warum die erkannte Sprache Sprache ist "ZZ-ZZ"
- 24. Roslyn - Throw Build Error
- 25. Warum PHP zwei hat „nicht gleich“ Operatoren (= und <>!)
- 26. Gestapelte Spalte Zwei Werte pro Spalte
- 27. Gruppendaten Berechnung pro zwei Spalten in MySQL
- 28. Plone-Navigation mit einer Sprache-pro-Ordner-Site
- 29. ActiveRecord hat zwei association
- 30. Haltepunkt hat zwei Adressen?
Siehe auch http://stackoverflow.com/questions/10417169/are-roslyn-syntaxnodes-reused/10417510#10417510 –
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 –