Partager via


Vue d’ensemble du runtime de langage dynamique

Le runtime de langage dynamique (DLR) est un environnement d’exécution qui ajoute un ensemble de services pour les langages dynamiques au Common Language Runtime (CLR). Le DLR facilite le développement de langages dynamiques sur .NET et l’ajout de fonctionnalités dynamiques à des langages typés statiquement.

Les langages dynamiques peuvent identifier le type d’un objet au moment de l’exécution, tandis que dans des langages typés statiquement tels que C# et Visual Basic (lorsque vous utilisez Option Explicit On), vous devez spécifier des types d’objets au moment du design. Des exemples de langages dynamiques sont Lisp, Smalltalk, JavaScript, PHP, Ruby, Python, ColdFusion, Lua, Cobra et Groovy.

La plupart des langages dynamiques offrent les avantages suivants pour les développeurs :

  • Possibilité d’utiliser une boucle de rétroaction rapide (REPL ou boucle lire-évaluer-afficher). Cela vous permet d’entrer plusieurs instructions et de les exécuter immédiatement pour afficher les résultats.
  • Prise en charge du développement descendant et du développement ascendant plus classique. Par exemple, lorsque vous utilisez une approche top-down, vous pouvez appeler des fonctions qui ne sont pas encore implémentées, puis ajouter des implémentations sous-jacentes lorsque vous en avez besoin.
  • Refactorisation et modifications de code plus faciles, car vous n’avez pas besoin de modifier les déclarations de type statiques dans tout le code.

Les langages dynamiques font d’excellents langages de script. Les clients peuvent facilement étendre les applications créées à l’aide de langages dynamiques avec de nouvelles commandes et fonctionnalités. Les langages dynamiques sont également fréquemment utilisés pour créer des sites web et tester des harnais, gérer des batteries de serveurs, développer différents utilitaires et effectuer des transformations de données.

L’objectif du DLR est de permettre à un système de langages dynamiques de s’exécuter sur .NET et de leur donner l’interopérabilité .NET. Le DLR ajoute des objets dynamiques à C# et Visual Basic pour prendre en charge le comportement dynamique dans ces langages et activer leur interopérabilité avec les langages dynamiques.

Le DLR vous aide également à créer des bibliothèques qui prennent en charge les opérations dynamiques. Par exemple, si vous avez une bibliothèque qui utilise des objets JSON (XML ou JavaScript Object Notation), vos objets peuvent apparaître en tant qu’objets dynamiques pour les langages qui utilisent le DLR. Cela permet aux utilisateurs de la bibliothèque d’écrire du code syntactiquement plus simple et plus naturel pour fonctionner avec des objets et accéder aux membres de l’objet.

Par exemple, vous pouvez utiliser le code suivant pour incrémenter un compteur en XML en C#.

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

En utilisant le DLR, vous pouvez utiliser le code suivant à la place pour la même opération.

scriptobj.Count += 1;

Comme le CLR, le DLR fait partie de .NET. Il est disponible en téléchargement sur le référentiel IronLanguages/dlr sur GitHub.

IronPython est un exemple de langage développé à l’aide du DLR.

Principaux avantages de DLR

Le DLR offre les avantages suivants.

Simplifie le portage des langages dynamiques vers .NET

Le DLR permet aux implémenteurs de langage d’éviter de créer des analyseurs lexicals, des analyseurs sémantiques, des générateurs de code et d’autres outils qu’ils ont traditionnellement dû créer eux-mêmes. Pour utiliser le DLR, un langage doit produire des arborescences d’expressions, qui représentent du code au niveau du langage dans une structure en forme d’arborescence, des routines d’assistance runtime et des objets dynamiques facultatifs qui implémentent l’interface IDynamicMetaObjectProvider . Le DLR et .NET automatisent beaucoup de tâches d’analyse du code et de génération de code. Cela permet aux implémenteurs de langage de se concentrer sur des fonctionnalités linguistiques uniques.

