Übersicht über die Dynamic Language Runtime

Die Dynamic Language Runtime (DLR) ist eine Runtimeumgebung, die der Common Language Runtime (CLR) eine Reihe von Diensten für dynamische Sprachen hinzufügt. Die DLR erleichtert die Entwicklung dynamischer Sprachen für die Ausführung in .NET und das Hinzufügen von dynamischen Funktionen zu statisch typisierten Sprachen.

Dynamische Sprachen können den Typ eines Objekts zur Runtime identifizieren, wogegen Sie in statisch typisierten Sprachen wie C# und Visual Basic (wenn Sie Option Explicit On verwenden) die Objekttypen zur Entwurfszeit angeben müssen. Beispiele für dynamische Sprachen sind Lisp, Smalltalk, JavaScript, PHP, Ruby, Python, ColdFusion, Lua, Cobra und Groovy.

Die dynamischsten Sprachen bieten die folgenden Vorteile für Entwickler:

  • Die Möglichkeit, schnelle Feedbackschleifen (REPL oder „Lesen-Auswerten-Ausgeben-Schleife“) zu verwenden. Dadurch können Sie mehrere Anweisungen eingeben und sie sofort ausführen, um die Ergebnisse anzuzeigen.
  • Unterstützung für Entwicklung „von oben“ und die traditionellere Entwicklung „von unten“. Wenn Sie z. B. einen Top-down-Ansatz nutzen, können Sie Funktionen aufrufen, die noch nicht implementiert wurden und dann zugrunde liegende Implementierungen hinzufügen, wenn Sie diese benötigen.
  • Einfachere Umgestaltung und Codeänderungen, weil Sie die statischen Typdeklarationen im gesamten Code nicht verändern müssen.

Dynamische Sprachen können hervorragende Skriptsprachen sein. Kunden können Anwendungen leicht erweitern, die mithilfe dynamischer Sprachen mit neuen Befehlen und Funktionen erstellt wurden. Dynamische Sprachen werden auch häufig zum Erstellen von Websites und Testumgebungen, zum Verwalten von Serverfarmen, zum Entwickeln verschiedenster Hilfsprogramme und zum Ausführen von Datentransformationen verwendet.

Der Zweck der DLR ist, einem System von dynamischen Sprachen zu erlauben, unter .NET ausgeführt zu werden und diesen Sprachen .NET-Interoperabilität zu verleihen. Die DLR fügt C# und Visual Basic dynamische Objekte hinzu, um dynamisches Verhalten in diesen Sprachen zu unterstützen und ihre Interoperation mit dynamischen Sprachen zu ermöglichen.

Die DLR hilft Ihnen auch beim Erstellen von Bibliotheken, die dynamische Operationen unterstützen. Wenn Sie beispielsweise über eine Bibliothek verfügen, die XML- oder JavaScript Object Notation-Objekte (JSON-Objekte) verwenden, können Ihre Objekte als dynamische Objekte für Sprachen, die DLR verwenden, erscheinen. Dadurch können Benutzer von Bibliotheken syntaktisch einfacheren und natürlicheren Code für das Arbeiten mit Objekten und den Zugriff auf Objektmember schreiben.

Sie verwenden z.B. möglicherweise den folgenden Code, um einen Zähler in XML in C# zu inkrementieren.

Scriptobj.SetProperty("Count", ((int)GetProperty("Count")) + 1);

Mit DLR können Sie den folgenden Code statt des gleichen Vorgangs verwenden.

scriptobj.Count += 1;

Wie die CLR ist die DLR Teil von .NET. Sie steht im Repository IronLanguages/dlr auf GitHub zum Herunterladen zur Verfügung.

IronPython ist ein Beispiel für eine Sprache, die mit der DLR entwickelt wurde.

Wesentliche Vorteile der DLR

Die Verwendung der DLR bietet die folgenden Vorteile:

Vereinfacht das Übertragen von dynamischen Sprachen zu .NET

Die DLR ermöglicht Verantwortlichen für die Sprachimplementierung die Erstellung lexikaler Analyzer, Parser, semantischer Analyzer, Codegeneratoren und anderen Tools, die sie normalerweise selbst hätten erstellen müssen. Damit die DLR verwendet werden kann, muss eine Sprache Ausdrucksbaumstrukturen erstellen, die den Code auf Sprachebene in einer verzweigten Struktur, in Runtimehilfsfunktionen und optionalen dynamischen Objekten darstellen, die die IDynamicMetaObjectProvider-Schnittstelle implementieren. Die DLR und .NET automatisieren viele Aufgaben zur Codeanalyse und Codegenerierung. Dadurch können sich Verantwortliche für die Sprachimplementierung auf eindeutige Sprachfunktionen konzentrieren.

