Frage

In Anders Hejlsbergs .NET 4.0 -Präsentation, die er in Net 5.0 ("oder einer zukünftigen Veröffentlichung") diskutierte, arbeiten sie an einem "Compiler als Service" -Modell.

Anders Hejlsbergs Staaten: [Quelle] [1] "Wir möchten unseren Compiler öffnen, damit es zu einer API wird, die Sie anrufen können, um ein Stück Code zu kompilieren und Back -Bäume und/oder IL zu erhalten. Dies ermöglicht eine ganze Reihe von Szenarien, wie die Programmierbarkeit von Anwendungen, eine interaktive Eingabeaufforderung, benutzerschriebene Refaktorings und domänenspezifische Sprachen, in denen nur kleine Inseln von C# eingebettet sind. "

Ich kämpfe darum, ein Beispiel in der realen Welt zu finden, in dem dies tatsächlich nützlich sein könnte. Vermisse ich hier das Hauptkonzept? Oder wird das wirklich der Sprache zugute kommen?

[1]: http://www.simple-talk.com/opinion/geek-of-week/anders-hejlsberg-geek-of-week/ Compiler als Service

War es hilfreich?

Lösung

Bei einigen Problemen ist es einfacher, ein Programm zu schreiben, das ein Programm generieren kann, das das tatsächliche Problem lösen kann. Ein Bereich, in dem dies besonders nützlich ist, ist der Bau von Parsers für Compiler.

In anderen Fällen können Sie im laufenden Fliegen Code generieren, der auf eine optimale Leistung bei der Arbeit mit einem bestimmten Datentyp zugeschnitten werden kann, wessen Eigenschaften Sie gerade zur Laufzeit gelernt haben, indem Sie über seine Metadaten reflektieren. Ein Beispiel, das ich Ihnen geben kann, ist mein Modelshredder Projekt. Grundsätzlich nimmt es alle Felder und Eigenschaften eines Objekts auf und packt ihren Wert in ein Objektarray.

Mein erster Ansatz für dieses Problem war die handkodierte MSIL -Injektion mit Verwendung Reflection.Emit. Der zweite Ansatz war etwas dynamischer und stützte sich auf Expressionsbäume, die zur Laufzeit effektiv konstruiert und kompiliert werden können, um die gleiche Funktionalität wie meine Hand -codierte MSIL -Injektion zu liefern. Sie können das im Morelinq -Kofferraum sehen (schauen Sie sich nur die ModelShredder -Site an, da ist ein Link dafür). Wenn ich als Dienst als Dienst einen Dienst zu haben, kann ich tatsächlich die Abstraktionsebene erhöhen und den C# -Code ausgeben, der dann in MSIL zusammengestellt wird.

Der Fall für domänenspezifische Sprachen wurde bereits vorgenommen, auch ich denke, dass eine imperative Sprache wie C# für das Szenario "Befehlszeilen" nicht gut geeignet ist, sondern für größere Skripte. Es gibt ein ordentliches Make -System basierend auf einer F# DSL namens GEFÄLSCHT, was viele Konzepte des Compilers als Dienstleistung aufweist. Ähnliche Konzepte werden im interaktiven Fenster F# (heißt es auf diese Weise?) In Visualstudio.

Andere Tipps

Ein Beispiel in der realen Welt dafür, wie dies nützlich sein könnte, ist für die Benutzerverletzung für Spiele. Die meisten modernen Spiele ermöglichen eine Art von Benutzernusextensibilität durch Skriptsprachen, die relativ langsam oder durch kompilierte DLLs sein können, für die eine Entwicklungsplattform (und das Wissen) erforderlich ist. Auf diese Weise können Benutzer mit C#Erweiterungen in das Spiel schreiben, das vom Spiel zur Laufzeit kompiliert wird, ohne dass der Benutzer es selbst kompilieren muss. Es würde auch das Testen neuer Ideen ermöglichen, indem Sie beispielsweise C# Code in einem Fenster in Spielkonsolen eingeben, ohne das Spiel für jede kleine Änderung neu starten zu müssen. Derzeit ist diese Art von Dingen mit eingebetteten interpretierten Skriptsprachen nur wirklich möglich.

Ich denke, ein weiteres Beispiel ist Kopierschutz. Sie können einen eindeutigen Code auf Ihrem Computer haben, der bei der Installation generiert wird, um ein Programm an eine CPU -ID zu binden.

Nehmen wir an, ich verwende Ihre Seriennummer als Parameter in der Steuerberechnung. Eine Kopie des Programms ist einfach und völlig nutzlos.

Außerdem macht das Schreiben von Programmen, die eine ähnliche Funktionalität wie Linqpad haben, sehr einfach.

Ein weiterer Anwendungsfall könnte für die Verwendung von in einer Datenbank gespeicherten Quellcode verwendet und bestimmte Daten basierend auf Konfigurationen aufgerufen werden, ähnlich wie die Workflow -Foundation jetzt aufgerufen werden kann. Dies könnte bei der Workflow -Automatisierung für CRMs, ERPs und andere Data Warehousing -Anwendungen beitragen (obwohl dies, wenn dies missbraucht wird, eine epische Antipatern darstellen würde).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top