Información general acerca de Dynamic Language RuntimeDynamic Language Runtime Overview

Dynamic Language Runtime (DLR) es un entorno en tiempo de ejecución que agrega un conjunto de servicios para lenguajes dinámicos en Common Language Runtime (CLR).The dynamic language runtime (DLR) is a runtime environment that adds a set of services for dynamic languages to the common language runtime (CLR). DLR hace más fácil desarrollar lenguajes dinámicos para ejecutarlos en .NET Framework y agregar características dinámicas a lenguajes de tipos estáticos.The DLR makes it easier to develop dynamic languages to run on the .NET Framework and to add dynamic features to statically typed languages.

Los lenguajes dinámicos pueden identificar el tipo de un objeto en tiempo de ejecución, mientras que en los lenguajes de tipos estáticos, como C# y Visual Basic (cuando se usa Option Explicit On) es necesario especificar los tipos de objeto en tiempo de diseño.Dynamic languages can identify the type of an object at run time, whereas in statically typed languages such as C# and Visual Basic (when you use Option Explicit On) you must specify object types at design time. Entre los ejemplos de lenguajes dinámicos se incluyen Lisp, Smalltalk, JavaScript, PHP, Ruby, Python, ColdFusion, Lua, Cobra y Groovy.Examples of dynamic languages are Lisp, Smalltalk, JavaScript, PHP, Ruby, Python, ColdFusion, Lua, Cobra, and Groovy.

La mayoría de los lenguajes dinámicos ofrece las siguientes ventajas a los desarrolladores:Most dynamic languages provide the following advantages for developers:

  • Capacidad de usar un bucle de comentarios rápido (bucle de lectura-evaluación-impresión o REPL).The ability to use a rapid feedback loop (REPL, or read-evaluate-print loop). Esto permite escribir varias instrucciones y ejecutarlas inmediatamente para ver los resultados.This lets you enter several statements and immediately execute them to see the results.

  • Compatibilidad con el desarrollo de arriba abajo y el desarrollo más tradicional de abajo arriba.Support for both top-down development and more traditional bottom-up development. Por ejemplo, si usa un enfoque de arriba abajo, puede llamar a funciones que todavía no se han implementado y, después, agregar implementaciones subyacentes cuando las necesite.For example, when you use a top-down approach, you can call functions that are not yet implemented and then add underlying implementations when you need them.

  • Refactorización y modificaciones de código más fáciles, ya que no es necesario cambiar las declaraciones de tipo estático en todo el código.Easier refactoring and code modifications, because you do not have to change static type declarations throughout the code.

Los lenguajes dinámicos son excelentes lenguajes de scripting.Dynamic languages make excellent scripting languages. Los clientes pueden extender fácilmente las aplicaciones creadas mediante lenguajes dinámicos con nuevos comandos y funcionalidades.Customers can easily extend applications created by using dynamic languages with new commands and functionality. Los lenguajes dinámicos también se suelen usar para crear sitios web y herramientas de ejecución de pruebas, mantener granjas de servidores, desarrollar diversas utilidades y realizar transformaciones de datos.Dynamic languages are also frequently used for creating Web sites and test harnesses, maintaining server farms, developing various utilities, and performing data transformations.

El propósito de DLR consiste en permitir que un sistema de lenguajes dinámicos se ejecute en .NET Framework y aportarles interoperabilidad .NET.The purpose of the DLR is to enable a system of dynamic languages to run on the .NET Framework and give them .NET interoperability. DLR agrega objetos dinámicos en C# y Visual Basic para admitir el comportamiento dinámico en estos lenguajes y permitir su interoperabilidad con lenguajes dinámicos.The DLR adds dynamic objects to C# and Visual Basic to support dynamic behavior in these languages and enable their interoperation with dynamic languages.

DLR también ayuda a crear bibliotecas que admiten operaciones dinámicas.The DLR also helps you create libraries that support dynamic operations. Por ejemplo, si tiene una biblioteca que usa objetos XML o de notación de objetos JavaScript (JSON), los objetos pueden aparecer como objetos dinámicos en los lenguajes que usan DLR.For example, if you have a library that uses XML or JavaScript Object Notation (JSON) objects, your objects can appear as dynamic objects to languages that use the DLR. Esto permite que los usuarios de la biblioteca escriban código sintácticamente más sencillo y más natural para trabajar con objetos y obtener acceso a miembros de objeto.This lets library users write syntactically simpler and more natural code for operating with objects and accessing object members.

Por ejemplo, podría usar el código siguiente para incrementar un contador en XML en C#.For example, you might use the following code to increment a counter in XML in C#.

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

Mediante el uso de DLR, podría usar el código siguiente en su lugar para la misma operación.By using the DLR, you could use the following code instead for the same operation.

scriptobj.Count += 1;

