Microsoft Roslyn vs. CodeDom

110

Aus einer gestrigen Pressemitteilung auf InfoWorld zum neuen Microsoft Roslyn :

Der offensichtlichste Vorteil dieser Art von "dekonstruiertem" Compiler besteht darin, dass der gesamte Prozess zum Kompilieren und Ausführen aus .NET-Anwendungen heraus aufgerufen werden kann. Hejlsberg demonstrierte ein C # -Programm, das einige Codefragmente als Zeichenfolgen an den C # -Compiler übergab. Der Compiler gab den resultierenden IL-Assemblycode als Objekt zurück, der dann zur Ausführung an die Common Language Runtime (CLR) übergeben wurde. Voilà! Mit Roslyn erhält C # die Fähigkeit einer dynamischen Sprache, zur Laufzeit Code zu generieren und aufzurufen.

Ich kann dies seit der Veröffentlichung von .NET 4 mit tun CSharpCodeProvider.CompileAssemblyFromSource der ich tatsächlich in einem vor einiger Zeit geschriebenen ASP.Net-Projekt verwende, das genau das tut - ermöglicht es einem Benutzer, Code in ein Textfeld einzugeben und Assemblys / Namespaces auszuwählen zum Verweisen und Ausführen und Anzeigen der Ausgabe dieses Codes im laufenden Betrieb für Live-Umgebungscodetests unter Windows Azure.

Ist ein CodeDomTeil von / ein Vorläufer von Roslyn? Was ist der besondere Vorteil von Roslyn CodeDom?

mellamokb
quelle

Antworten:

240

Haftungsausschluss : Ich arbeite für Microsoft im Roslyn-Team.

CodeDom ist ein Vorläufer von Roslyn, aber nur am Rande verwandt. Im Wesentlichen ist CodeDom eine einfache und (etwas) sprachunabhängige Methode zum Generieren von Code, der in .NET 1.0 hinzugefügt wurde, um Designer zu unterstützen (a la WinForms). Da CodeDom ein Versuch war, ein einheitliches Modell bereitzustellen, das Code in C #, VB und anderen Sprachen generieren kann, fehlt es an High-Fidelity mit einer der unterstützten Sprachen (aus diesem Grund können Sie mit CodeDom keine switch-Anweisung erstellen). CSharpCodeProvider.CompileAssemblyFromSource ist einfach ein Wrapper für die Ausführung von csc.exe.

Roslyn ist ein ganz anderes Tier. Es ist eine Neufassung der C # - und VB-Compiler von Grund auf unter Verwendung von verwaltetem Code - C # in C # und VB in VB (die Versionen von csc.exe und vbc.exe, die heute ausgeliefert werden, sind in nativem Code geschrieben). Der Vorteil der Erstellung in verwaltetem Code besteht darin, dass Benutzer die realen Compiler als Bibliotheken aus .NET-Anwendungen referenzieren können (keine Wrapper erforderlich).

Beim Erstellen jeder Komponente der Compiler-Pipeline haben wir oben öffentliche APIs verfügbar gemacht:

  • Parser -> Syntax Tree API
  • Import von Symboltabellen / Metadaten -> Symbol-API
  • Binder -> Bindungs- und Flussanalyse-APIs
  • IL Emitter -> API senden

Roslyn kann als hochentwickelter C # - und VB-Quellcodegenerator verwendet werden, aber hier endet die Ähnlichkeit mit CodeDom. Die Roslyn Compiler-APIs können verwendet werden, um Code zu analysieren, semantische Analysen durchzuführen, Code dynamisch zu kompilieren und auszuwerten usw.

Zusätzlich zu den Compilern erstellt das Roslyn-Team die Visual Studio C # - und VB IDE-Funktionen zusätzlich zu den öffentlichen Compiler-APIs neu. Die Compiler-APIs sind also umfangreich genug, um die Visual Studio-Entwurfszeit-Tools wie IntelliSense und das Refactoring der Extraktionsmethode zu erstellen. Auf Ebenen über dem Compiler bietet Roslyn außerdem Dienste für die Analyse oder Datentransformation auf höherer Ebene an. Beispielsweise gibt es Dienste zum Formatieren von Code unter Verwendung der C # - und VB-Formatierungsregeln oder zum Suchen aller Verweise auf ein bestimmtes Symbol in einer Lösung.

Wirklich, es gibt nicht nur einen besonderen Vorteil von Roslyn gegenüber CodeDom. Während CodeDom einen ganz bestimmten Bedarf an Codegenerierung erfüllte, befasst sich Roslyn mit dem gesamten Sprachwerkzeugbereich, indem es ein Framework bereitstellt, mit dem Sie nahezu jede Art von C # - oder VB-Sprachwerkzeug erstellen können, die Sie sich vorstellen können.

Dustin Campbell
quelle
2
@Dustin: Wird Roslyn andere Sprachen unterstützen? Zum Beispiel JavaScript (.NET)?
Diego Barros
@Dustin: Dies ist perfekt, um eine vollständige IDE-Erfahrung zu erstellen, die die Codequalität in meiner Organisation verbessern kann. Ich sehe zwar keinen vollständigen Ersatz für die manuelle Codeüberprüfung, sehe aber eine erhebliche Qualitätssteigerung. Demnächst!
Jerric Lyns John
Es wäre großartig, wenn jemand bereits ein Roslyn-basiertes Tool erstellt hätte, um Code, der CodeDom verwendet, in Code zu konvertieren, der Roslyns SyntaxFactory verwendet ... (Zum Teil, weil .Net Core Roslyn hat, aber kein CodeDom, und ich eine Bibliothek verwende, die auf CodeDom basiert )
Emyr
43

