CLR和DLR在C#中有什么区别?这两个概念可比较吗?
CLR和DLR在C#中有什么区别?这两个概念可比较吗?
公共语言运行时 (CLR) 是.NET提供的核心服务,包括类型系统、JIT编译器、垃圾收集器等。这些服务对所有.NET语言都可用,因此称之为“通用”部分。
动态语言运行时 (DLR) 基于CLR构建,并为动态语言提供服务:动态类型、动态方法调度、代码生成等。其目的在于使这些功能对动态语言来说具有统一性和共享性,以便它们可以像CLR上的所有语言一样工作得可预测且类似。
从某种意义上讲,这两者是可以相互比较的,“普通”的.NET语言使用CLR,而动态语言应该使用DLR,但也会同时使用CLR。它们是设计师认为跨语言通用的基本功能集。IronPython和IronRuby都是基于DLR实现的,C#4的 dynamic
特性也是基于DLR实现的。
我只需要添加一个简单的图表来说明这一点:
"*** Runtime & Libraries ***" │ "*** Languages ***"
┌────────────────────────────────────┤
│ .NET Libraries │
│ ┌────────────────────────────────┼──────────────────┐
│ │ Dynamic Language Runtime (DLR) │ C# 4.0 'dynamic' ├────┐
├───┴────────────────────────────────┼──────────────────┘ │
│ Common Language Runtime (CLR) │ C# 1.0, 2.0, 3.0 │
└────────────────────────────────────┴───────────────────────┘
在已经给出的优秀答案上,我想进一步澄清。
首先是CLR,这是一个抽象层,位于用户代码和物理硬件之间。有几个优点:
.Net DLR由Jim Hugunin创建,它是:
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支持的所有技术。动态语言运行时(DLR)是一个运行时环境,为动态语言添加了一组服务,以便在公共语言运行时(CLR)上运行。 DLR使得更容易开发动态语言来运行在.NET Framework上,并向静态类型语言添加动态特性。
动态语言可以在运行时识别对象的类型,而在静态类型语言(如C#和Visual Basic(使用Option Explicit On))中,您必须在设计时指定对象类型。动态语言的例子有Lisp,Smalltalk,JavaScript,PHP,Ruby,Python,ColdFusion,Lua,Cobra和Groovy。
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++;
dynamic
变量和其他动态语言特性。