淘气堡厂家
免费服务热线

Free service

hotline

010-00000000
淘气堡厂家
热门搜索:
成功案例
当前位置:首页 > 成功案例

看一看:JRuby生成JVM代码详解

发布时间:2022-04-02 10:15:18 阅读: 来源:淘气堡厂家
JRuby生成JVM代码详解 作者:佚名 2009-07-17 17:11:47 开发 开发工具 本文向您介绍如何使用JRuby生成JVM代码,作者列举了CRuby、JRuby和Duby生成字节码的不同示例来证明使用JRuby生成JVM代码的好处。

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

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

  1. classMyTest
  2. inlinedo|builder|
  3. builder.c"
  4.  longfactorial_c(intmax){
  5.  inti=max,result=1;
  6.  while(i>=2){result*=i--;}
  7.  returnresult;
  8.  }
  9. "
  10. end
  11. end

下面是Charles提供的JRuby生成JVM代码的实现 :

  1. classFastMath
  2. inline:Javado|builder|
  3.  builder.package"org.jruby.test"
  4.  builder.java"
  5.  publicstaticlongfactorial_java(intmax){
  6.  inti=max,result=1;
  7.  while(i>=2){result*=i--;}
  8. returnresult; 
  9.  }
  10.  "
  11. end
  12. end

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

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

  1. deftest_class_builder
  2. cb=Compiler::ClassBuilder.build("MyClass","MyClass房子拆迁按套内面积算吗.java")do
  3. [...]
  4. method(:bar,ArrayList,String,ArrayList)do
  5.  aload1 
  6.  invokevirtual(String,:toLowerCase,String) 
  7.  aload2 
  8.  swap
  9.  invokevirtual(ArrayList,:add,[Boolean::TYPE,Object]) 
  10.  aload2
  11.  areturn
  12. end
  13. [...]

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

  1. classFac
  2. defself.fac(max)
  3. {max=>:int,:return=>:int}
  4.  i=max
  5.  result=1
  6. whilei>1
  7.  result*=i
  8.  i-=1
  9.  end
  10.  result
  11. end
  12. end

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

现在,你应该知道使用JRuby生成JVM代码的好处了。

【编辑推荐】

  1. 在JRuby下将RoR项目配置到tomcat详解
  2. 如何在tomcat上配置jruby on rails
  3. JRuby是什么? JRuby语言概览
  4. JRuby中调用java带可变参数的方法
  5. 使用JRuby生成JVM代码