Vue d’ensemble du Dynamic Language Runtime

Le Dynamic Language Runtime (DLR) est un environnement d’exécution ajoutant au Common Language Runtime (CLR) un ensemble de services pour les langages dynamiques. Le DLR simplifie le développement de langages dynamiques à exécuter sur .NET et l’ajout de fonctionnalités dynamiques aux langages typés statiquement.

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

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

  • Possibilité d’utiliser une boucle de rétroaction rapide (REPL, Read-Evaluate-Print Loop). Cela vous permet d’entrer plusieurs instructions et de les exécuter immédiatement pour consulter les résultats.
  • Prise en charge du développement descendant et du développement ascendant plus classique. Par exemple, quand vous utilisez une approche descendante, vous pouvez appeler des fonctions qui ne sont pas encore implémentées, puis ajouter des implémentations sous-jacentes en fonction de vos besoins.
  • Simplification de la refactorisation et des modifications de code, puisque vous n’avez pas besoin de changer les déclarations de types statiques dans tout le code.

Les langages dynamiques sont d’excellents langages de script. Les clients peuvent facilement étendre des applications créées à l’aide des langages dynamiques avec de nouvelles commandes et fonctionnalités. Les langages dynamiques sont fréquemment utilisés pour la création de sites web et d’ateliers de test, la gestion de batteries de serveurs, le développement de différents utilitaires et l’exécution de 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 fournir l’interopérabilité .NET. Le DLR ajoute des objets dynamiques à Visual C# et Visual Basic pour prendre en charge le comportement dynamique dans ces langages et permettre 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 XML ou JSON (JavaScript Object Notation), vos objets peuvent apparaître comme des objets dynamiques aux langages qui utilisent le DLR. Cela permet aux utilisateurs de la bibliothèque d’écrire syntaxiquement un code plus simple et plus naturel pour l’utilisation des objets et l’accès aux membres objets.

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

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

Avec le DLR, vous pouvez utiliser à la place le code suivant 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 dans le dépôt IronLanguages/dlr sur GitHub.

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

Principaux avantages du DLR

Le DLR offre les avantages suivants.

Simplifie le portage des langages dynamiques vers .NET

Le DLR évite aux implémenteurs de langage d’avoir à créer des analyseurs lexicaux, des analyseurs, des analyseurs sémantiques, des générateurs de code et d’autres outils qu’ils doivent traditionnellement créer eux-mêmes. Pour utiliser le DLR, un langage doit créer des arborescences de l’expression, qui représentent le code de niveau 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 un grand nombre de tâches d’analyse et de génération de code. Cela permet aux implémenteurs de langage de se concentrer exclusivement sur les fonctionnalités de langage.

Prend en charge 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 la réflexion , HTML et DOM (Document Object Model).

Offre les avantages futurs du DLR et de .NET

Les langages implémentés à l’aide du DLR peuvent bénéficier des futures améliorations apportées au DLR et à .NET. Par exemple, si une nouvelle version de .NET propose un garbage collector amélioré ou un temps de chargement des assemblys plus court, 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 qu’une meilleure compilation, les performances augmentent également pour tous les langages implémentés à l’aide du DLR.

Prend en charge le partage de bibliothèques et d’objets

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

Fournit un appel et une distribution dynamiques rapides

Le DLR fournit l’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 pour les implémentations du runtime nécessaires, puis il met en cache ces règles afin d’éviter les calculs de liaison gourmands en ressources lors des exécutions consécutives du même code sur les mêmes types d’objets.

Architecture du DLR

Le DLR ajoute un ensemble de services au CLR pour une meilleure prise en charge des langages dynamiques. Ces services sont les suivants :

  • Arborescences de l’expression. Le DLR utilise des arborescences de l’expression pour représenter la syntaxe de langage. À cette fin, le DLR a étendu les arborescences de l’expression LINQ pour inclure le flux de contrôle, l’assignation 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 exécutez 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 (en général, les types de ces objets) et les informations sur l’opération. Si une opération de ce type a été exécutée précédemment, le DLR extrait toutes les informations nécessaires 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 opérations et des objets dynamiques pouvant être utilisées par les implémenteurs de langage et les auteurs de bibliothèques dynamiques. Il s’agit notamment des classes et des interfaces IDynamicMetaObjectProvider, DynamicMetaObject, DynamicObject et ExpandoObject.

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

Documentation DLR

Pour plus d’informations sur la façon d’utiliser la version open source du DLR afin d’ajouter un comportement dynamique à un langage, ou sur la façon d’utiliser un langage dynamique avec .NET, consultez la documentation dans le dépôt IronLanguages/dlr sur GitHub.

Voir aussi