跨越编程语言界限(三)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhoulinshijie/article/details/77389374

一、为什么会引入dynamic

1、简化动态语言到 .NET Framework 的移植
借助于 DLR,语言实施者不必再按传统的方式来创建词法分析器、语法分析器、语义分析器、代码生成器以及其他工具。 若要使用 DLR,语言需要生成表达式树(以树形结构表示语言级代码)、运行时帮助器例程以及用于实现 IDynamicMetaObjectProvider 接口的可选动态对象。 DLR 和 .NET Framework 可以自动执行许多代码分析和代码生成任务。 这样,语言实施者就可以将精力集中在独有的语言功能上。

2、允许在静态类型化语言中使用动态功能
现有的 .NET Framework 语言(如 C# 和 Visual Basic)可以创建动态对象,并将动态对象与静态类型化对象一起使用。 例如,C# 和 Visual Basic 可以将动态对象用于 HTML、文档对象模型 (DOM) 和 .NET 反射。

3、提供 DLR 和 .NET Framework 的未来好处
通过使用 DLR 实现的语言可以从将来的 DLR 和 .NET Framework 改进中获益。 例如,如果 .NET Framework 发布的新版本改进了垃圾回收器或加快了程序集加载时间,则通过使用 DLR 实现的语言会立即获得相同的好处。 如果 DLR 优化了某些方面(如编译功能得到改进),则通过使用 DLR 实现的所有语言的性能也会随之提高。

4、允许共享库和对象
使用一种语言实现的对象和库可供其他语言使用。 DLR 还允许在静态类型化语言和动态语言之间进行互操作。 例如,C# 可以声明一个动态对象,而此对象使用利用动态语言编写的库。 同时,动态语言也可以使用 .NET Framework 中的库。

5、提供快速的动态调度和调用
DLR 通过支持高级多态缓存,能够快速执行动态操作。 DLR 首先会创建一些规则以将使用对象的操作绑定到必需的运行时实现,然后缓存这些规则,以避免在对同一类型的对象连续执行相同代码期间,出现将耗尽资源的绑定计算。

二、Dynamic Language Runtime architecture


三、The DLR adds a set of services to the CLR for better supporting dynamic languages

1、Expression trees. The DLR uses expression trees to represent language semantics. For this purpose, the DLR has extended LINQ expression trees to include control flow, assignment, and other language-modeling nodes. For more information, see Expression Trees (C# and Visual Basic).
表达式树。 DLR 使用表达式树来表示语言语义。 为此,DLR 对 LINQ 表达式树进行了扩展,以便包括控制流、工作分配以及其他语言建模节点。 

2、Call site caching. A dynamic call site is a place in the code where you perform an operation like a + b or a.b() on dynamic objects. The DLR caches the characteristics of a and b (usually the types of these objects) and information about the operation. If such an operation has been performed previously, the DLR retrieves all the necessary information from the cache for fast dispatch.
调用站点缓存。 动态调用站点是代码中用于对动态对象执行类似 a + b 或 a.b() 的操作的位置。 DLR 将缓存 a 和 b 的特性(通常是这些对象的类型)以及有关操作的信息。 如果之前已执行过此类操作,则 DLR 将从缓存中检索所有必需的信息,以实现快速调度。

3、Dynamic object interoperability. The DLR provides a set of classes and interfaces that represent dynamic objects and operations and can be used by language implementers and authors of dynamic libraries. These classes and interfaces include IDynamicMetaObjectProvider, DynamicMetaObject, DynamicObject, and ExpandoObject.
动态对象互操作性。 DLR 提供一组表示动态对象和操作的类和接口,可供语言实施者和动态库的作者使用。 这些类和接口包括 IDynamicMetaObjectProvider、DynamicMetaObject、DynamicObject 和 ExpandoObject。


DLR 通过在调用站点中使用联编程序,不仅可以与 .NET Framework 通信,还可以与其他基础结构和服务(包括 Silverlight 和 COM)通信。 联编程序将封装语言的语义,并指定如何使用表达式树在调用站点中执行操作。 这样,使用 DLR 的动态和静态类型化语言就能够共享库,并获得对 DLR 支持的所有技术的访问权。

三、什么C#可以调用Python?

DLR运行于CLR之上,提供了一个动态语言的运行环境,从而允许Python、Ruby等动态语言编写的程序在.NET平台上运行,同时,现有的.NET静态类型编程语言,比如C#和VB,也可以利用DLR而拥有一些动态编程语言的特征。


猜你喜欢

转载自blog.csdn.net/zhoulinshijie/article/details/77389374