Possibilité de type de données de langage non mis en correspondance avec .NET Framework expédié?

StackOverflow https://stackoverflow.com/questions/4513044

  •  12-10-2019
  •  | 
  •  

Question

Quelqu'un sait-il d'un géré langage de programmation mis en œuvre sur .NET qui contient un type de données spécialisées qui ne sont pas mis en correspondance par le type commun Système / FCL / BCL ou qui ne dispose pas d'un envoyé équivalent .NET (par exemple livré types standard comme System.String, System.Int32)?

Cette question viendrait probablement du point de vue de quelqu'un portage d'un compilateur (même si je ne fais pas ça).

Est-ce aussi simple que la langue la création d'un nouveau type de données en dehors du pour son type spécialisé BCL / FCL? Si le fait de cette interopérabilité entre Hinder langages de programmation qui sont par ailleurs habitués à toute leur cartographie intégrée des types de données à ce qui est dans la BCL / FCL, comme Visual Basic et C #?

Je ne peux imaginer que cette situation pourrait survenir si un compilateur de langage obscur d'une sorte est porté sur .NET pour lequel il n'y a pas de correspondance directe d'un de ses types de données implicites au Cadre livré.

Comment cette situation est prise en charge ou permis en général? Quel serait l'attente du compilateur et le Common Language Runtime?

Était-ce utile?

La solution

Delphi pour .NET mis en œuvre la notion de langage Delphi de variables de classe (qui peut contenir une référence à un type de classe), les méthodes de classe virtuelle et les constructeurs virtuels (appelés via une référence de classe). Aucun d'entre eux ont tout analogue direct CLR - méthodes statiques dans CLR ne peut pas être virtuel, et les constructeurs ne peuvent pas être virtuel.

Comme CLR a une telle soupe riche d'informations de type d'exécution, ces objets ne sont pas strictement nécessaires CLR. Si vous voulez construire une instance d'un type à l'exécution dans le code qui ne connaît pas le type exact au moment de la compilation, vous pouvez le faire avec la réflexion ou d'autres techniques. Ces caractéristiques du langage Delphi ont grandi sur le produit Win32 compilé en mode natif où l'exécution des informations de type est limitée. Tout cela a été mis en œuvre sur .NET 1.0 et 1.1, bien avant tout comme le DLR est venu.

Ces fonctionnalités du langage Delphi pourrait faire des émules dans CLR utilisant la réflexion, mais pour des raisons de performance nous avons choisi de les mettre en œuvre directement en IL en créant un type « méta classe » qui était un sidecar à tous les types de classe déclarée à Delphes. Si le code Delphi attribué un type de classe Delphi à une variable de référence de classe, nous avons produit le code IL pour assigner l'instance singleton de la classe méta correspondant à la variable. appels de méthode virtuelle via la variable de référence de classe ont été codegen'd comme IL appels de méthode virtuelle sur l'instance méta classe, qui rebondissaient à la mise en œuvre de la méthode statique réelle dans le type de classe correspondant. Cela a permis à la classe des appels de méthode virtuelle à se comporter toujours polymorphically (pour appeler le lieu de mise en œuvre du type de l'instance utilisée pour effectuer l'appel) et avec un coût de performances d'exécution minimale. Cette mise en œuvre a également été de type sécurisé et vérifiable.

Ces caractéristiques de la méthode de classe virtuelle ne sont applicables aux classes déclarées dans la syntaxe Delphi et utilisable uniquement dans la syntaxe Delphi. Je crois que les types de méta ont été marqués comme non-conforme CLS afin que d'autres langages .NET seraient (le plus probable) les ignorer lors de l'utilisation des classes créées dans Delphi. D'autres langages .NET ne peuvent pas utiliser ces fonctionnalités de langage spécifique Delphi (à moins que le développeur était vraiment déterminé et monté par l'échafaudage pour faire les appels appropriés à / par les classes méta laides nommées)

En général, vous ne devriez pas attendre à d'autres langues à faire usage d'artefacts non-CLS créés par / pour votre langue. Si vous voulez d'autres langues pour faire usage de choses créées par votre langue, vous aurez besoin de savoir comment représenter votre sauce spéciale d'une manière qui peut être représenté de manière raisonnable dans CLS termes conformes. Cela peut ne pas être possible en fonction de la nature de la sauce spéciale.

Delphi méthodes de classe virtuelle étaient disponibles à d'autres langages .NET comme méthodes statiques normales. La nature polymorphique n'a pas été exposé à d'autres langages .NET en grande partie parce CLS (ni d'autres langues) ne peuvent simplement pas exprimer la notion.

Idéalement, toutes les langues serait en mesure d'exprimer toutes les construction imaginables aussi bien. Mais en réalité, ce n'est pas le cas. Certaines fonctions sont plus faciles à graphiques exprimer en coordonnées cartésiennes, tandis que d'autres sont largement simplifiées en utilisant les coordonnées polaires. La même chose est vraie pour les langages de programmation.

Il est autorisé à inventer de nouveaux moyens d'expression dans votre propre langue, même quand il est mis en œuvre sur CLR. Assurez-vous de garder une définition claire de ce que vos types ressemblent aux programmeurs qui travaillent en dehors de votre langue si vous attendez le code de votre langue à appeler par d'autres. Votre mise en œuvre aura une dualité:. Comment les choses se tournent vers les utilisateurs de votre langue, et comment les choses se tourner vers les utilisateurs en dehors de votre langue

Note: Je ne crois pas cela s'applique au nouveau produit Delphi pour .NET, Delphi Prism. Je ne pense pas que Delphi Prism prend en charge les méthodes de classe virtuelle.

Autres conseils

Pas vraiment. Toute langue a la charge ultime de devoir être en mesure de fonctionner sur du matériel de base pour réussir. Le CTS est un très bon modèle pour les types qui peuvent être efficacement traitées sur le matériel actuel.

Ce qui peut être nécessaire est un gros morceau de support d'exécution pour adapter entre le système de type de la langue et de la CLI. Un exemple classique est le DLR, le système de support d'exécution pour les langages dynamiques comme Python et Ruby. Il fait essentiellement ce qu'un tel interprète en langue doit faire aussi bien, il a perf comparable. Pas de trucs BTW, tout est pur code C #.

Une telle bibliothèque de support d'exécution peut obtenir lent lorsque la langue a des caractéristiques qui ne sont pas disponibles du tout. L'héritage multiple par exemple. Il est nativement « soutenu » par le compilateur CLR et JIT. Vous pouvez prendre environ tout programme C conforme à la norme ++ qui utilise MI, exécuter par le compilateur C ++ avec l'option / clr et vous vous retrouverez avec un ensemble qui contient pur IL qui sera juste à temps compilé lors de l'exécution. Aucun effort de l'imagination pouvait vous appeler le résultat d'un programme géré, il ne sera pas vérifiable et il ne sera pas utiliser le garbage collector. La résolution qui va exiger une bibliothèque de soutien qui va devoir imiter l'héritage multiple. Possible, je doute qu'il sera compétitif.

Eh bien, il y a C ++ / cli. Là, vous pouvez créer des classes C ++ qui ne sont pas visibles dans .net. Est-ce que vous êtes après?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top