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

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

你可能感兴趣的:(Mobile Ruby综述:Symbian Ruby 1.9、Android、JME、iPhone及Mono)