Mobile Ruby 综述:Symbian Ruby 1.9、Android、JME、iPhone 及 Mono

阅读数:372 2008 年 11 月 23 日

话题:Java.NETRuby移动Android语言 & 开发架构

Ruby 1.9 针对 Symbian 的版本已经发布了,之前针对 Symbian 的 Ruby 1.8 版也早已出现(同时还有 Python for Symbian)。

除了应用于 Symbian 的 Ruby,现在还缺少对移动电话上的 Ruby 的支持。不过我们可以在 Android 上运行 Ruby 的 ARM 版

既然 Android 基于 Java,我们当然就可以在它上面运行 JRuby 了。一个需要注意的问题是 Android 不会执行 Java 字节码,而是执行 Dalvik 字节码(我们必须将 JVM 字节码转换成 Dalvik 字节码)。在 JRuby 用户列表的一个讨论中,JRuby 的 Charles Nutter 列举出了如下可能的解决方案

有如下两种可能的执行场景会突破这些限制:

* 纯解释,所有的代码在设备上完成了解析并且通过我们的 AST-walking 解释逻辑执行。其速度可能比我们想的要慢点但实现起来很简单。

* 纯编译,所有的调用和处理都提前生成好。

在当前的代码基上已经实现了这两种方式;还需要做的一件事就是生成一个可用的.jar 文件,该文件只会提供其中一种方式并且不会依赖于另一种方式。

当前在 JME 上运行 JRuby 实在不是一个好主意。早在 2007 年的 JavaOne 大会上就已经介绍了针对 JME 的 JRuby 版本。这个链接页面上的 Zip 文件含有该介绍的幻灯片,它详细说明了如何得到 JRuby 的一个子集以运行于 JME 上。因为 JME 是 Java 的一个简化版,因此要想让 JRuby 运行于其上需要对 JRuby 的很多内容进行重写。当前版本的 JRuby 依赖于 Java 5——但正如幻灯片中所述,JME 缺少 Java 1.2 之后所增加的那些类和方法。其中最缺少的就是正则表达式和大部分 Collections API。

针对 iPhone 的 IronRuby 和 Mono 很快就要出来了。但 iPhone AppStore 不提供解释器的下载,最新版本的 Mono 提供了一个解决方案:提前编译,也就是说将 CIL 中的代码编译到 CPU 指令中,对于 iPhone 来说就是编译到 ARM 指令中。因为 IronRuby 可以将 Ruby 代码编译到 CIL 中而不是对其进行解释,所以我们可以将 Ruby 应用编译到 CIL 中,接下来 AOT 再来编译并在 iPhone 中运行该应用。正如Miguel de Icaza 所述,要想成功运行 IronRuby 代码,我们还需要解决一些小问题

当然,一旦移除了 JIT,你将无法使用任何动态生成的代码。这意味着如果没有 Reflection.Emit,也就没有了 IronPython/IronRuby。

John Lam 在 PDC 上跟我说他们正在研究如何实现 IronPython/IronRuby/DLR 的静态编译,因此这种限制很可能是短暂的。

查看英文原文:Mobile Ruby Roundup: Symbian Ruby 1.9, Android, JME, iPhone and Mono