代码之家  ›  专栏  ›  技术社区  ›  masoud ramezani

在C#中,CLR和DLR有什么区别?

  •  22
  • masoud ramezani  · 技术社区  · 15 年前

    在C#中,CLR和DLR有什么区别?这两个概念有可比性吗?

    4 回复  |  直到 15 年前
        1
  •  25
  •   Joey Gumbo    15 年前

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

    这个 Dynamic Language Runtime (DLR) 在此基础上构建,并为动态语言提供服务:动态类型、动态方法分派、代码生成和c。其思想是使这些内容统一,并在动态语言之间共享,以便它们可以预测和类似地工作,就像CLR上的内容也跨所有语言一样。

    在某种程度上,这些是可比的,.NET上的“普通”语言使用CLR,动态语言应该使用DLR,但也将使用CLR。它们是设计人员认为在跨语言通用时很好的基本功能集。IronPython和IronRuby是在DLR之上实现的,就像C#4一样 dynamic 特色。

        2
  •  17
  •   Joey Gumbo    9 年前

    我将添加一个简单的图表来演示这一点:

        "*** Runtime & Libraries ***"    │ "*** Languages ***"
    ┌────────────────────────────────────┤
    │ .NET Libraries                     │
    │   ┌────────────────────────────────┼──────────────────┐
    │   │ Dynamic Language Runtime (DLR) │ C# 4.0 'dynamic' ├────┐
    ├───┴────────────────────────────────┼──────────────────┘    │
    │ Common Language Runtime (CLR)      │   C# 1.0, 2.0, 3.0    │
    └────────────────────────────────────┴───────────────────────┘
    
        3
  •  7
  •   Daniel A. White    15 年前

    DLR运行在CLR的顶部。DLR允许C# dynamic 变量和其他动态语言特性。

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

        4
  •  7
  •   Athena Widget    10 年前

    只是给已经给出的优秀答案增加了一点清晰性。

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

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

    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)。 调用站点缓存。动态调用站点是代码中对动态对象执行A+b或A.b()等操作的位置。DLR缓存a和b的特性(通常是这些对象的类型)以及有关操作的信息。如果以前执行过这样的操作,则DLR会从高速缓存中检索所有必要的信息,以进行快速调度。 动态对象互操作性。DLR提供了一组表示动态对象和操作的类和接口,可供语言实现者和动态库的作者使用。这些类和接口包括IDynamicMetaObjectProvider、DynamicMetaObject、DynamicObject和ExpandoObject。 DLR在调用站点中使用绑定器不仅与.NET框架通信,还与其他基础设施和服务(包括Silverlight和COM)通信。绑定器封装语言的语义,并指定如何使用表达式树在调用站点中执行操作。这使得使用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++;