InfoQ

新闻

.NET和动态语言

作者 Jonathan Allen译者 张善友 发布于 2008年11月4日 下午9时48分

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

查看英文原文:.NET and Dynamic Languages

没有回复

回复

深度内容

Flex与JSON及XML的互操作

平台需要互操作性。在这篇文章中,作者仔细研究了Flex和JSON及XML的互操作性。文章也包含了使用E4X库来将XML映射到图表和表格组件的内容,还演示了如何使用as3core库来解码JSON消息。

用Qi4j进行面向组合编程

本文将简要介绍面向组合编程(COP,Composite Oriented Programming)的概念,展示它如何规避OOP存在的一些问题,并重新点燃使用可重用部件组装领域模型(Domain Model)的希望。

系统开发——新学科,新教育

一门新的计算机学科——“系统开发”,强调人性化、匠艺、设计、创意、创新和新事物的涌现,并建议用被称为“bottega”的工作室替代乏善可陈的教室。

图书聚焦:Visual Studio 2008 揭秘

Mike Snell和Lars Powers用他们最近由Sams出版的新书《Visual Studio 2008揭秘》,试图帮助大家提高开发人员的生产力。本文包括一个下载样章——第10章调试。

BPEL为何不是BPM的圣杯?

Pierre Vigneras在本文中讨论了作为标准之一的BPEL所存在的问题。Pierre先给我们大致介绍了一个简单的并行流程,接着讨论了从业者在试图以一个结构化模型为基础表达非结构化流程时遇到的一系列问题。

基于范型的多语言编程

你是否仔细思考过,为什么人们总在讨论“要正确的语言做恰当的事情”?在这篇文章中,Sadek Drobi向你解释了为什么应该在系统内部混合使用多种语言。

采访与书摘《Pro Web 2.0 Application Development with GWT》

Jeff Dwyer就关于他的新书(《Pro Web 2.0 Application Development with GWT》)、GWT1.5以及创建可搜索的Ajax应用谈了一些他的见解。

时刻准备着,迎接IT业的春天

我们需要设身处地地为客户及客户的业务本身着想,与客户同舟共济。更多创新的思路、产品和模式也同样将为IT业带来新的出路。IT业并不需要坐以待毙,在春天到来之后,市场将会更加繁荣!