MacRuby——将Ruby 1.9移植到Objective-C

一个苹果公司的新项目着力于提升MacOS X上的Ruby。 MacRuby项目是 Ruby 1.9的一个 Objective-C的移植版。

我们访问了MacRuby项目的Laurent Sansonetti来了解项目的信息和工作细节。

InfoQ: MacRuby是一个苹果公司赞助的项目吗?

Laurent Sansonetti: MacRuby是苹果公司创建的一个自由软件项目。目前项目参与者还都是苹果的雇员,但是我们无疑欢迎外界的贡献,这也是我们决定在 MacOSForge上开放项目并以公开的方式开发的原因。

InfoQ: 你们开发的MacRuby是基于Ruby 1.9/YARV的。从Ruby 1.9到MacRuby有哪些工作要做?是否很多都是关于对象创建的修改的?(从Ruby的方法改为使用Objective-C对象)。其他还有什么需要修改的?

Laurent Sansonetti: Ruby对象的数据结构不得不修改以适应Objective-C对象的数据结构,因此一个Ruby对象可以被转换为一个C级别的Objective-C对象。

接下来,对象分配器也被修改为使用Objective-C的对象分配器来代替,这意味着所有的对象(Ruby和Objective-C)的分配都来自同一个内存池。

最 后,传统的Ruby垃圾回收器被移除,我们使用了Objective-C垃圾回收器来代替。这个修改可不简单,因为回收器默认是运行在分代模式 (Generational Mode)下,预期你每次在对象仓库注册一个对象的时候需要适当的设置“写屏障”,因为回收器会根据这些信息来回收新生代对象。

InfoQ: 在创建表示Ruby类的Objective-C类时发生了什么?它们全部是在运行时动态创建的吗?

Laurent Sansonetti: 在你定义Ruby类的时候Objective-C类也同时被创建。如果反过来,当你通过MacRuby访问一个Objective-C对象时,它也会在YARV中延迟加载。

InfoQ: 在Ruby对象中,Objective-C方法是可见的吗?

Laurent Sansonetti: 是的,反之也一样,Ruby方法同样在Objective-C环境中可见。 

InfoQ: 一个对于Ruby空间的争论主题就是ObjectSpace。JRuby 1.1默认其失效。你知道Objective-C如何能够实现ObjectSpace的功能而不损失性能吗?

Laurent Sansonetti: 所有MacRuby对象都是从相同的内存池中分配的,更精确的说是同一个malloc区域(请看/usr/include/malloc/malloc.h来获得更多细节)。因此很容易就可以实现遍历整个区域并迭代其中的所有对象。这个功能是理所当然的。

然后,请注意在MacRuby中调用ObjectSpace#each_object明显要慢于Ruby。因为它将返回全部对象,包括你需要框架创建的纯Objective-C对象。

$ ruby -ve "p ObjectSpace.each_object {}"
ruby 1.8.6 (2007-09-24 patchlevel 111) [universal-darwin9.0]
310

$ /usr/local/bin/ruby -ve "p ObjectSpace.each_object {}"
MacRuby version 0.1 (ruby 1.9.0 2008-02-18 revision 0)
 [i686-darwin9.2.0]
8759

$ /usr/local/bin/ruby -ve "framework 'cocoa'; p ObjectSpace.each_object {}"
MacRuby version 0.1 (ruby 1.9.0 2008-02-18 revision 0) [i686-darwin9.2.0]
48425

InfoQ: 目前兼容性如何?我注意到字符串是基于NSString的——存在什么兼容性问题吗?原生扩展的兼容性又如何呢?

Laurent Sansonetti: 目前Ruby的String类继承自NSString来达到String到NSString的快速转换。所以目前没有兼容性问题。

然 而,在不久的将来,我们计划通过它们的CoreFoundation等价(CFString、CFArray和CFDictionary)重新实现 Ruby原始类(String、Array和Hash)以统一功能并使得在两个运行时之间实现无成本转换。因为我们注意到在一个典型应用的内部,大多数跨 运行时的对象都是原始类。

这个修改可能会引入某些兼容性问题,然而我们会尽力保持其兼容1.9和C扩展。

InfoQ: MacRuby的未来计划是什么?

Laurent Sansonetti: MacRuby的主要目标是让开发者可以通过Ruby写出非常棒的Cocoa应用,而这个通过我们在Mac OS X Leopard中引入的RubyCocoa技术是做不到的(我们依然继续支持RubyCocoa)。为了实现这个目标,我们还有工作要做。
我们同时也希望MacRuby可以在其它情况下工作良好。无论当前的修改还是我们计划引入的修改都无疑会对它们造成冲击。
我们很快会发布一个里程碑计划,还有第一个发布版!静候佳音吧。

检出MacRuby工程或者在MacOsForge上查看MacRuby的源代码。关于Laurent对MacRuby的声明请看ruby-core列表和后续关于诸如有键参数特殊语法特性的讨论。关于MacRuby更多的工作细节,请查看Wiki页HowDoesMacRubyWork。

查看英文原文:MacRuby - Ruby 1.9 ported to Objective-C

你可能感兴趣的:(MacRuby——将Ruby 1.9移植到Objective-C)