Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Dynamic Language Runtime (DLR) es un entorno en tiempo de ejecución que agrega un conjunto de servicios para lenguajes dinámicos a Common Language Runtime (CLR). DLR facilita el desarrollo de lenguajes dinámicos para ejecutarse en .NET y agregar características dinámicas a lenguajes con tipos estáticos.
Los lenguajes dinámicos pueden identificar el tipo de un objeto en tiempo de ejecución, mientras que en lenguajes con tipo estático, como C# y Visual Basic (cuando se usa Option Explicit On
), debe especificar tipos de objeto en tiempo de diseño. Algunos 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 proporcionan las siguientes ventajas para los desarrolladores:
- La capacidad de usar un bucle de retroalimentación rápido (REPL, o bucle de lectura-evaluación-impresión). Esto le permite escribir varias instrucciones y ejecutarlas inmediatamente para ver los resultados.
- Compatibilidad con el desarrollo de arriba hacia abajo y el desarrollo más tradicional de abajo hacia arriba. Por ejemplo, cuando se usa un enfoque de arriba abajo, puede llamar a funciones que aún no están implementadas y, a continuación, agregar implementaciones subyacentes cuando las necesite.
- Refactorización y modificaciones de código más sencillas, ya que no es necesario cambiar las declaraciones de tipo estático en todo el código.
Los lenguajes dinámicos son excelentes para la guionización. Los clientes pueden ampliar fácilmente las aplicaciones creadas mediante lenguajes dinámicos con nuevos comandos y funcionalidades. Los lenguajes dinámicos también se usan con frecuencia para crear sitios web y probar arneses, mantener granjas de servidores, desarrollar diversas utilidades y realizar transformaciones de datos.
El propósito de DLR es permitir que un sistema de lenguajes dinámicos se ejecute en .NET y darles interoperabilidad de .NET. DLR agrega objetos dinámicos a C# y Visual Basic para admitir el comportamiento dinámico en estos lenguajes y habilitar su interoperación con lenguajes dinámicos.
DLR también le ayuda a crear bibliotecas que admiten operaciones dinámicas. Por ejemplo, si tiene una biblioteca que usa objetos XML o Notación de objetos JavaScript (JSON), los objetos pueden aparecer como objetos dinámicos en lenguajes que usan DLR. Esto permite a los usuarios de biblioteca escribir código sintácticamente más sencillo y natural para trabajar con objetos y acceder a miembros de objeto.
Por ejemplo, puede usar el código siguiente para incrementar un contador en XML en C#.
Scriptobj.SetProperty("Count", ((int)GetProperty("Count")) + 1);
Con DLR, puede usar el código siguiente en su lugar para la misma operación.
scriptobj.Count += 1;
Al igual que CLR, DLR forma parte de .NET. Está disponible para su descarga en el repositorio IronLanguages/dlr en GitHub.
IronPython es un ejemplo de un lenguaje desarrollado mediante DLR.
Ventajas principales de DLR
DLR proporciona las siguientes ventajas.
Simplifica la migración de lenguajes dinámicos a .NET
DLR permite a los implementadores de lenguaje evitar la creación de analizadores léxicos, analizadores, analizadores semánticos, generadores de código y otras herramientas que tradicionalmente tenían que crear. Para usar DLR, un lenguaje debe generar árboles de expresión, que representan código de nivel de lenguaje en una estructura con forma de árbol, rutinas auxiliares en tiempo de ejecución y objetos dinámicos opcionales que implementan la IDynamicMetaObjectProvider interfaz. DLR y .NET automatizan una gran cantidad de tareas de análisis de código y generación de código. Esto permite a los implementadores de lenguaje concentrarse en características de lenguaje únicas.
Habilita características dinámicas en lenguajes de tipado estático
Los lenguajes .NET existentes, como C# y Visual Basic, pueden crear objetos dinámicos y usarlos junto con objetos con tipos estáticos. Por ejemplo, C# y Visual Basic pueden usar objetos dinámicos para HTML, Document Object Model (DOM) y reflexión.
Proporciona ventajas futuras de DLR y .NET
Los lenguajes implementados mediante DLR pueden beneficiarse de futuras mejoras de DLR y .NET. Por ejemplo, si .NET publica una nueva versión que tiene un recolector de elementos no utilizados mejorado o un tiempo de carga de ensamblado más rápido, los lenguajes implementados mediante DLR obtienen inmediatamente la misma ventaja. Si DLR agrega optimizaciones como una mejor compilación, el rendimiento también mejora para todos los lenguajes implementados mediante DLR.
Habilita el uso compartido de bibliotecas y objetos
Otros lenguajes pueden usar los objetos y bibliotecas implementados en un idioma. DLR también permite la interoperabilidad entre los lenguajes de tipos estáticos y los lenguajes dinámicos. Por ejemplo, C# puede declarar un objeto dinámico que usa una biblioteca escrita en un lenguaje dinámico. Al mismo tiempo, los lenguajes dinámicos pueden usar bibliotecas de .NET Framework.
Proporciona distribución dinámica rápida e invocación
DLR proporciona una ejecución rápida de operaciones dinámicas al admitir el almacenamiento en caché polimórfico avanzado. DlR crea reglas para las operaciones de enlace que usan objetos en las implementaciones en tiempo de ejecución necesarias y, a continuación, almacena en caché estas reglas para evitar cálculos de enlace agotadores de recursos durante ejecuciones sucesivas del mismo código en los mismos tipos de objetos.
Arquitectura DLR
DLR agrega un conjunto de servicios a CLR para admitir mejor los lenguajes dinámicos. Estos servicios incluyen lo siguiente:
Árboles de expresión. DLR usa árboles de expresión para representar la semántica del lenguaje. Para ello, DLR tiene árboles de expresión LINQ extendidos para incluir el flujo de control, la asignación y otros nodos de modelado de lenguaje. Para obtener más información, vea Árboles de expresión (C#) o Árboles de expresión (Visual Basic).
Almacenamiento en caché del sitio de llamada. Un sitio de llamada dinámico es un lugar en el código donde se realiza una operación como
a + b
oa.b()
en objetos dinámicos. DlR almacena en caché las características dea
yb
(normalmente los tipos de estos objetos) e información sobre la operación. Si dicha operación se ha realizado anteriormente, DLR recupera toda la información necesaria de la memoria caché para el envío rápido.Interoperabilidad de objetos dinámicos. DLR proporciona un conjunto de clases e interfaces que representan objetos y operaciones dinámicos y que los implementadores de lenguaje y autores de bibliotecas dinámicas pueden usar. Estas clases e interfaces incluyen IDynamicMetaObjectProvider, DynamicMetaObject, DynamicObjecty ExpandoObject.
DLR usa enlazadores en sitios de llamadas para comunicarse no solo con .NET, sino con otras infraestructuras y servicios, como COM. Los enlazadores encapsulan la semántica de un lenguaje y especifican cómo realizar operaciones en un sitio de llamada mediante árboles de expresión. Esto permite a los lenguajes de tipos dinámicos y estáticos que usan el DLR compartir bibliotecas y obtener acceso a todas las tecnologías que admite el DLR.
Documentación de DLR
Para obtener más información sobre cómo usar la versión de código abierto de DLR para agregar un comportamiento dinámico a un lenguaje, o sobre cómo habilitar el uso de un lenguaje dinámico con .NET, consulte la documentación del repositorio IronLanguages/dlr en GitHub.