使用 JRuby 生成 JVM 代码

  • Mirko Stocker
  • 张龙

2008 年 3 月 28 日

话题:JavaRuby编程语言语言 & 开发架构

尽管 JRuby 的性能已经接近 CRuby 了,但有时它仍然不够快。CRuby 的用户可以使用 Ryan Davis 的RubyInline库,它提供了对 C/C++ 的内建支持以便更容易的产生 Ruby 的 C 扩展。来自 JRuby 阵营的 Charles Nutter 现在已经为 JRuby实现了一个 RubyInline builder ,它可以即时编译嵌入的 Java 代码。

下面是Ryan Davis 提供的使用 C 编写的一个阶乘计算方法的示例

class MyTest

 inline do |builder|

 builder.c "

  long factorial_c(int max) {

 int i=max, result=1;

while (i >= 2) { result *= i--; }

return result;

}

"

 end

end

下面是Charles 提供的相应的 JRuby 实现

class FastMath

 inline :Java do |builder|

  builder.package "org.jruby.test"

builder.java "

  public static long factorial_java(int max) {

 int i=max, result=1;

 while (i >= 2) { result *= i--; }

return result;

}

 "

 end

end  

RubyInline for JRuby 的一个缺点在于其需要 Java 6 JDK(对于编译器),它可能还无法在所有系统上都可使用。

另一个可产生快速执行代码的方法就是直接产生 JVM 字节码。对于正常的应用来说,这听起来有些过激了,像编译器这样的字节码生成工具会从一个简单的字节码生成 DSL 中获益,就像早前 Charles Nutter 的博客中提到的那样。然而即便通过 DSL 来生成字节码也并非易事。以下是Charles 的博客中的一个例子:一个名为 bar 的方法将小写的 String 参数加到传进来的 ArrayList 中,下面就是产生的代码:

def test_class_builder

 cb = Compiler::ClassBuilder.build("MyClass", "MyClass.java") do

 [...]

method(:bar, ArrayList, String, ArrayList) do

  aload 1

invokevirtual(String, :toLowerCase, String)

aload 2

swap

  invokevirtual(ArrayList, :add, [Boolean::TYPE, Object])

aload 2

areturn

end

[...]  

Charles Nutter 还提供了一个新方案,这就是叫做Duby的新语言,它实现了 Ruby 语法的一个子集,增强了一些类型推断逻辑(请访问Charles 的博客来了解更多信息),以此来生成快速的字节码。下面同样是计算阶乘的方法,这次是针对 Duby 编译器而写的。

class Fac

 def self.fac(max)

 {max => :int, :return => :int}

  i = max

  result = 1

 while i > 1

 result *= i

 i -= 1

end

  result

 end

end

这是一个原型,用来展现以一种类 Ruby 语言而不是一种新语言来实现类型推断的可能性。它还可被 JRuby 程序员所用,以避免因为性能问题而回退到 Java,或者用来实现 JRuby 本身的一些部分功能,这与 Squeak Smalltalk 的Slang很像,它是 Smalltalk 语言的一个子集,可以很轻易的转化为 C。Rubinius 计划使用叫做 Garnet(InfoQ已经就 Cuby/Garnet 采访了 Evan Phoenix)的类似方法。

现在,对于 JRuby 来说,你想使用何种代码生成方式呢?

查看英文原文:Using JRuby to generate Code for the JVM
译者简介:张龙,同济大学软件工程硕士,现就职于理光软件研究所。主要从事文档工作流和办公自动化解决方案的研发工作。热衷于 Java 轻量级框架的研究,对敏捷方法很感兴趣。曾有若干年的 J2EE 培训讲师经历。参与 InfoQ 中文站内容建设,请邮件至china-editorial[at]infoq.com
JavaRuby编程语言语言 & 开发架构