DLR学习笔记(00-1)

这些笔记来自于学习《Pro DLR in .NET 4》一书所得。

很多人认为DLR和他们的工作不相关,因为他们认为DLR是用来实现某些新语言的。而大多数人写程序是解决某些问题,很少去实现语言,因此觉得学习DLR划不来。这事实上也是我第一次听到DLR的想法,这是一个误解。学习DLR之后,我意识到DLR有广泛的适用性。DLR不仅仅只用来运行或者实现冬天语言。它也能用在应用程序脚本,元数据变成,面向方面编程(AOP),构建领域特定语言DSL(domain-specific languages),单元测试等。

DLR是一个runtime,意思就是如果在DLR上建立应用程序,发布应用程序时候就需要和DLR一起发布,更专业的说,需要发布一些程序集比如Microsoft.Scripting.dll和Microsoft.Dynamic.dll。这个两个dll是构成DLR程序集中的一部分。

DLR的主要工作之一就是执行表达式。你可以把表达式认为是一种中间语言就像MSIL。表达式和DLR的关系就好比MSIL和CLR的关系。就像CLR执行C#或者VB.NET编译后的MSIL,JVM执行Java字节码,IronPython runtime解释Python代码那样。

DLR通过解释或者编译表达式,将表达式变成MSIL。DLR编译表达式为MSIL后,MSIL代码会由CLR代码执行。图1-5显示这个流程,如你所看到的那样,DLR构建在CLR之上,它产生的MSIL代码的质量也影响了CLR运行的质量。

0e5749989d7e49258b26131399e9a39d

作为runtime,CLR提供很多服务,诸如垃圾回收,运行时类型检查,安全控制等的。DLR和CLR一样,也提供多种服务,包括API宿主,API调式,调用站点缓存,表达式编译和解释,动态语言互动性的元对象协议。除了这些服务,由于DLR是构筑在CLR之上的,创建在DLR上的应用程序也同时享有CLR提供的服务所带来的好处。比如垃圾回收机制也很容易在DLR上使用。看一下IronPython,IronPython 是一个runtime语言,解释Python代码,构建在DLR之上。所以如果运行IronPython代码,将会有3种语言runtime,CLR,DLR和IronPython。

为了避免歧义,澄清一下单词runtime和词组run time。Runtime在我们的上下文中指的是软件的组件。Run time则是代码运行了多少时间。

Wiki对于runtime的定义如下:

A run-time system (also called runtime system or just runtime) is a software component designed to support the execution of computer programs written in some computer language. The run-time system contains implementations of basic low-level commands and may also implement higher-level commands and may support type checking, debugging, and even code generation and optimization.

http://en.wikipedia.org/wiki/Run-time_system

基于DLR的语言可能有编译器,也可能没有。即使有编译器,你也可以选择不使用它。比如,IronPython提供一个编译器,你可以使用它编译IronPython代码为IL。但是,某些时候,你可能不想每次都编译。比如,某些场合下,你的程序能接受脚本,允许用户写IronPython代码来扩展你的应用程序,由于IronPython代码由用户编写,你可能希望代码不需要编译。下面的代码片段,展示了IronPython代码,此代码把编译源文件sample.py编译为.NET程序集文件 sample.dll。

import clr

clr.CompileModules("sample.dll", "sample.py")

常规的基于DLR的语言比如IronPython转换输入代码,构建自己的AST(抽象语法树),翻译AST为DLR的AST,调用DLR来解释或者编译这些DLR的AST。图1-8展示了编译Python代码到MSIL的过程。

825e660960fb44cd8802a3a6def54a8c

DLR AST(抽象语法树)作为DLR表达式编译器的输入项,DLR表达式编译器由类Microsoft.Scripting.Ast.LambdaCompiler实现。编译表达式不是一个简单的工作。DLR可以选择解释表达式来代替编译它们。

Dynamic vs. Static

我们如何判断一个语言是动态语言还是静态语言,表面上,似乎一个动态语言,你不需要指定变量类型。然而这不是正确的,一个反例就是F#。F#不需要在代码中指定类型,但它是一个静态语言。它在编译的时候,通过执行类型推断和类型检测来展示它的类型规则。

另一个标准视乎更加合理,就是看这个语言是否有编译器。这点对于很多情况下都是正确的,但不是所有情况。比如之前说的IronPython代码,它也有个编译器,编译成IL,但是IronPython是动态语言。

事实上,一个语言是动态还是静态只反应在程度上。我们通常认为的静态语言,比如C#,JAVA,并不是真正的静态。在程序语言环境中,动态意味着在运行时会做事。相对的,静态意味着在编译时候做事。根据这个观点,C#或者JAVA在数组边界检查时,是动态的。C#编译器不检查如下的错误:

String[] names = new String[] {“John”, “Mary”};

String name = names[10];

C#编译器不可能知道有多少个names在数据库中,除非它运行代码。数组边界检查是一个典型的例子,说明即使静态语言也会在运行时执行活动。此外,c# 4.0中加入“dynamic”关键字,作为一个新特性。这表明,判断一个语言是动态还是静态,没有那种非黑即白的标准。

通常有两个度量因素来判断,就是动态类型和动态调度(也叫延迟绑定)。如果一个语言有这些特征,通常被认为是更动态的语言。

 

Wiki对于runtime的定义如下:

A run-time system (also called runtime system or just runtime) is a software component designed to support the execution of computer programs written in some computer language. The run-time system contains implementations of basic low-level commands and may also implement higher-level commands and may support type checking, debugging, and even code generation and optimization.

http://en.wikipedia.org/wiki/Run-time_system

你可能感兴趣的:(编程,学习,应用程序)