Frage

Ich bin gerade erst anfangen zu versuchen, mehr über die .NET-VM Untermauerung zu lernen, und mir sofort von etwas abgeworfen. Ich weiß, es ist die neue Sache des DLR, die für all dynamischen Sachen in C # und den Laufe der IronX Sprachen ermöglicht genannt. Aber jetzt lese ich über diese Sprache Boo genannt, und anscheinend hat es dynamische Fähigkeiten hat seit lange vor dem DLR existierte. Also,

1) Wie ist das überhaupt möglich?

2) Was bedeutet die DLR In der Gleichung?

3) würde eine Sprache wie Boo stehen, etwas zu gewinnen, indem sie Neuimplementierung sich in Bezug auf die DLR?

Von dem, was habe ich irgendwie hier versammelt und dort sieht es aus wie das DLR von Ironpython herauskam, wenn sie alles herausgerechnet, die für DL-Unterstützung in .NET notwendig war, und es in wieder verwendbarer Form gebracht. Also, was ich vermute, dass das DLR ist nichts Besonderes, nur einige Bibliotheken, die helfen, mit dynamischen Objekten in Microsoft.Scripting.dll, aber nichts, dass Sie konnte nicht einfach rausgehen und Code selbst, wenn Sie sich die Zeit hatte, die ich denke, ist das, was für Boo passiert? Und dann für 2 und 3, ich denke, die Gemeinsamkeit und Wiederverwendung des DLR würde künftige DLR Verbesserungen erlaubt automatisch grandfathered werden, aber dass es keine dringende „Notwendigkeit“, um neu zu implementieren das DLR verwenden, wenn Sie bereits haben, dass Ihre eigene individuelle Laufzeit? Oder hat das DLR ein Geheimnis MS Soße, die es als alles besser macht wir oben auf .Net?

tun könnte

4) Ist das DLR wirklich eine Laufzeit oder nur eine Reihe von Bibliotheken? (Was genau ist eine Runtime-haupt? Ich wahrscheinlich brauchen mehr Compiler Theorie lernen, bevor ich auch nur eine Antwort auf diese Frage verstehen kann, oder ob es auch eine Frage, die Mittel nichts. Diese Frage ignorieren. Oder nicht.)

5) Wie funktioniert Ironpython Compilation Arbeit? Hat kompilieren es auf eine neue dynamische Version des CIL nach unten, oder ist es nur ein prepend „ironpython.exe“ Befehl in einen String mit dem Text des Programms darin? Hmm, gut, wenn dynamisch ein Schlüsselwort in C # ist, dann muss es eine dynamische Version des CIL, nicht wahr? Wie funktioniert Net wissen, ob die CLR oder das DLR auf der CIL benutzen?

6) Ist das DaVinci-Projekt für die verschiedenen JVM? Es sieht aus wie es ist eine tatsächliche Re-Implementierung der JVM selbst. Was sind die Auswirkungen dieses Ansatzes? Ich vermute, es gibt große Performance-Gewinne, aber etwas anderes? Gibt es Gründe, MS hat diese Straße nicht nehmen?

7) Ist das DLR make Boo etwas veraltet für DSLs machen?

War es hilfreich?

Lösung

Das DLR bringt im Grunde drei Dinge an die Partei:

  • Ein erweiterter Ausdrucksbäumen (erste w / LINQ eingeführt), die Kompilierung komplette Programme ermöglichen. Diese bieten einen viel einfacheren Weg, um Code zu generieren als IL Erzeugung direkt - es ist von vielen Fällen in der Lage, entledigt sich ungültig IL zu erzeugen und dann viele weitere Fälle in leicht debugLaufZeit Ausnahmen
  • .
  • gebaut A in Aufrufort Caching-Mechanismus, so dass Sie Ihre eigenen (sehr nützlich für eine gute Leistung in dynamischen Sprachen) nicht erstellen müssen. Dazu gehören Dinge wie ein Multi-Level-Cache und nicht verwendete Elemente Alterung aus.
  • Ein Metaobjekt-Protokoll, das zur Laufzeit miteinander dynamische Sprachen zu reden erlaubt und verhandeln das richtige Ergebnis für die anrufende Sprache (zum Beispiel Zurückkehren in JavaScript nicht definiert, wenn ein Mitglied nicht vorhanden ist oder ein Attribut in Python unabhängig von dem Wurf Sprache wurde das dynamische Objekt geschrieben in).

