Frage

Weiß jemand, der ein verwaltet Programmiersprache implementiert auf .NET, die einen spezialisierten Datentyp enthält, die nicht bis zum Common Type Systems / FCL / BCL zugeordnet ist oder eine, die nicht geliefert hat .NET-Äquivalent (zB ausgeliefert Standardtypen wie System.String, System.Int32)?

Diese Frage wahrscheinlich aus der Perspektive von jemandem Portierung einen Compiler kommen würde (obwohl ich tue das nicht).

Ist es so einfach wie die Sprache einen neuen Datentyp außerhalb des BCL / FCL für seine spezielle Art zu schaffen? Wenn dies der Fall erledigt diese hinder Interoperabilität Sprachen zwischen Programmierung, die sonst gewohnt sind Abbilden alle eingebauten Datentypen, was in der BCL / FCL, wie Visual Basic und C #?

Ich kann diese Situation vorstellen, über kommen könnte, wenn ein unbekannter Sprache Compiler irgendeine Art zu .NET portiert wird, für die es keine direkte Zuordnung eines seiner impliziten Datentypen in dem verschifft Framework.

Wie wird sich diese Situation im Allgemeinen unterstützt oder erlaubt? Was wäre die Erwartung des Compilers und die Common Language Runtime?

War es hilfreich?

Lösung

Delphi für .NET implementiert den Begriff der Delphi Sprache der Klassenvariablen (die einen Verweis auf einen Klassentyp halten kann), virtuelle Klassenmethoden und virtuelle Bauer (über eine Klassenreferenz genannt). Keiner von ihnen haben keine direkte analoge in CLR - statische Methoden in CLR nicht virtuell sein kann, und Konstrukteure können nicht virtuell sein.

Da CLR hat eine so reiche Suppe von Laufzeittypinformationen werden diese Artefakte nicht streng in CLR benötigt. Wenn Sie eine Instanz eines Typs zur Laufzeit in Code erstellen möchten, die nicht den genauen Typ zum Zeitpunkt der Kompilierung nicht kennt, kann man mit Reflexion oder andere Techniken zu tun. Diese Merkmale der Sprache Delphi entstand aus dem nativ kompilierten Win32 Produkt, bei dem Laufzeittypinformationen beschränkt ist. Das alles wurde auf .NET implementiert 1.0 und 1.1, lange bevor irgendetwas wie das DLR kam.

Diese Delphi Sprachfunktionen in CLR könnten Reflexion mit emuliert, aber aus Leistungsgründen entschieden sie sie direkt in IL zu implementieren, indem eine „Meta-Klasse“ Art zu schaffen, die ein Beiwagen zu jedem Klassentyp in Delphi erklärt wurde. Wenn Delphi-Code einen Delphi-Klasse-Typ zu einer Klasse Referenzvariable zugewiesen ist, haben wir ein IL-Code die einzelne Instanz der entsprechenden meta-Klasse zu den Variablen zuzuordnen. Virtuelle Methodenaufrufe über die Klassenreferenzvariable wurden als IL virtuelle Methodenaufrufe auf der Meta-Klasseninstanz codegen'd, die in der entsprechenden Klassentyp der tatsächlichen statischen Methodenimplementierung prallt. Dies erlaubte die Klasse virtueller Methodenaufrufe polymorph noch zu verhalten (die Umsetzung je nach Art der Instanz den Anruf zu tätigen verwendet zu nennen) und mit minimalen Laufzeit-Performance Kosten. Diese Implementierung wurde auch typsicher und überprüfbar sind.

waren Diese virtuellen Klassenmethode Merkmale nur für Klassen in Delphi-Syntax deklariert und nur verwendbar in Delphi-Syntax. Ich glaube, die Meta-Typen markiert wurden als Nicht-CLS so gefällig, dass andere .NET-Sprachen wären (wahrscheinlich), um sie ignorieren, wenn Klassen in Delphi erstellt. Andere .NET-Sprachen konnte nicht Verwendung dieser Delphi spezifischen Sprachfunktionen machen (es sei denn, der Entwickler wirklich bestimmt wurde und kletterte durch das Gerüst die entsprechenden Anrufe an / über den hässlichen Namen Meta-Klassen zu machen)

In der Regel sollten Sie nicht andere Sprachen erwarten zu nutzen Nicht-CLS Artefakte von / für Ihre Sprache erstellt. Wenn Sie andere Sprachen Verwendung von Sachen von Ihrer Sprache erstellt machen wollen, müssen Sie herausfinden, wie Ihre speziellen Sauce vertreten in einer Weise, die in CLS-konformen Bedingungen in einer angemessenen Art und Weise dargestellt werden kann. Das kann nicht möglich sein, in Abhängigkeit von der Art der speziellen Sauce.

Delphi virtuelle Klassenmethoden waren zu anderen .NET-Sprachen wie normale statischen Methoden zur Verfügung. Die polymorphe Natur wurde nicht weitgehend zu anderen .NET-Sprachen ausgesetzt, da CLS (noch andere Sprachen) einfach nicht den Begriff ausdrücken kann.

Im Idealfall würde jede Sprache der Lage sein, genauso gut jeden erdenklichen Konstrukt zum Ausdruck bringen. Aber in Wirklichkeit ist das nicht der Fall ist. Einige grafische Darstellung Funktionen sind einfacher auszudrücken in kartesischen Koordinaten, während andere stark vereinfacht werden durch Polarkoordinaten. Das gleiche gilt für Programmiersprachen.

Es ist in Ordnung, neue Ausdrucksmittel in Ihrer eigenen Sprache zu erfinden, auch wenn es auf CLR implementiert wird. Nur sicher sein, eine klare Definition zu halten, was Ihre Typen aussehen Programmierer außerhalb Ihrer Sprache zu arbeiten, wenn Sie Ihren Sprachcode erwarten von anderen aufgerufen werden. Ihre Umsetzung wird eine Dualität hat:., Wie es für die Nutzer Ihrer Sprache aussehen, und wie die Dinge aussehen, um Benutzer außerhalb der Sprache

Fußnote: Ich glaube nicht, irgendetwas davon gilt für das neue Delphi Produkt für .NET, Delphi Prism. Ich glaube nicht, Delphi Prism virtuelle Klassenmethoden unterstützt.

Andere Tipps

Not really. Any language has the ultimate burden of having to be able to run on commodity hardware to be successful. The CTS is a pretty good model for types that can be efficiently handled on current hardware.

What may be needed is a big chunk of runtime support to adapt between the language's type system and the CLI's. A classic example is the DLR, the runtime support system for dynamic languages like Python and Ruby. It essentially does what such a language interpreter must do as well, it has comparable perf. No tricks btw, everything is pure C# code.

Such a runtime support library may get slow when the language has features that are not available at all. Multiple inheritance for example. It is natively 'supported' by the CLR and JIT compiler. You can take about any standard compliant C++ program that uses MI, run it through the C++ compiler with the /clr option and you'll end up with an assembly that contains pure IL that will be just-in-time compiled at runtime. By no stretch of the imagination could you call the result a managed program, it won't be verifiable and it won't use the garbage collector. Solving that is going to require a support library that's going to have to emulate multiple inheritance. Possible, I doubt it will be competitive.

Well, there's c++/cli. There you can create c++ classes that are not visible in .net. Is that what you're after?

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