CL#中的CLR和DLR有什么区别?

时间:2010-11-15 12:09:00

标签: c# dynamic clr dynamic-language-runtime

C#中的CLR和DLR有什么区别?这两个概念是否具有可比性?

4 个答案:

答案 0 :(得分:22)

公共语言运行时(CLR)是.NET提供的核心服务集 - 类型系统,JIT,垃圾收集器,& c。这些可用于所有.NET语言,因此是“Common”部分。

Dynamic Language Runtime (DLR)构建于此之上并为动态语言提供服务:动态类型,动态方法调度,代码生成和& c。我们的想法是将这些内容统一起来并在动态语言中共享它们,以便它们可以预测和类似地工作,就像CLR上的内容也适用于所有语言一样。

在某些方面具有可比性,.NET上的“普通”语言使用CLR,动态语言应该使用DLR,但也会使用CLR。它们是设计师认为在各种语言中很常见的基本功能集。 IronPython和IronRuby是在DLR之上实现的,C#4的dynamic功能也是如此。

答案 1 :(得分:16)

我只需添加一个简单的图表来证明这一点:

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

答案 2 :(得分:7)

DLR运行在CLR之上。 DLR允许C#dynamic变量和其他动态语言功能。

http://en.wikipedia.org/wiki/Dynamic_Language_Runtime

答案 3 :(得分:7)

为已经给出的优秀答案添加一点清晰度。

首先是CLR,这是一个位于用户代码和物理硬件之间的抽象层。有几个优点:

  1. 硬件独立性2.通用类型系统3.语言互操作性
  2. CLR

    .Net DLR由Jim Hugunin创建,是

      

    动态语言运行时(DLR)是一个运行时环境,它将动态语言的一组服务添加到公共语言运行库(CLR)。 DLR使开发动态语言更容易在.NET Framework上运行,并为静态类型语言添加动态功能   动态语言可以在运行时识别对象的类型,而在静态类型语言(如C#和Visual Basic)中(当使用Option Explicit On时),您必须在设计时指定对象类型。动态语言的示例有Lisp,Smalltalk,JavaScript,PHP,Ruby,Python,ColdFusion,Lua,Cobra和Groovy。

    DLR架构
    DLR

      

    DLR为CLR添加了一组服务,以便更好地支持动态语言。这些服务包括以下内容:   表达树。 DLR使用表达式树来表示语言语义。为此,DLR扩展了LINQ表达式树以包括控制流,赋值和其他语言建模节点。有关更多信息,请参见表达式树(C#和Visual Basic)。   调用站点缓存。动态调用站点是代码中的一个位置,您可以在动态对象上执行类似+ b或a.b()的操作。 DLR缓存a和b的特征(通常是这些对象的类型)和有关操作的信息。如果先前已执行此类操作,则DLR从高速缓存中检索所有必要信息以便快速分派。   动态对象互操作性。 DLR提供了一组表示动态对象和操作的类和接口,可供语言实现者和动态库的作者使用。这些类和接口包括IDynamicMetaObjectProvider,DynamicMetaObject,DynamicObject和ExpandoObject。   DLR使用呼叫站点中的绑定器不仅可以与.NET Framework进行通信,还可以与其他基础结构和服务(包括Silverlight和COM)进行通信。 Binders封装了语言的语义,并指定了如何使用表达式树在调用站点中执行操作。这使得动态和静态类型语言能够使用DLR共享库并获得对DLR支持的所有技术的访问。

    示例

    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++;