InfoQ

InfoQ

新闻

我的书签

登录注册 以永久保存书签。

该内容已经被标记书签!

标记书签错误,请重试!

.NET和动态语言

作者 Jonathan Allen 译者 张善友 发布于 2008年11月4日

领域
架构 & 设计,
语言 & 开发
主题
动态语言 ,
.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

译者 张善友 毕业于兰州大学数学系,现任职于腾讯公司企业IT部,微软多届ASP.NET MVP。

深度内容

专访Jeffery Richter:Windows 8是微软的重中之重

Jeffery Richter以其多本Windows核心技术的经典著作而闻名,同时,他深入掌握微软的.NET等一系列核心技术,2012年1月,Jeffery Richter在北京接受了InfoQ中文站的专访,谈到Windows 8和WinRT编程,并就异步编程、Windows编程中的可扩展性、性能和安全性方面给出自己的建议。

应用云平台的可用性——从新浪SAE看云平台设计

云计算平台的可用性,相比传统互联网服务而言,更加复杂和困难,也更具有挑战性。本文借助新浪SAE云平台为读者讲述了云平台可用性的定义、如何打造高可用的平台,以及对云计算的用户提出了建议。

JVM定制改进 @ 淘宝

淘宝高度重视Java平台的健康发展,组建了一个团队专注于Java平台的底层部分的性能、功能与稳定性改进;工作主要基于OpenJDK中的HotSpot VM开展,其中一些通用的功能随后也会逐渐反馈给OpenJDK社区。希望能与使用Java平台开发应用的大家交流经验。
本次演讲视频录制于QCon杭州2011

"伤得起"的云计算应用——对云端应用之架构的思考

2011年4月21日至22日是值得云计算从业者纪念的日子。Amazon的IaaS服务出现故障,导致许多商业网站的服务中断,影响非常严重。作为云计算用户,我们需要思考的是,如何保证即便在云服务不可用的情况,我们的应用架构仍然能够屹立不倒?本文正是站在云计算用户的角度试图探讨这一问题。

让交付的速度跟上思考的速度

12人的技术团队,4组刀片服务器,每月20亿的访问量,每日1次准时部署,99.9%的可用性。这可能吗?当然。想知道如何做的吗?百姓网将与您分享他们在DevOps实践过程中的经验和技巧。
本次演讲视频录制于QCon杭州2011

架构之路——穿行在产品和业务之间

篱笆作为一家起源于社区的电子商务公司,反映到技术层面就是同时要面对产品和业务,以及经营战略的变化调整。如何在产品和业务的夹缝之间完成技术架构的抽象与平衡,寻找更有效的价值定位,这当中有些经验教训和个人感悟愿与众人分享。
本次演讲视频录制于QCon杭州2011

特性注入:成功三部曲

本文将对特性注入以及相关方法做一个扫盲性的介绍。我们会解释这个框架的关键要素,并附上实例来证实它们。为了让文章保持相对较短,我们不会深入到某个工具或方法中,而是会给出一些参考资料,以便大家做进一步的研究。

解析JDK 7的动态类型语言支持

随着JDK 7的发布,字节码指令集终于迎来了第一位新成员——invokedynamic指令。这条新增加的指令是JDK 7实现“动态类型语言(Dynamically Typed Language)”支持而进行的改进之一,也是为JDK 8可以顺利实现Lambda表达式做技术准备。在这篇文章中,我们将去了解JDK 7这项新特性的出现前因后果和它的意义。