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 的采访。
评论