2010-11-15 147 views

回答

15

公共语言运行库(CLR)的核心是一套由.NET提供的服务 - 一个类型系统,JIT,垃圾收集,&℃。这些都可用于所有.NET语言,因此是“通用”部分。

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

通过某种方式,那些.NET上的“正常”语言使用CLR,动态语言应该使用DLR,但也会使用CLR。它们是设计师认为在跨语言通用时很好的基本功能集。 IronPython和IronRuby在DLR上实现,C#4的dynamic功能也是如此。

13

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

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

获取图右侧是比我想:-) – 2010-11-15 12:43:58

+0

@Joey,断链更难 – James 2017-07-20 23:45:26

3

只是平添几分清晰度到已经给优秀的答案。

首先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)。 呼叫站点缓存。动态调用站点是代码中的一个地方,您可以在动态对象上执行类似于+ 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++;