Joe*_*oey 25
公共语言运行时(CLR)是.NET提供的核心服务集 - 类型系统,JIT,垃圾收集器和c.这些可用于所有.NET语言,因此是"Common"部分.
在动态语言运行时(DLR)建立顶上的这一点,并为动态语言提供服务:动态类型,动态方法调度,代码生成,&C.我们的想法是将这些内容统一起来并在动态语言之间共享它们,以便它们可预测和类似地工作,就像CLR上的内容也是跨所有语言一样.
在某些方面具有可比性,.NET上的"普通"语言使用CLR,动态语言应该使用DLR,但也会使用CLR.它们是设计师认为在各种语言中很常见的基本功能集.IronPython和IronRuby是在DLR之上实现的,C#4的dynamic功能也是如此.
Tom*_*cek 17
我只需添加一个简单的图表来证明这一点:
"*** Runtime & Libraries ***" ? "*** Languages ***"
??????????????????????????????????????
? .NET Libraries ?
? ?????????????????????????????????????????????????????
? ? Dynamic Language Runtime (DLR) ? C# 4.0 'dynamic' ??????
????????????????????????????????????????????????????????? ?
? Common Language Runtime (CLR) ? C# 1.0, 2.0, 3.0 ?
??????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
只是为已经给出的优秀答案添加一点清晰度.
首先是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为CLR添加了一组服务,以便更好地支持动态语言.这些服务包括以下内容:表达式树.DLR使用表达式树来表示语言语义.为此,DLR扩展了LINQ表达式树以包括控制流,赋值和其他语言建模节点.有关更多信息,请参见表达式树(C#和Visual Basic).调用站点缓存.动态调用站点是代码中的一个位置,您可以在动态对象上执行类似+ b或ab()的操作.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++;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16541 次 |
| 最近记录: |