Question

Je viens juste de commencer à essayer d'en savoir plus sur les fondements VM .Net, et je suis immédiatement jeté par quelque chose. Je sais qu'il ya cette nouvelle chose appelée le DLR qui permet à tous les trucs de dynamique en C # et le fonctionnement des langues IronX. Mais maintenant je lis sur cette langue appelée Boo, et apparemment, il a eu des capacités de dynamique depuis longtemps avant que le DLR existait. Ainsi,

1) Comment est-ce possible?

2) Qu'est-ce que l'ajout de DLR à l'équation?

3) Est-ce qu'une langue comme Boo quoi que ce soit tout à gagner en se re-mise en œuvre en termes de DLR?

D'après ce que j'ai genre de réunis ici et là, il semble que le DLR est sorti de IronPython, quand ils pris en compte tout ce qui était nécessaire pour le soutien DL en .Net, et le mettre en forme réutilisable. Donc ce que je devine que DLR est rien de spécial, juste quelques bibliothèques qui aide avec des objets dynamiques Microsoft.Scripting.dll, mais rien que vous ne pouviez pas juste de sortir et le code par vous-même si vous avez eu le temps, ce qui Je suppose que ce qui est arrivé pour Boo? Et puis pour 2 et 3, je suppose que les points communs et réutilisabilité du DLR permettrait toute amélioration future de DLR à des droits acquis automatiquement, mais qu'il n'y a pas d'urgence « besoin » de re-mettre en œuvre à l'aide du DLR si vous avez déjà fait votre propre moteur d'exécution personnalisé? Ou le DLR ont une sauce MS secret qui fait mieux que tout ce que nous pourrions faire au-dessus de .Net?

4) Le DLR vraiment un moteur d'exécution ou tout simplement un ensemble de bibliothèques? (Qu'est-ce qu'un temps d'exécution de toute façon? J'ai probablement besoin d'apprendre la théorie plus compilateur avant que je puisse même comprendre une réponse à cette question, ou si elle est même une question qui veut dire quelque chose. Ignore cette question. Ou pas.)

5) Comment fonctionne la compilation IronPython? Est-il compiler jusqu'à une nouvelle version dynamique du CIL, ou il ne vient préfixer une commande « ironpython.exe » à une chaîne avec le texte du programme en elle? Hmm, bien si dynamique est un mot-clé en C #, il doit y avoir une version dynamique du CIL, non? Alors, comment savoir si .Net utiliser le CLR ou le DLR sur le CIL?

6) Le projet est-DaVinci pour les différentes JVM? On dirait qu'il est une re-mise en œuvre effective de la machine virtuelle Java elle-même. Quelles sont les implications de cette approche? Je devine qu'il ya d'énormes gains de performance, mais rien d'autre? Toute MS raison n'a pas pris cette route?

7) Est-ce que la marque de DLR Boo un peu obsolète pour faire DSLs?

Était-ce utile?

La solution

Le DLR apporte essentiellement 3 choses à la partie:

  • Un jeu étendu d'arbres d'expression (d'abord introduit w / LINQ) qui permettent de compiler des programmes complets. Ceux-ci fournissent un moyen beaucoup plus facile de générer du code à générer IL directement - il se débarrasse de nombreux cas d'être en mesure de générer invalide IL et bien d'autres cas s'en exceptions d'exécution facilement débogable
  • .
  • Un mécanisme intégré de mise en cache du site d'appel afin que vous n'avez pas besoin de créer votre propre (très utile pour une bonne performance dans les langues dynamiques). Cela inclut des choses comme un cache multi-niveaux et le vieillissement des éléments inutilisés.
  • Un protocole objet méta qui permet aux langages dynamiques de parler à l'autre lors de l'exécution et de négocier le résultat correct pour la langue appelant (par exemple en renvoyant undefined JavaScript lorsqu'un membre n'existe pas ou lancer une AttributeError en Python quelle que soit la langue l'objet dynamique a été écrit en).

Le protocole méta objet est la seule pièce qui doit absolument être partagé - tout ce que vous pouvez créer vous-même.

IronPython construit entièrement au-dessus du DLR - modèle afin de compilation de ce fait est de compiler des arbres d'expression. La DLR couche interne qui a expédié w / .NET 4.0 est utilisé pour compiler les arbres d'expression et nous utilisons l'interprète qui est un morceau de la couche extérieure pour interpréter les arbres d'expression. On peut alors compiler paresseusement les arbres d'expression après les versions interprétées sont devenus chaud. Cette compilation inclut la production des sites d'appel que nous utilisons pour l'expédition de dynamique de différentes opérations (obtention, éléments de réglage, d'appeler des objets, etc ...) et nous utiliser à nouveau le DLR - dans ce cas, il mécanisme de site d'appel. IronPython utilise une combinaison des deux liants standard DLR pour ces opérations ainsi que des classeurs personnalisés qui font des actions spécifiques IronPython (flux à travers le contexte de code, le soutien * args et ** appels args, etc ...) qui tombent ensuite retour aux liants standard DLR pour interop.

Le projet Davinci ajoutera « poignées de méthode » à la machine virtuelle Java que le CLR a déjà sous la forme de délégués. Il ajoutera également une nouvelle opcode « invokedynamic » que le CLR n'a pas et n'a pas gagné w / le travail de DLR. En revanche, le DLR utilise simplement les primitives existantes (délégués, génériques réifiés) ainsi que les bibliothèques pour définir le protocole Interop. Les deux ajouter le concept des sites d'appel et ceux-ci peuvent être assez similaires entre les deux.

Autres conseils

Beaucoup de questions ici! Je ne suis pas sûr que je peux répondre à tous d'entre eux, mais je vais le faire autant que je peux:

  1. Boo est pas dynamique dans le même sens que (fer) Python est. Il est la plupart du temps un langage typé statiquement avec inférence de type fort et la syntaxe pythonique. Ceci, couplé avec sa frappe en option de canard, lui donner une sensation très dynamique, mais il est certainement pas la même chose que Python. Boo est plus similaire (sauf pour la syntaxe) à C # 4 que Python.

  2. DLR ajoute le support dynamique pour les implémenteurs de langue au-dessus de le CLR, qui est plus orienté vers langues statiquement typés (tels que VB.NET, C #, F #)

  3. Pas vraiment à mon humble avis. Il deviendrait trop semblable à IronPython. Précisément une des caractéristiques de Boo est qu'il est statiquement typé.

  4. runtimes sont bibliothèques qui prennent en charge des constructions de base dans la langue. VB.NET, C #, F #, Boo, ils ont tous les bibliothèques d'exécution. Vous voyez généralement jamais VB.NET ou C # runtimes parce qu'ils viennent avec le framework .NET. Il y avait une excellente réponse sur le SO à ce sujet d'Eric Lippert, mais je ne peux pas le trouver.

  5. Impossible de commentaire à ce sujet, ne pas beaucoup de l'expérience pratique avec IronPython.

  6. Je ne sais pas sur le projet DaVinci, ne peut pas commenter.

  7. Non. Pour autant que je connais les macros de Boo et compilateur extensible sont tout à fait unique pour un langage .NET ( Nemerle a des capacités macro similaires). Je ne peux pas vraiment dire si Boo peut être DSLs plus ou moins puissant que IronPython DSLs. Ce que je peux dire est certain que la mise en œuvre de Boo est DSLs très différentes de la implentation de Python DSLs.

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