c# dynamic clr dynamic-language-runtime

¿Cuál es la diferencia entre CLR y DLR en C#?



dynamic dynamic-language-runtime (4)

El Common Language Runtime (CLR) es el conjunto principal de servicios ofrecidos por .NET: un sistema de tipos, JIT, un recolector de basura, & c. Están disponibles para todos los lenguajes .NET, de ahí la parte "Común".

El Dynamic Language Runtime (DLR) se construye sobre esto y ofrece servicios para lenguajes dinámicos: tipos dinámicos, envío dinámico de métodos, generación de código, & c. La idea es hacer que esas cosas sean uniformes y compartirlas entre lenguajes dinámicos para que funcionen de manera predecible y similar, al igual que las cosas en el CLR están en todos los idiomas también.

De una manera que son comparables, un lenguaje "normal" en .NET usa el CLR, un lenguaje dinámico debería usar el DLR, pero también usará el CLR. Son conjuntos básicos de funcionalidad que los diseñadores consideraron buenos cuando son comunes en todos los idiomas. IronPython e IronRuby se implementaron en la parte superior del DLR, al igual que la característica dynamic C # 4.

¿Cuál es la diferencia entre CLR y DLR en C #? ¿Son estos dos conceptos comparables?



Solo añadiendo un poco de claridad a las excelentes respuestas ya dadas.

Primero, el CLR, esta es una capa de abstracción que se encuentra entre el código de usuario y el hardware físico. Hay varias ventajas:

  1. Independencia del hardware 2. Sistema de tipo común 3. Interoperabilidad del lenguaje

El .Net DLR fue creado por Jim Hugunin y fue

El tiempo de ejecución de lenguaje dinámico ( DLR ) es un entorno de ejecución que agrega un conjunto de servicios para idiomas dinámicos al tiempo de ejecución de lenguaje común (CLR). El DLR facilita el desarrollo de lenguajes dinámicos para ejecutarse en .NET Framework y para agregar características dinámicas a los lenguajes tipificados estáticamente.
Los idiomas dinámicos pueden identificar el tipo de un objeto en tiempo de ejecución, mientras que en idiomas tipificados estáticamente como C # y Visual Basic (cuando se usa la opción explícita en), debe especificar los tipos de objetos en el momento del diseño. Ejemplos de lenguajes dinámicos son Lisp, Smalltalk, JavaScript, PHP, Ruby, Python, ColdFusion, Lua, Cobra y Groovy.

Arquitectura DLR

El DLR agrega un conjunto de servicios al CLR para un mejor soporte de idiomas dinámicos. Estos servicios incluyen los siguientes: Á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 extendido los árboles de expresión LINQ para incluir el flujo de control, la asignación y otros nodos de modelado de lenguaje. Para obtener más información, consulte Árboles de expresiones (C # y Visual Basic). Llamar al caché del sitio. Un sitio de llamada dinámico es un lugar en el código donde realiza una operación como a + b o ab () en objetos dinámicos. El DLR almacena en caché las características de a y b (generalmente los tipos de estos objetos) e información sobre la operación. Si dicha operación se realizó anteriormente, el DLR recupera toda la información necesaria de la memoria caché para un envío rápido. Interoperabilidad de objetos dinámicos. El DLR proporciona un conjunto de clases e interfaces que representan objetos y operaciones dinámicos y pueden ser utilizados por los implementadores de lenguaje y los autores de bibliotecas dinámicas. Estas clases e interfaces incluyen IDynamicMetaObjectProvider, DynamicMetaObject, DynamicObject y ExpandoObject. El DLR utiliza los enlazadores en los sitios de llamadas para comunicarse no solo con .NET Framework, sino con otras infraestructuras y servicios, incluidos Silverlight y COM. Los enlaces encapsulan la semántica de un idioma y especifican cómo realizar operaciones en un sitio de llamada mediante el uso de árboles de expresión. Esto permite lenguajes dinámicos y estáticos que utilizan el DLR para compartir bibliotecas y obtener acceso a todas las tecnologías que admite el DLR.

Ejemplos

dynamic d = "test"; Console.WriteLine(d.GetType()); // Prints "System.String". d = 100; Console.WriteLine(d.GetType()); // Prints "System.Int32". dynamic d = "test"; // The following line throws an exception at run time. d++;


Solo agregaré un diagrama simple para demostrar el punto:

"*** Runtime & Libraries ***" │ "*** Languages ***" ┌────────────────────────────────────┤ │ .NET Libraries │ │ ┌────────────────────────────────┼──────────────────┐ │ │ Dynamic Language Runtime (DLR) │ C# 4.0 ''dynamic'' ├────┐ ├───┴────────────────────────────────┼──────────────────┘ │ │ Common Language Runtime (CLR) │ C# 1.0, 2.0, 3.0 │ └────────────────────────────────────┴───────────────────────┘