Mit CodeDom können Sie kompilieren, aber es gibt Ihnen nicht die Möglichkeit, wirklich Informationen über den Code selbst abzurufen (außer Compilerfehlern). Grundsätzlich handelt es sich um eine Black Box, in der Sie "Kompilieren" und "Ich habe es geschafft" oder "Ich habe versagt, hier sind einige Fehler" sagen.

Mit Roslyn können Sie den Code im laufenden Betrieb vollständig überprüfen und ausbauen. Dazu gehören Dinge wie das Anzeigen / Überprüfen der Kommentare in einem Quellcode, detaillierte Informationen zur vollständigen Struktur usw. Sie können den gesamten Syntaxbaum der Quelle, die Sie an Roslyn übergeben, abrufen und detaillierte Analysen durchführen oder Transformationen darauf.

Angesichts der vollständigen, umfassenden Syntaxinformationen verfügen Sie über eine enorme zusätzliche Kontrolle und Flexibilität. So funktioniert beispielsweise das Beispiel, das einen Block C # -Code kopiert und als VB.NET-Code einfügt. Mit Roslyn können Sie mehr als nur kompilieren - Sie können auch den Code selbst sauber bearbeiten. Dies sollte die Generierung vieler Tools erheblich vereinfachen, da Dinge wie Refactorings sehr einfach durchgeführt werden können, da das Tool die vollständige Syntax einschließlich Metainformationen (wie Kommentare) versteht und direkt damit arbeiten kann.

Reed Copsey
quelle
12

Ein großer Unterschied, den ich sehe: Mit CodeDom geschieht dies jedes Mal, wenn Sie C # oder VB.NET kompilieren, außerhalb des Prozesses. CSC.exe oder VBC.exe sind die wirklichen Arbeiter hinter den Kulissen.

Wenn Sie einen Dienst in Bezug auf Architektur, Skalierbarkeit, Isolation usw. erstellen möchten (Sie erwähnen Azure), ist dies nicht sehr gut.

Mit Roslyn ist es in Bearbeitung.

Ich nehme an, dies ist einer der Gründe, warum sie es "Compiler as a Service" nennen.

Außerdem ist CodeDom eine relativ schlechte API, es fehlen viele Funktionen und sie ist nicht wirklich auf dem neuesten Stand, da sie hauptsächlich zur Unterstützung der automatischen Codegenerierung von Visual Studio UI-Designern entwickelt wurde. Ich denke, Roslyn wird es viel besser machen, da es von den Leuten geschrieben wurde, die die Compiler schreiben. Ich hoffe, das wird den Unterschied machen.

PS: Ein bemerkenswerter Unterschied zu CSC.exe und VBC.exe: Roslyn scheint reines .NET zu sein (und verwendet CCI ).

Simon Mourier
quelle
8

Roslyn ermöglicht eine viel feinere Steuerung des gesamten Prozesses - zum Beispiel können Sie die Zeichenfolge analysieren und sogar zusätzlichen Code generieren (im laufenden Betrieb innerhalb des Kompilierungsprozesses basierend auf der Analyse) usw.

CodeDom verwendet "nur den Compiler", während Roslyn "Compiler als Dienst mit vollem Zugriff auf (Unter-) Teile" ist. Mit Roslyn befinden Sie sich "im Compiler" und können sehen, wie der Code aus Compilersicht aussieht So können Sie Dinge auf eine Weise ändern, die derzeit nicht möglich ist.

Sie können beispielsweise Roslyn verwenden, um C # zu erweitern - etwas sehr Praktisches und viel Besseres als der aktuelle Stand der AOP-Implementierung.

Eine Übersicht über den aktuellen Roslyn-Status und die verschiedenen Zugriffs- und Kontrollebenen finden Sie unter http://msdn.microsoft.com/en-us/hh500769

AKTUALISIEREN

Microsoft hat gerade ein neues CTP mit zusätzlichen Funktionen und vielen API-Änderungen / Ergänzungen verfügbar gemacht. Details finden Sie hier .

Yahia
quelle
1
Eigentlich stimmt es nicht, dass Sie Roslyn verwenden können, um C # um zusätzliche Schlüsselwörter zu erweitern.
Dustin Campbell
danke ... korrigiert ... obwohl nicht in der ersten Veröffentlichung bin ich hübsch, dass dies möglich sein wird ...
Yahia
2
@DustinCampbell, was ist, wenn Sie den Compilerfehler behandelt haben, den das Pseudo-Schlüsselwort durch das Generieren von Code verursacht hat?
Rodrick Chapman
3
Sie müssen ein Umschreiben durchführen, bevor Sie es an den Compiler übergeben. Analysieren Sie zunächst den Code mit Ihren speziellen Schlüsselwörtern. Der Code wird analysiert und die ungültigen Schlüsselwörter werden im resultierenden Baum als SkippedTokenTrivia angezeigt, sofern der Parser keine Kopf- oder Zahlpunkte daraus erstellen konnte. Erkennen Sie dann die übersprungenen Schlüsselwörter und schreiben Sie den Baum mit gültigem Code neu (z. B. AOP-Weberei). Übergeben Sie schließlich den neuen Baum an den Compiler. Dies ist definitiv ein Hack und es ist nicht garantiert, dass es mit zukünftigen Versionen von Roslyn funktioniert. Beispielsweise erzeugt der Parser in zukünftigen Versionen möglicherweise nicht denselben Baum für fehlerhaften Code.
Dustin Campbell
@DustinCampbell: Aber wird es ETWAS geben, das das Weben von AOP im Finale von Roslyn erlaubt? Mein Mono.Cecil INPC-Weben funktioniert so gut wie es ist, aber wenn ich schreiben könnte public notifying string Name {get;set;}, wäre das noch großartiger
TDaver