Ermöglicht dynamische Funktionen in statisch typisierten Sprachen

Vorhandene .NET-Sprachen wie C# und Visual Basic können dynamische Objekte erstellen und diese zusammen mit statisch typisierten Sprachen verwenden. C# und Visual Basic können z. B. dynamische Objekte für HTML, Dokumentobjektmodell (DOM) und Reflexion verwenden.

Bietet langfristige Vorteile von DLR und .NET

Sprachen, die mithilfe der DLR erstellt wurden, können von zukünftigen DLR- und .NET-Verbesserungen profitieren. Wenn beispielsweise eine neue Version von .NET veröffentlicht wird, die über einen verbesserten Garbage Collector verfügt oder eine schnellere Ladezeit für Assemblys bietet, erhalten durch die DLR implementierten Sprachen sofort denselben Vorteil. Wenn die DLR Optimierungen hinzufügt, z.B. eine verbesserte Kompilierung, verbessert sich auch die Leistung für alle Sprachen, die mithilfe der DLR implementiert wurden.

Ermöglicht die Freigabe von Bibliotheken und Objekten

Die in einer Sprache implementierten Objekte und Bibliotheken können von anderen Sprachen genutzt werden. Die DLR lässt auch die Interoperation zwischen statistisch typisierten und dynamischen Sprachen zu. Zum Beispiel kann C# ein dynamisches Objekt deklarieren, das eine Bibliothek verwendet, die in einer dynamischen Sprache geschrieben ist. Gleichzeitig können dynamische Sprachen Bibliotheken aus .NET Framework verwenden.

Bietet schnellen dynamischen Versand und Aufruf

Die DLR bietet eine schnelle Ausführung dynamischer Vorgänge durch Unterstützung des erweiterten polymorphen Zwischenspeicherns. Die DLR erstellt Regeln für das Binden von Vorgängen, die Objekte für die nötigen Runtime-Implementierungen verwenden, und speichert diese Regeln zwischen, um ressourcenermüdende Bindungsberechnungen während der aufeinander folgenden Ausführungen desselben Codes auf den gleichen Objekttypen zu vermeiden.

DLR-Architektur

Die DLR fügt der CLR eine Reihe von Diensten hinzu, um dynamische Sprachen besser zu unterstützen. Einige dieser Dienste sind:

  • Ausdrucksbaumstrukturen. Die DLR verwendet Ausdrucksbaumstrukturen, um Sprachsemantik darzustellen. Zu diesem Zweck hat die DLR LINQ-Ausdrucksbaumstrukturen erweitert, um die Ablaufsteuerung, Zuweisung und andere Knoten für die Sprachmodellierung. Weitere Informationen finden Sie unter Ausdrucksbaumstrukturen (C#) oder Ausdrucksbaumstrukturen (Visual Basic).

  • Zwischenspeichern der Aufrufwebsite. Eine dynamische Aufrufwebsite ist ein Ort im Code, an dem Sie einen Vorgang wie a + b oder a.b() auf dynamischen Objekten ausführen können. Die DLR speichert die Eigenschaften von a und b (normalerweise die Typen dieser Objekte) sowie Informationen über den Vorgang. Wenn solch ein Vorgang zuvor ausgeführt wurde, ruft die DLR alle nötigen Informationen aus dem Cache für den schnellen Versand ab.

  • Dynamische Objektinteroperabilität Die DLR stellt einen Satz von Klassen und Schnittstellen bereit, die dynamische Objekte und Vorgänge darstellen und von Verantwortlichen für die Sprachimplementierung und Autoren dynamischer Bibliotheken genutzt werden können. Diese Klassen und Schnittstellen enthalten IDynamicMetaObjectProvider, DynamicMetaObject, DynamicObject und ExpandoObject.

Das DLR verwendet Binder in Anrufstandorten, um nicht nur mit .NET, sondern auch mit anderen Infrastrukturen und Diensten wie COM zu kommunizieren. Binder kapseln die Semantik einer Sprache ein und geben an, wie Vorgänge in einer Aufrufwebsite durchgeführt werden, indem Ausdrucksbaumstrukturen verwendet werden. Dadurch werden dynamische und statisch typisierte Sprachen aktiviert, die die DLR zum Freigeben von Bibliotheken und Erhalten von Zugriff auf alle Technologien verwenden, die die DLR unterstützt.

DLR-Dokumentation

Weitere Informationen zur Verwendung der Open-Source-Version der DLR zum Hinzufügen dynamischen Verhaltens zu einer Sprache oder Informationen dazu, wie Sie die Verwendung einer dynamischer Sprache mit .NET aktivieren, finden Sie in der Dokumentation im Repository IronLanguages/dlr auf GitHub.

Weitere Informationen