MacRuby 0.6:GCD,线程性能改进,更快的调试器,AOT

阅读数:537 2010 年 5 月 17 日

话题:RubyApple语言 & 开发

MacRuby 0.6已经发布(MacRuby 0.6下载链接)。

MacRuby 0.6 升级日志中指出,MacRuby 0.6 现在可以说是非常适合 Cocoa 开发,完善的 XCode 和预编译(AOT)支持将编译 Ruby 源代码以及运行二进制文件变为可能。

之前披露的一样,0.6 版实验性地加入了调试支持。MacRuby 的调试是在编译的代码中加入特殊指令以触发断点,而不是像其他 Ruby 编译器那样使用追踪或者 Ruby VM Hook。

关于此调试器,升级日志中描述说:

此调试器最有意思的特性是它被抽象为一个简单的 Objective-C API,而且将 macrubyd 作为一个客户端来使用。在未来我们可能会看到更多这样的结构。

Java 和 Ruby 的库之间的比较可以在Debug-Commons项目中找到。

MacRuby 0.5 移除了 GIL 之后,线程能够并行地运行(而不是像 Ruby 1.9 那样一次只能运行一个 Ruby 线程)。0.6 对多线程模式做了一些新的改进,例如(根据升级日志):

最后要说的是,在这个版本中,我们完全重写了 Regexp 类。它现在是基于 ICU 架构而不是 Oniguruma 的正则表达式编译和模式匹配架构。因为 ICU 是线程安全的。在 MacRuby 0.6 中,多线程可以高效地使用正则表达式。

MacRuby 0.5 已经开始支持Grand Central Dispatch(GCD),Apple 在 Mac OS X 雪豹和 Phone OS 4.0 上的系统级线程池以及任务系统。MacRuby 0.6 还在‘dispatch’库中加入了一些新的特性和抽象概念。

Job 提供了和 Thread 类似的接口,可以用于异步执行代码。它可以在同步或者异步的情况下使用。如下的代码就是一个例子。Job 类做一些工作,然后等待其结束(这段代码取自文档):

@result = job.value

puts @result.to_int.to_s.size # => 51

异步方式需要传递一个回调函数,一旦 Job 完成工作便调用此函数;在 Ruby 中,这个当然是使用代码段来完成。

job.value {|v| p v.to_int.to_s.size } # => 51 (eventually)

MacRuby Dispatch 库引入的另一个工具便是 Proxy,这个工具能够帮助将调用对象的方法序列化。

其他的新特性有迭代并行化,例如迭代器的并行实现,包括Enumerable#p_each, Enumerable#p_map, Enumerable#p_find和 其他类似的方法。

GCD 另一个激动人心的特性是事件源,这个特性能够允许用户在特定的事件中注册处理器,然后在 GCD 的队列中监视事件。事件源可以是计时器,进程的信号,I/O 的输入描述符等。事件源的确是一个非常有用的工具,它能够帮助开发者利用 OS 级的线程池,运行在队列中的事件处理器,当事件到来的时候,处理器从线程池中取出线程,然后运行完毕之后将线程放置回线程池中。

可以阅读 dispatch 库源码的README获取更多关于 MacRuby 0.6 中 GCD 特性的信息。

MacRuby 0.6 发布之后,用户发现了一个问题,在运行某代码段的时候,从后台线程切换到主线程会导致程序崩溃。因此,一旦发现这样古怪的线程问题,请细心留意;不过,MacRuby 的 trunk 代码库中很快就会增加 bug 报告功能。

每一个 Ruby 版本中最大的问题不用说,当然是兼容性问题;MacRuby 0.6 是如何处理这个问题的呢(根据升级日志):

MacRuby 0.6 支持为官方 Ruby 编写的 C 插件。我们也能够成功支持 Nokogiri,SQLite3 以及 PostGreSQL 的 MacRuby 旧版本插件。

这个发布版能够通过 85% 的 RubySpecs 测试,可以更好地支持修改过的 Rails 3 和 Ruby 1.9 编码。



最后要说的是,Matt Aimonetti 正在为 O'Reilly 写一本书,书名是 MacRuby: The Definite Guide,开头数个章节已经可以在线阅读了

查看英文原文:MacRuby 0.6 With GCD and Threading Improvements, Fast Debugger, AOT