Al igual que CLR, DLR forma parte de .NET Framework y se proporciona con los paquetes de instalación de .NET Framework y Visual Studio.Like the CLR, the DLR is a part of the .NET Framework and is provided with the .NET Framework and Visual Studio installation packages. La versión de código abierto de DLR también está disponible para su descarga en el repositorio IronLanguages/dlr en GitHub.The open-source version of the DLR is also available for download on the IronLanguages/dlr repo on GitHub.

Nota

La versión de código abierto de DLR tiene todas las características del DLR que se incluye en Visual Studio y .NET Framework.The open-source version of the DLR has all the features of the DLR that is included in Visual Studio and the .NET Framework. Además, proporciona compatibilidad adicional para implementadores del lenguaje.It also provides additional support for language implementers. Para más información, vea la documentación en el repositorio IronLanguages/dlr en GitHub.For more information, see the documentation on the IronLanguages/dlr repo on GitHub.

Algunos ejemplos de lenguajes desarrollados con DLR son los siguientes:Examples of languages developed by using the DLR include the following:

  • IronPython.IronPython. Disponible como software de código abierto en el sitio web de GitHub.Available as open-source software from the GitHub Web site.

  • IronRuby.IronRuby. Disponible como software de código abierto en el sitio web de RubyForge.Available as open-source software from the RubyForge Web site.

Principales ventajas de DLRPrimary DLR Advantages

DLR ofrece las ventajas que se indican a continuación.The DLR provides the following advantages.

Simplifica el traslado de lenguajes dinámicos a .NET FrameworkSimplifies Porting Dynamic Languages to the .NET Framework

DLR evita a los implementadores del lenguaje crear analizadores léxicos, semánticos y de otro tipo, así como generadores de código y otras herramientas que tradicionalmente tenían que crear por sí mismos.The DLR allows language implementers to avoid creating lexical analyzers, parsers, semantic analyzers, code generators, and other tools that they traditionally had to create themselves. Para usar DLR, un lenguaje debe generar árboles de expresión, que representan el código del nivel de lenguaje en una estructura en forma de árbol, rutinas del asistente en tiempo de ejecución y objetos dinámicos opcionales que implementan la interfaz IDynamicMetaObjectProvider.To use the DLR, a language needs to produce expression trees, which represent language-level code in a tree-shaped structure, runtime helper routines, and optional dynamic objects that implement the IDynamicMetaObjectProvider interface. DLR y .NET Framework automatizan muchas de las tareas de análisis de código y generación de código.The DLR and the .NET Framework automate a lot of code analysis and code generation tasks. Esto permite que los implementadores del lenguaje se concentren en características únicas del lenguaje.This enables language implementers to concentrate on unique language features.

Habilita características dinámicas en lenguajes de tipos estáticosEnables Dynamic Features in Statically Typed Languages

Los lenguajes de .NET Framework existentes, como C# y Visual Basic, pueden crear objetos dinámicos y usarlos con objetos de tipos estáticos.Existing .NET Framework languages such as C# and Visual Basic can create dynamic objects and use them together with statically typed objects. Por ejemplo, C# y Visual Basic pueden usar objetos dinámicos para la reflexión .NET, HTML y Document Object Model (DOM).For example, C# and Visual Basic can use dynamic objects for HTML, Document Object Model (DOM), and .NET reflection.

Proporciona las futuras ventajas de DLR y .NET FrameworkProvides Future Benefits of the DLR and .NET Framework

Los lenguajes implementados mediante DLR pueden beneficiarse de las mejoras futuras de DLR y .NET Framework.Languages implemented by using the DLR can benefit from future DLR and .NET Framework improvements. Por ejemplo, si .NET Framework lanza una nueva versión que tiene un recolector de elementos no utilizados mejorado o un tiempo de carga de ensamblados más rápido, los lenguajes implementados mediante DLR pueden beneficiarse de inmediato de dicha ventaja.For example, if the .NET Framework releases a new version that has an improved garbage collector or faster assembly loading time, languages implemented by using the DLR immediately get the same benefit. Si DLR agrega optimizaciones como una mejor compilación, el rendimiento también mejora para todos los lenguajes implementados mediante DLR.If the DLR adds optimizations such as better compilation, the performance also improves for all languages implemented by using the DLR.

Habilita el uso compartido de bibliotecas y objetosEnables Sharing of Libraries and Objects

Los objetos y las bibliotecas implementados en un lenguaje pueden usarlos otros lenguajes.The objects and libraries implemented in one language can be used by other languages. DLR también permite la interoperabilidad entre los lenguajes de tipos estáticos y los lenguajes dinámicos.The DLR also enables interoperation between statically typed and dynamic languages. Por ejemplo, C# puede declarar un objeto dinámico que usa una biblioteca escrita en un lenguaje dinámico.For example, C# can declare a dynamic object that uses a library that is written in a dynamic language. Al mismo tiempo, los lenguajes dinámicos pueden usar bibliotecas de .NET Framework.At the same time, dynamic languages can use libraries from the .NET Framework.