Active les fonctionnalités dynamiques dans les langages typés statiquement

Les langages .NET existants tels que C# et Visual Basic peuvent créer des objets dynamiques et les utiliser avec des objets typés statiquement. Par exemple, C# et Visual Basic peuvent utiliser des objets dynamiques pour HTML, Document Object Model (DOM) et la réflexion.

Offre des avantages futurs du DLR et du .NET

Les langages implémentés à l’aide du DLR peuvent tirer parti des améliorations futures apportées à DLR et .NET. Par exemple, si .NET publie une nouvelle version qui a un garbage collector amélioré ou un temps de chargement d’assembly plus rapide, les langages implémentés à l’aide du DLR bénéficient immédiatement du même avantage. Si le DLR ajoute des optimisations telles que une meilleure compilation, les performances s’améliorent également pour tous les langages implémentés à l’aide du DLR.

Permet le partage de bibliothèques et d’objets

Les objets et bibliothèques implémentés dans une langue peuvent être utilisés par d’autres langages. Le DLR permet également l’interopérabilité entre les langages statiquement typés et dynamiques. Par exemple, C# peut déclarer un objet dynamique qui utilise une bibliothèque écrite dans un langage dynamique. En même temps, les langages dynamiques peuvent utiliser des bibliothèques à partir du .NET Framework.

Il fournit un appel et une distribution dynamiques rapides

Le DLR fournit une exécution rapide des opérations dynamiques en prenant en charge la mise en cache polymorphe avancée. Le DLR crée des règles pour les opérations de liaison qui utilisent des objets aux implémentations d’exécution nécessaires, puis met en cache ces règles pour éviter les calculs de liaison épuisant les ressources pendant les exécutions successives du même code sur les mêmes types d’objets.

Architecture de DLR

Le DLR ajoute un ensemble de services au CLR pour mieux prendre en charge les langages dynamiques. Ces services incluent les éléments suivants :

  • Arbres d'expressions. Le DLR utilise des arborescences d’expressions pour représenter la sémantique du langage. À cet effet, le DLR a étendu des arborescences d’expressions LINQ pour inclure le flux de contrôle, l’affectation et d’autres nœuds de modélisation de langage. Pour plus d’informations, consultez Arborescences d’expressions (C#) ou Arborescences d’expressions (Visual Basic).

  • Mise en cache dans le site d’appel. Un site d’appel dynamique est un emplacement dans le code où vous effectuez une opération comme a + b ou a.b() sur des objets dynamiques. Le DLR met en cache les caractéristiques de a et b (habituellement les types de ces objets) ainsi que des informations sur l'opération. Si une telle opération a été effectuée précédemment, le DLR récupère toutes les informations nécessaires à partir du cache pour une distribution rapide.

  • Interopérabilité des objets dynamiques. Le DLR fournit un ensemble de classes et d’interfaces qui représentent des objets et des opérations dynamiques et qui peuvent être utilisés par les implémenteurs de langage et les auteurs de bibliothèques dynamiques. Ces classes et interfaces incluent IDynamicMetaObjectProvider, , DynamicMetaObjectDynamicObjectet ExpandoObject.

Le DLR utilise des classeurs dans les sites d’appel pour communiquer non seulement avec le .NET Framework, mais aussi avec d’autres infrastructures et services tels que COM. Les classeurs encapsulent la sémantique d’un langage et spécifient comment effectuer des opérations dans un site d’appel à l’aide d’arborescences d’expressions. Cela permet aux langages dynamiques et statiquement typés qui utilisent le DLR de partager des bibliothèques et d’accéder à toutes les technologies prises en charge par le DLR.

Documentation DLR

Pour plus d’informations sur l’utilisation de la version open source du DLR pour ajouter un comportement dynamique à un langage ou sur l’activation de l’utilisation d’un langage dynamique avec .NET, consultez la documentation sur le référentiel IronLanguages/dlr sur GitHub.

Voir aussi