Das Metaobjekt-Protokoll ist das einzige Stück, das unbedingt braucht geteilt werden - alles, was Sie auf Ihre eigene Gruppe gründen könnte.

Ironpython baut vollständig auf der Oberseite des DLR - so ist es Kompilierungsmodell eigentlich zum Ausdruck Bäume zu kompilieren. Die DLR innere Schicht, die w / .NET Version 4.0 ausgeliefert wird verwendet, um diese Ausdrucksbäume zu erstellen und verwenden wir die Dolmetscher, die ein Stück der äußeren Schicht ist diese Ausdrucksbaumstrukturen zu interpretieren. Wir können dann kompilieren lazily die Ausdrucksbäume, nachdem die interpretierten Versionen heiß geworden sind. Die Zusammenstellung umfasst die Produktion von Call-Site, die wir für dynamische Dispatch verschiedener Operationen verwenden (immer, Mitglieder Einstellung, Objekte aufrufe, etc ...) und wieder verwenden wir die DLR - in diesem Fall ist es der Aufrufort Mechanismus. Ironpython verwendet eine Kombination aus beiden Standards DLR Bindemittel für diese Operationen zusammen mit kundenspezifischen Bindemitteln, dem Ironpython-spezifische Aktionen zu tun (fließen durch den Code Zusammenhang unterstützt * args und ** args Anrufe, etc ...), die dann auf Standard DLR Bindemittel zurückgreifen für Interop.

Das Davinci Projekt hinzufügen „Methode Griffe“ an die JVM, die die CLR bereits in Form von Delegierten haben. Es wird auch eine neue „invokedynamic“ opcode hinzufügen, die die CLR nicht über und haben w / DLR Arbeit nicht gewinnen. Stattdessen wird das DLR nutzt nur die vorhandenen Primitiven (Delegierten, verdinglicht Generika) sowie Bibliotheken für die Definition des Interop-Protokolls. Beide fügen Sie das Konzept von Call-Standorten und kann ziemlich ähnlich sein zwischen den beiden.

Andere Tipps

Viele Fragen hier! Ich bin nicht sicher, kann ich antworten alle von ihnen, aber ich werde so viel tun, wie ich kann:

  1. Boo ist nicht dynamisch im gleichen Sinne, dass (Eisen) Python ist. Es ist vor allem eine statisch typisierte Sprache mit starken Typinferenz und pythonic Syntax. Dies, in Verbindung mit dem optionalen Ente eingeben, geben Sie ihm ein sehr dynamisches Gefühl, aber es ist sicherlich nicht das gleiche wie Python. Boo ist ähnlich (mit Ausnahme der Syntax) auf C # 4 als Python.

  2. fügt DLR dynamische Unterstützung für Sprache Implementierer oben auf der CLR, die mehr in Richtung statisch typisierten Sprachen ausgerichtet ist (wie VB.NET, C #, F #)

  3. Nicht wirklich IMHO. Es würde zu ähnlich Ironpython. Gerade eine der Eigenschaften von Boo ist, dass es statisch typisiert wird.

  4. Runtimes sind Bibliotheken, die einige grundlegende Konstrukte in der Sprache zu unterstützen. VB.NET, C #, F #, Boo, sie haben alle Laufzeitbibliotheken. Sie in der Regel nie VB.NET oder C # Runtimes sehen, weil sie mit dem .NET-Framework kommen. Es gab eine große Antwort auf SO über das von Eric Lippert, aber ich kann es nicht finden.

  5. Kann nicht Kommentar zu diesem Thema, hat nicht viel praktische Erfahrung mit Ironpython.

  6. Sie wissen nicht, über das DaVinci-Projekt kann nicht Kommentar zu diesem Thema.

  7. Nein. Soweit ich Boo Makros und erweiterbare Compiler wissen, sind einzigartig für eine .NET-Sprache ( Nemerle hat ähnliche Makro-Fähigkeiten). Ich kann nicht wirklich sagen, wenn Boo DSLs mehr sein kann oder weniger leistungsfähig als Ironpython DSLs. Was kann ich sicher sagen, dass die Umsetzung von Boo DSLs ist wild verschiedener von der implentation von Python DSLs.

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