研究研究DLR (转载)

转载自:http://chen1996.blog.163.com/blog/static/44410052200910695345967/

前言

DLR(Dynamic Language Runtime),是微软主导的一个开源项目。为.NET应用程序,提供了脚本技持。目前版本为0.9,你可以从Codeplex获得源吗。

clip_image002

DLR主要提供以下三个功能

l 语言实现服务提供语言的互操作性

l 动态语言运行时服务提供动态调用支持

l 公共脚本宿主

依托这些模块,您可以非常轻松的做下面这些事情。

l 为您现有的.NET应用程序,加入脚本支持

l 为您现有的语言,提供动态支持

l 为任何对象提出供动态操作支持

l 在您的应用程序架构中提供脚本语言

DLR结构

clip_image004

上图作为脚本的使用者,只要关心“Common Hosting”中的类即可以了。而要实现脚本语言,就要实现和使用“Language Implementation”中的类。

公共脚本宿主(Common Hosting)

Common Hosting提供脚本宿主接口,支持所有基干DLR实现的语言。

它包含下列功能:

l 创建ScriptRuntime

l 执行脚本片段

l 执行脚本文件

l 明确指定脚本引擎,执行脚本

l 为脚本执行创建scope

l 设置variable提供宿主对像模型

l 在scope遍历动态对像与方法

l 调用动态方法,与事件帮定

l 获得对像成员的信息,与方法的参数信息及说明

l 当脚本语言导入其它文件时,控制文件的装入

clip_image006

上图是Common Hosting的基本架构,应用程序总是先创建ScriptRuntime。然后获取ScriptEngine、创建ScriptScope、执行脚本文件。

clip_image008

应用程序执行脚本的方法有很多种:

l 通过ScriptRuntime.ExcuteFile获得ScriptScope

l 通过ScriptRuntime.UseFile获得ScriptScope

l 通过ScriptRuntime.CreateScope获得ScriptScope,再执行ScripeScope.Execute或ScripeScope.IncludeFile

l 通过ScriptRuntime.GetEngine或ScriptRuntime.GetEngineByFileName获得ScriptEngine。调用ScriptEngine的CreateScriptSourceFromString或CreateScriptSourceFromFile或CreateScriptSourceFromStream创建ScriptSource,再执行ScriptSource.Execute。

l 有了ScriptSource也不一定要Execute,可以先调用Compile,产生CompiledCode,最后调用CompiledCode.Execute。

动态语言运行时(Runtime)

Runtime是DLR的核心,提供快速动态调用支持,努力分隔语言的实现。

l 通过Binder描述语义,执行操作并存贮在CallSite中

l 通过Rule描述简单的计算及执行操作的规则,也同样存贮在CallSite中

以上信息,就好比CLR的元数据,为JIT提供了很好的信息描述,使之能正确的操作。Binder与Rule,也同样为脚本引擎提供完善的信息,使脚本引擎能正确的处理。同时它也是一个公共标准,不同的脚本语言相互操作,完全透明了不再需要了解其它语言的实现细节。

DynamicObject简化基础库开发者。你可以实现IDynamicObject与DynamicMetaObject,从而不同的语言都能访问。否则,你只能创建表达式树,并创建自己的DynamicMetaObject帮定到CallSite供别人使用。

Utilities是一组帮助类,帮助你实现Binder用产生规则。

COM Interop实现了IDynamicObject与DynamicMetaObject,封装了COM的IDispatch接口。这样实现了IDispatch的任何COM对像,都能够轻松调用。

语言实现

DLR的语言实现模块核心是公共语法树(Shared AST)。Shared AST提供了一个,几乎能描述有所有语言的语言结构。DLR可以根据AST自动生成CIL代码,最终会被CLR编译成机器码执行。对于语言实现者,他可以把重心放在语言本身,而不必关心目标代码的细节,充分发晖.NET的优越性。语言实现的工作变成了,词法分析->语法分析->语义分析->(...中间的优化过程...)->Shared AST生成。

要实现语言,必须重写LanguageContext,以便能够通过Common Host模块提供统一的接口。如此开发一个宿主程,支持多种脚本语言也非常简单。目前,DLR提供了IronPython、Ruby、ToyScript等语言。

DLR的优越性

l Common Host,提供统一的脚本接口,使宿主应用程序开发变的非常简单。

l DLR是是基于.NET开发的,能够无缝的使用.NET基础类库。

l DLR的Shared AST,提供了公共的动态语言描述结构,使语言可互操作。

l .NET程序与DLR之间,互操作也非常简单。

l DLR充份发晖CLR的优越性,可以将脚本编译成CIL代码在CLR上执行。

转载自:http://chen1996.blog.163.com/blog/static/44410052200910695345967/

posted @ 2012-11-27 10:47  脸谱匠  阅读(547)  评论(0编辑  收藏  举报