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

27

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

4个回答

28

公共语言运行时 (CLR) 是.NET提供的核心服务,包括类型系统、JIT编译器、垃圾收集器等。这些服务对所有.NET语言都可用,因此称之为“通用”部分。

动态语言运行时 (DLR) 基于CLR构建,并为动态语言提供服务:动态类型、动态方法调度、代码生成等。其目的在于使这些功能对动态语言来说具有统一性和共享性,以便它们可以像CLR上的所有语言一样工作得可预测且类似。

从某种意义上讲,这两者是可以相互比较的,“普通”的.NET语言使用CLR,而动态语言应该使用DLR,但也会同时使用CLR。它们是设计师认为跨语言通用的基本功能集。IronPython和IronRuby都是基于DLR实现的,C#4的 dynamic 特性也是基于DLR实现的。


1
基本上就是多了一层?IronPython能直接使用CLR吗? - Pacerier
@Pacerier:是的。是的。DLR只是使得在运行时进行通常在编译时完成的操作变得方便和容易,并以一种对使用DLR的所有语言都一致的方式进行。正如提到的那样,C#的“dynamic”也使用DLR。 - Joey

20

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

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

请使用图片或虚线边框,因为仅从当前的ASCII图表中很难确定CLR是否包含在.NET Libs中。 - Cœur
1
这是什么类型的图表,它代表了什么意思? - MarredCheese

9

在已经给出的优秀答案上,我想进一步澄清。

首先是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表达式树,包括控制流、赋值和其他语言建模节点。有关更多信息,请参见Expression Trees(C#和Visual Basic)。 - 调用站点缓存。动态调用站点是代码中执行操作的位置,例如在动态对象上执行a+b或a.b()等操作。DLR缓存a和b的特性(通常是这些对象的类型)以及有关操作的信息。如果之前已经执行过这样的操作,DLR将从缓存中检索所有必要的信息以快速分派。 - 动态对象互操作性。DLR提供了一组类和接口,表示动态对象和操作,可以被语言实现者和动态库作者使用。这些类和接口包括IDynamicMetaObjectProvider、DynamicMetaObject、DynamicObject和ExpandoObject。 - DLR在调用站点中使用绑定器,不仅与.NET Framework通信,还与其他基础结构和服务通信,包括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++;  

动态类型与 Visual Basic 中的 Var(或者无类型声明或延迟绑定)有何不同?或者说 C# 还在追赶 VB 吗? - Venkat

8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接