Proporciona una distribución y una invocación dinámicas rápidasProvides Fast Dynamic Dispatch and Invocation

DLR permite la ejecución rápida de operaciones dinámicas, ya que admite el almacenamiento en caché polimórfico avanzado.The DLR provides fast execution of dynamic operations by supporting advanced polymorphic caching. DLR crea reglas para operaciones de enlace que usan objetos en las implementaciones en tiempo de ejecución necesarias y, después, almacena en caché estas reglas para evitar los cálculos de enlace que agotan los recursos durante las ejecuciones sucesivas del mismo código en los mismos tipos de objetos.The DLR creates rules for binding operations that use objects to the necessary runtime implementations and then caches these rules to avoid resource-exhausting binding computations during successive executions of the same code on the same types of objects.

Arquitectura de DLRDLR Architecture

En la ilustración siguiente se muestra la arquitectura de Dynamic Language Runtime.The following illustration shows the architecture of the dynamic language runtime.

Información general sobre la arquitectura de Dynamic Language Runtime Arquitectura de DLRDynamic Language Runtime Architecture Overview DLR architecture

DLR agrega un conjunto de servicios a CLR para una mejor compatibilidad con los lenguajes dinámicos.The DLR adds a set of services to the CLR for better supporting dynamic languages. Entre estos servicios, se incluyen los siguientes:These services include the following:

  • Árboles de expresión.Expression trees. DLR usa árboles de expresión para representar la semántica del lenguaje.The DLR uses expression trees to represent language semantics. Para ello, DLR ha extendido los árboles de expresión LINQ de modo que incluyan el flujo de control, la asignación y otros nodos de modelado del lenguaje.For this purpose, the DLR has extended LINQ expression trees to include control flow, assignment, and other language-modeling nodes. Para más información, vea Árboles de expresión (C#) o Árboles de expresión (Visual Basic).For more information, see Expression Trees (C#) or Expression Trees (Visual Basic).

  • Almacenamiento en caché del sitio de llamada.Call site caching. Un sitio de llamada dinámico es un lugar del código donde se realiza una operación como a + b o a.b() en objetos dinámicos.A dynamic call site is a place in the code where you perform an operation like a + b or a.b() on dynamic objects. DLR almacena en caché las características de a y b (generalmente, los tipos de estos objetos) e información sobre la operación.The DLR caches the characteristics of a and b (usually the types of these objects) and information about the operation. Si ya se ha realizado previamente una operación de este tipo, DLR recupera toda la información necesaria de la memoria caché para su distribución rápida.If such an operation has been performed previously, the DLR retrieves all the necessary information from the cache for fast dispatch.

  • Interoperabilidad de objetos dinámicos.Dynamic object interoperability. DLR proporciona un conjunto de clases e interfaces que representan operaciones y objetos dinámicos que pueden usar los implementadores del lenguaje y los autores de bibliotecas dinámicas.The DLR provides a set of classes and interfaces that represent dynamic objects and operations and can be used by language implementers and authors of dynamic libraries. Entre estas clases e interfaces se incluyen IDynamicMetaObjectProvider, DynamicMetaObject, DynamicObject y ExpandoObject.These classes and interfaces include IDynamicMetaObjectProvider, DynamicMetaObject, DynamicObject, and ExpandoObject.

DLR usa enlazadores en los sitios de llamada para comunicarse no solo con .NET Framework, sino con otras infraestructuras y servicios, incluidos Silverlight y COM.The DLR uses binders in call sites to communicate not only with the .NET Framework, but with other infrastructures and services, including Silverlight and COM. Los enlazadores encapsulan la semántica de un lenguaje y especifican cómo se realizan las operaciones en un sitio de llamada mediante el uso de árboles de expresión.Binders encapsulate a language's semantics and specify how to perform operations in a call site by using expression trees. Esto permite que los lenguajes dinámicos y de tipos estáticos que usan DLR compartan bibliotecas y obtengan acceso a todas las tecnologías que admite DLR.This enables dynamic and statically typed languages that use the DLR to share libraries and gain access to all the technologies that the DLR supports.

Documentación de DLRDLR Documentation

Para más información sobre cómo usar la versión de código abierto de DLR para agregar comportamiento dinámico a un lenguaje o sobre cómo habilitar el uso de un lenguaje dinámico con .NET Framework, vea la documentación en el repositorio IronLanguages/dlr en GitHub.For more information about how to use the open source version of the DLR to add dynamic behavior to a language, or about how to enable the use of a dynamic language with the .NET Framework, see the documentation on the IronLanguages/dlr repo on GitHub.

Vea tambiénSee also