2016-04-24 11 views
2

Nach dem Lesen this article über Roslyn. Ich bin auf zwei Dinge gestoßen, die ich nicht verstanden habe.Was ist ein dekompilierter Compiler? Wie erhält C# die Fähigkeit einer dynamischen Sprache, während der Laufzeit über Roslyn Code zu generieren und aufzurufen?

  • dekonstruiert Compiler
  • C# gewinnt eine dynamische Sprache Fähigkeit Code zur Laufzeit über Roslyn

Ich habe ein viele Beiträge über Stapelüberlauf und gegoogelt danach gesucht zu erzeugen und aufzurufen. aber konnte nicht das ganze Bild bekommen.

Kann jemand mir bitte erklären, oder mir über diese Themen mit einigen Links und Ressourcen richten.

+0

Ein "dekonstruierter" Compiler ist einer, dessen Elemente verfügbar sind. Dies ermöglicht es, dass Nicht-Compiler-Builder einige Compiler-ähnliche Aufgaben ausführen können. Eine allgemeinere Alternative ist ein Programmtransformationssystem https://en.wikipedia.org/wiki/Program_transformation, das Compiler-ähnliche Maschinen für eine Vielzahl von Sprachen verfügbar macht, anstatt nur eine. Siehe meine Biographie für einen Link zu Details über eine dieser. –

Antwort

4

aus dem verlinkten Artikel Genommen:

Hejlsberg zeigte ein C# Programm, das ein paar Code-Schnipsel zu der C# -Compiler als Strings übergeben; der Compiler zurückgegeben den resultierenden IL Assembler-Code als ein Objekt, das dann an der gemeinsamen Language Runtime (CLR) zur Ausführung übergeben wurde. Voilà! Mit Roslyn erhält C# die dynamische Sprache , mit der Code zur Laufzeit generiert und aufgerufen werden kann.

Der Teil von:

[...] C# gewinnt eine dynamische Fähigkeit, Sprache zu erzeugen und Code zur Laufzeit aufzurufen.

... ist nur eine sehr falsche Annahme durch den Blog-Post Autor gemacht ...

  1. Code aus einer Anwendung kompilieren lässt sich nicht C# in eine dynamische Sprache oder es doesn 't neuen C# Compiler in einem Ersatz eines Interpreters ...

  2. C# konnte Code zur Laufzeit seit seiner Gründung mit Reflection Emit generieren. Es scheint, wie der neue Compiler nicht dieses Feature hinzufügen, aber trotzdem ist es einfacher, Code aus regulären C# -Code mit dem neuen Compiler zu generieren als mit Reflection auszusenden. Darüber hinaus, wie @hvd in einigen Kommentaren festgestellt hat, war es auch seit C# Einführung mit CSharpCodeProvider möglich.

  3. C#, da .NET 4.0 kann mit dynamischen Sprachen interoperabel mit der Dynamic Language Runtime, die erstellt wurde, um die Tür zu öffnen Sprachimplementierungen auf der .NET zu interpretieren (und auch COM-Interop zu erleichtern. ..).

Über die andere Frage (die Sache über dekonstruiert Compiler), bedeutet dies, dass die neue C# Compiler ermöglicht es Ihnen, einen anderen Code einzuhaken Aktionen auf Schritte C# Zusammenstellung basiert auszuführen.

Ich würde einen Blick auf Roslyn Overview on GitHub nehmen, wo viele Details sind da, die mehr Tiefe zu dem Thema geben sollte.

+1

C# konnte seit .NET 1 über die 'CSharpCodeProvider'-Klasse auch zur Laufzeit C# -Code kompilieren und ausführen. Ja, der Artikel ist einfach sehr falsch. – hvd

+1

@hvd Ich habe das auch zu meiner Antwort basierend auf Ihrem Kommentar hinzugefügt. Und ja, es scheint, als ob es diese Art von Artikeln ist, die gemacht werden, um Google-Seitenrang zu bekommen ...:/ –

+0

@ MatíasFidemraizer über den dekonstruierten Compiler, ich habe die Antwort nicht sehr gut verstanden. Könntest du uns ein bisschen mehr erklären? – alamin