InfoQ

InfoQ

新闻

我的书签

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

该内容已经被标记书签!

标记书签错误,请重试!

Gardens Point Ruby.NET团队访谈录

作者 Werner Schuster 译者 霍泰稳 发布于 2007年6月15日

领域
架构 & 设计,
语言 & 开发
主题
Ruby ,
动态语言 ,
.NET框架 ,
.NET ,
语言 ,
编程 ,
CLR ,
采访 ,
互操作 ,
Ruby.NET

Gardens Point Ruby.NET编译器是一个在CLR上运行Ruby代码的支持平台,最近发布了0.8版本。最新的版本使得用Ruby访问用其他语言写的代码成为可能,反之亦然。因为对所有针对CLR或者JVM的Ruby运行时而言,互操作性都是一个重要的话题,因此我们就此采访了Ruby.NET团队成员John Gough。

首先,John与我们分享了一些关于Ruby.NET如何处理Ruby和.NET对象的一些实现细节:

互操作性依赖已存在的Ruby.NET中对象继承的选择。大多数在Ruby中定义的对象都是源自Ruby.Object的CLR类型。这些对象都有一个指向“类”对象的字段(Field),而“类”对象属于对象类型字典里某种类型。但是,对一些内嵌类的对象,比如FixNum、True、False等,是被一个封装有Raw值的空CLR对象所继承。

方法调度通过把对象作为参数,来调用一个名为“ClassOf”的静态方法予以实现。对于源于Ruby.Object的对象,这会返回一个Ruby类的类对象引用(Reference),而对于FixNum,运行时则返回一个FixNum类型的已知类描述的引用。

现在,请注意这一点:ClassOf不期望互操作对象被封装,所以如果有对象不是继承自Ruby.Object,且不是一个内建类型,它就必须是一个互操作对象。全局缓存中保留着从CLR类到Ruby类的映射关系,以支持从CLR类到封装互操作类上方法调用的Ruby类对象。

所以,当一个CLR类的对象首次出现时,对象不会被封装,但会创建一个Ruby类描述符完成这项工作。已有的方法使用反射按需被发现。还有一些事情,如重载方法,依然有很多未决的问题,尽管对一些小子集的调用,声明类型能处理绑定。

还有一些功能没有得到很好的处理,比如引用参数。John解释说:

0.8版本的另一个局限性是无法处理有引用参数的CLR方法。这不会让我们的进度停滞(译者注:show-stopper 一般指在Issue Tracking中,某个Issue过于严重而让项目不得不停滞)。这是Wayne Kelly的调用,但是我期望引用参数能通过复制传递而终止。要完成这些工作需要有许多管道代码(Plumbing Code),因为对于CLR而言,byref声明需要有确切的类型……而不是Ruby的一个外来概念。

注意:Wayne Kelly也是Gardens Point Ruby.NET团队成员。

兼容性和性能也是将来考虑的一部分。John说:

正如在发布声明中所说的一样,尽管在遇到严重的性能问题时我们试图避免任何不当的设计,在优化方面我们还没有任何作为。我们已经很接近要达到的目标了,一旦达到我们就可以加快进度。需要提出的是,我们没有做任何方法绑定的调用缓存,要知道它可能是在整个动态语言实现领域唯一最大的性能增强点。

在未来,Ruby.NET会考虑依靠社区贡献来进行完善。John解释了未来的发展规划:

我们会继续在这个项目上努力,这一过程至少要持续到年底。然后到1.0版本的时候,我们期望能将这个项目向社区公开。这只是我和Wayne Kelly所参与的几个项目中的一个而已。我们还负责Microsoft-QUT eResearch中心,网址为https://www.mquter.qut.edu.au,还为其他一些语言工具努力,请浏览http://plas.fit.qut.edu.au/projects,另外还要更新“Compiling for the .NET Common Language Runtime”这本书等。

关于Gardens Point Ruby.NET编译器的更多信息,请浏览Channel 9最近发布的对Wayne Kelly的采访

查看英文原文:Gardens Point Ruby.NET internals interview

译者 霍泰稳 霍泰稳是InfoQ中文站的联合创始人兼CEO,有多年的软件开发经验和媒体从业经历。