转载自:http://chen1996.blog.163.com/blog/static/44410052200910695345967/
前言
DLR(Dynamic Language Runtime),是微软主导的一个开源项目。为.NET应用程序,提供了脚本技持。目前版本为0.9,你可以从Codeplex获得源吗。
DLR主要提供以下三个功能
l 语言实现服务提供语言的互操作性
l 动态语言运行时服务提供动态调用支持
l 公共脚本宿主
依托这些模块,您可以非常轻松的做下面这些事情。
l 为您现有的.NET应用程序,加入脚本支持
l 为您现有的语言,提供动态支持
l 为任何对象提出供动态操作支持
l 在您的应用程序架构中提供脚本语言
DLR结构
上图作为脚本的使用者,只要关心“Common Hosting”中的类即可以了。而要实现脚本语言,就要实现和使用“Language Implementation”中的类。
公共脚本宿主(Common Hosting)
Common Hosting提供脚本宿主接口,支持所有基干DLR实现的语言。
它包含下列功能:
l 创建ScriptRuntime
l 执行脚本片段
l 执行脚本文件
l 明确指定脚本引擎,执行脚本
l 为脚本执行创建scope
l 设置variable提供宿主对像模型
l 在scope遍历动态对像与方法
l 调用动态方法,与事件帮定
l 获得对像成员的信息,与方法的参数信息及说明
l 当脚本语言导入其它文件时,控制文件的装入
上图是Common Hosting的基本架构,应用程序总是先创建ScriptRuntime。然后获取ScriptEngine、创建ScriptScope、执行脚本文件。
应用程序执行脚本的方法有很多种:
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/