• 研究研究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/

  • 相关阅读:
    Linux 常用命令
    公钥,私钥和数字签名
    MySQL中的datetime与timestamp比较
    SQL开发技巧
    socket心跳包机制
    vue 路由回退,实现刷新原页面数据
    HTTP1.0、HTTP1.1 和 HTTP2.0 的区别
    Xshell常用命令
    学习Dart flutter --1
    学习JavaScript数据结构与算法(第2版)--01
  • 原文地址:https://www.cnblogs.com/icyJ/p/DLR.html
Copyright © 2020-2023  润新知