Dynamic Language Runtime (DLR) es un entorno de ejecución que agrega un conjunto de servicios para lenguajes dinámicos al Common Language Runtime (CLR). El DLR facilita el desarrollo de lenguajes dinámicos para su ejecución en .NET Framework y la adición de funciones dinámicas a los lenguajes escritos estáticamente.
Los lenguajes dinámicos pueden identificar el tipo de un objeto en tiempo de ejecución, mientras que en lenguajes de tipado estático como C # y Visual Basic (cuando usa Option Explicit On) debe especificar los tipos de objeto en tiempo de diseño. Ejemplos de lenguajes dinámicos son Lisp, Smalltalk, JavaScript, PHP, Ruby, Python, ColdFusion, Lua, Cobra y Groovy.
La mayoría de los lenguajes dinámicos ofrecen las siguientes ventajas para los desarrolladores:
La capacidad de utilizar un ciclo de retroalimentación rápida (REPL o ciclo de lectura-evaluación-impresión). Esto le permite ingresar varias declaraciones y ejecutarlas inmediatamente para ver los resultados.
Soporte tanto para el desarrollo de arriba hacia abajo como para el desarrollo de abajo hacia arriba más tradicional. Por ejemplo, cuando usa un enfoque de arriba hacia abajo, puede llamar a funciones que aún no están implementadas y luego agregar implementaciones subyacentes cuando las necesite.
Refactorización y modificaciones de código más fáciles, porque no tiene que cambiar las declaraciones de tipo estático en todo el código.
Los lenguajes dinámicos son excelentes lenguajes de secuencias de comandos. Los clientes pueden ampliar fácilmente las aplicaciones creadas mediante el uso de lenguajes dinámicos con nuevos comandos y funciones. Los lenguajes dinámicos también se utilizan con frecuencia para crear sitios web y arneses de prueba, mantener granjas de servidores, desarrollar diversas utilidades y realizar transformaciones de datos.
El propósito del DLR es permitir que un sistema de lenguajes dinámicos se ejecute en .NET Framework y brindarles interoperabilidad .NET. El DLR agrega objetos dinámicos a C # y Visual Basic para admitir el comportamiento dinámico en estos lenguajes y permitir su interoperación con lenguajes dinámicos.
El DLR también ayuda a crear bibliotecas que admiten operaciones dinámicas. Por ejemplo, si tiene una biblioteca que utiliza objetos XML o de notación de objetos JavaScript (JSON), sus objetos pueden aparecer como objetos dinámicos en los lenguajes que utilizan DLR. Esto permite a los usuarios de la biblioteca escribir código sintácticamente más simple y natural para operar con objetos y acceder a miembros de objetos.
Al igual que CLR, DLR es parte de .NET Framework y se proporciona con los paquetes de instalación de .NET Framework y Visual Studio. La versión de código abierto del DLR también está disponible para descargar en el repositorio IronLanguages / dlr en GitHub.
La versión de código abierto del DLR tiene todas las características del DLR que se incluyen en Visual Studio y .NET Framework. También proporciona soporte adicional para implementadores de lenguajes.
Entre los ejemplos de lenguajes desarrollados mediante el uso de DLR se incluyen los siguientes:
- IronPython. Disponible como software de código abierto en el sitio web de GitHub.
- IronRuby. Disponible como software de código abierto en el sitio web de IronRuby.
El DLR ofrece las siguientes ventajas :
- Simplifica la portabilidad de lenguajes dinámicos a .NET Framework : El DLR permite a los implementadores de lenguaje evitar la creación de analizadores léxicos, analizadores sintácticos, analizadores semánticos, generadores de código y otras herramientas que tradicionalmente tenían que crear ellos mismos. Para utilizar DLR, un lenguaje necesita producir árboles de expresión, que representan código a nivel de lenguaje en una estructura en forma de árbol, rutinas de ayuda en tiempo de ejecución y objetos dinámicos opcionales que implementan la interfaz IDynamicMetaObjectProvider. DLR y .NET Framework automatizan una gran cantidad de análisis de código y tareas de generación de código. Esto permite a los implementadores del lenguaje concentrarse en características exclusivas del lenguaje.
- Habilita funciones dinámicas en lengujes escritos estáticamente : Los lenguajes de .NET Framework existentes, como C # y Visual Basic, pueden crear objetos dinámicos y usarlos junto con objetos de tipo estático. Por ejemplo, C # y Visual Basic pueden usar objetos dinámicos para HTML, Document Object Model (DOM) y reflexión .NET.
- Proporciona beneficios futuros de DLR y .NET Framework : Los lenguajes implementados mediante el uso de DLR pueden beneficiarse de futuras mejoras de DLR y .NET Framework. Por ejemplo, si .NET Framework lanza una nueva versión que tiene un recolector de basura mejorado o un tiempo de carga de ensamblaje más rápido, los lenguajes implementados mediante DLR obtienen inmediatamente el mismo beneficio. Si el DLR agrega optimizaciones, como una mejor compilación, el rendimiento también mejora para todos los idiomas implementados mediante el uso del DLR.
- Permite compartir bibliotecas y objetos : Los objetos y bibliotecas implementados en un idioma pueden ser utilizados por otros idiomas. El DLR también permite la interoperación entre lenguajes dinámicos y de tipado estático. Por ejemplo, C # puede declarar declarar un objeto dinámico que utiliza una biblioteca escrita en un lenguaje dinámico. Al mismo tiempo, los lenguajes dinámicos pueden utilizar bibliotecas de .NET Framework.
- Proporciona Invocación y Despacho Dinámico Rápido: El DLR proporciona una ejecución rápida de operaciones dinámicas al admitir el almacenamiento en caché polimórfico avanzado. El DLR crea reglas para las operaciones vinculantes que utilizan objetos para las implementaciones de tiempo de ejecución necesarias y luego almacena en caché estas reglas para evitar cálculos vinculantes que agotan los recursos durante ejecuciones sucesivas del mismo código en los mismos tipos de objetos.
El DLR agrega un conjunto de servicios al CLR para un mejor soporte de lenguajes dinámicos. Estos servicios incluyen lo siguiente:
Árboles de expresión. El DLR usa árboles de expresión para representar la semántica del lenguaje. Para este propósito, el DLR ha ampliado los árboles de expresión LINQ para incluir el flujo de control, la asignación y otros nodos de modelado del lenguaje. Para obtener más información, consulte Árboles de expresión (C #) o Árboles de expresión (Visual Basic).
Llamadas al almacenamiento en caché del sitio. Un sitio de llamada dinámica es un lugar en el código donde realiza una operación como a + bo a.b () en objetos dinámicos. El DLR almacena en caché las características de ayb (generalmente los tipos de estos objetos) e información sobre la operación. Si tal operación se ha realizado previamente, el DLR recupera toda la información necesaria de la caché para un despacho rápido.
Interoperabilidad de objetos dinámicos. El DLR proporciona un conjunto de clases e interfaces que representan operaciones y objetos dinámicos y pueden ser utilizados por implementadores de lenguaje y autores de bibliotecas dinámicas. Estas clases e interfaces incluyen IDynamicMetaObjectProvider, DynamicMetaObject, DynamicObject y ExpandoObject.
El DLR utiliza carpetas en los sitios de llamadas para comunicarse no solo con .NET Framework, sino también con otras infraestructuras y servicios, incluidos Silverlight y COM. Los aglutinantes encapsulan la semántica de un lenguaje y especifican cómo realizar operaciones en un sitio de llamada mediante árboles de expresión. Esto habilita lenguajes dinámicos y de tipado estático que utilizan el DLR para compartir bibliotecas y obtener acceso a todas las tecnologías que admite el DLR.