在今后的数月和数年内动态语言将成为NET平台上越来越重要的角色微软在动态语言和CLR之间的集成作了大量的投资
在我们进入集成工作之前需要花点时间来讨论一下开源在NET平台上最重要的动态语言是IronPython和IronRuby这两种语言都采用的是开源协议它们并不按照正常的计划修改语言所有由微软支持的开源语言都有两个发布周期针对开源项目会有发布前/发布的通常计划这会有许多的展示版本与此同时还会有正式的微软首选的进行过深入测试的版本公司和开发人员可以选择任一种发布方式的版本它们都是基于同样的代码
至于集成都是围绕着IDynamicObject接口这种方法作为一个方法绑定器以允许每个对象使用的这些语言的语义开箱即用的语言包括IronPythonIronRubyJScript和COM是的COM被认为是后期绑定和动态方法调用方面的一门动态语言
在特定的语言绑定器之外开发人员可以在单一的类上使用特别规则最简单的方法是从使用抽象类DynamicObject开始下面是可以被重写自定义行为的动作清单你看这个清单的时候你会发现你所使用的语言的语法并不支持某些动作
GetMember
SetMember
DeleteMember
UnaryOperation
BinaryOperation
Convert
InvokeMember
Invoke
CreateInstance
GetIndex
SetIndex
DeleteIndex
开发人员并不需要实现所有的这些方法例如它们可以只通过支持SetMember和GetMember来创建一个属性包正是这样设计的方式一个真正动态的类可以用任何语言来编写甚至是像C#那样静态类型的语言
IronPython在最初是有它自己语言特定的语言抽象语法树在DLR的开发过程中发现在不同语言之间的差异事实上是很小的最后确定LINQ表达式树(LINQ Expression)是任何动态语言所需要的东西
将在NET 上增加所缺少的特性是分配流程控制(循环和goto)以及动态调度节点动态调度节点是语言特定和用于方法调用和重载决策的特定于语言的规则
特定于语言语义的一个示例是乘以亿的结果如果表达式树表达IronRuby或者IronPython的语义它将返回亿使用C#的默认语义将会溢出以及VB的语义将抛出一个异常也许想知道为什么IronRuby和IronPython在可能发生溢出的时候会自动转换Int到BigInteger
为了提高性能DLR使用一种新的call site机制DLR中的Call sites是动态调用基于委托的静态类型化的表示由于创建委托的开销是很大的委托被缓存到一个列表中对于每一个调用从列表中找到一个匹配的如果看到一个之前没见过的类型一个新的基于共享抽象语法树的类型被添加到列表中
要确定一个参数类型是否看到过每个语言需要提供一个MetaObject这用于检查参数类型是否与过去所见过的类型匹配以及如果类型匹配的话如何处理
创建新的MetaObject的能力允许开发人员替换掉昂贵的基于哈希表的名称而去查找代表了被调用的方法的实际表达式树这取决于它是如何编写的甚至可以超过静态语言世界中所看到的性能