C#中CLR和DLR有什么区别?这两个概念可比吗?C#中CLR和DLR有什么区别?
回答
公共语言运行库(CLR)的核心是一套由.NET提供的服务 - 一个类型系统,JIT,垃圾收集,&℃。这些都可用于所有.NET语言,因此是“通用”部分。
Dynamic Language Runtime (DLR)建立在此之上,并提供动态语言服务:动态类型,动态方法调度,代码生成,& c。我们的想法是将这些事情统一起来,并在动态语言之间共享它们,以便它们可预测和类似地工作,就像CLR上的事物也跨越所有语言一样。
通过某种方式,那些.NET上的“正常”语言使用CLR,动态语言应该使用DLR,但也会使用CLR。它们是设计师认为在跨语言通用时很好的基本功能集。 IronPython和IronRuby在DLR上实现,C#4的dynamic
功能也是如此。
DLR在CLR上运行。 DLR允许C#dynamic
变量和其他动态语言功能。
我只添加一个简单的图来证明这一点:
"*** 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,这是一个位于用户代码和物理硬件之间的抽象层。有几个优点:
- 硬件独立性2.通用类型系统3.语言的互操作性
在.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或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++;
- 1. Visual Studio C++ - 'CLR'和'General'类别有什么区别?
- 2. Silverlight 2中DLR语言和C#之间的速度有什么区别?
- 3. printf中%c和%C有什么区别?
- 4. C++中fprintf和vfprintf有什么区别?
- 5. C++中0x和'\ x'有什么区别?
- 6. C++中#import和#include有什么区别?
- 7. C中#define和'='有什么区别?
- 8. C#中ArrayList和Hashtable有什么区别?
- 9. 什么区别\\。\ C:和\\。\ C:\
- 10. char [] c和char c []有什么区别?
- 11. Managed C++和C++/CLI有什么区别?
- 12. Visual C++和C++有什么区别?
- 13. \ c和\\ c有什么区别?
- 14. c#和visual c#有什么区别?
- 15. 托管C++和C#有什么区别?
- 16. C++和C++ CLI有什么区别
- 17. 有什么区别`和$(Bash中有什么区别?
- 18. CLR Worker线程和Worker线程有什么区别?
- 19. windows线程池和CLR线程池有什么区别
- 20. 有什么区别C#
- 21. SqlCeConnection和SqlConnection C#有什么区别?
- 22. Objective-C和Cocoa有什么区别?
- 23. Lua C API:lua_gettop()和-1有什么区别?
- 24. jni compile cpp和c有什么区别?
- 25. 'b'和'c'有什么区别?
- 26. Ctrl-C和SIGINT有什么区别?
- 27. C和%之间有什么区别?
- 28. Ctrl + C和Ctrl + [有什么区别?
- 29. C#和.NET有什么区别?
- 30. GLSL和c有什么区别?
获取图右侧是比我想:-) – 2010-11-15 12:43:58
@Joey,断链更难 – James 2017-07-20 23:45:26