JRuby生成JVM代码详解

开发 开发工具
本文向您介绍如何使用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. class MyTest  
  2. inline do |builder|  
  3. builder.c "  
  4.  long factorial_c(int max) {  
  5.  int i=max, result=1;  
  6.   while (i >= 2) { result *= i--; }    
  7.   return result;    
  8.  }  
  9. "  
  10. end  
  11. end  

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

  1. class FastMath  
  2. inline :Java do |builder|  
  3.  builder.package "org.jruby.test" 
  4.   builder.java "  
  5.  public static long factorial_java(int max) {  
  6.   int i=max, result=1;  
  7.   while (i >= 2) { result *= i--; }  
  8.   return result;     
  9.   }  
  10.  "  
  11. end 
  12. end 

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

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

  1. def test_class_builder  
  2. cb = Compiler::ClassBuilder.build("MyClass""MyClass.java"do 
  3. [...]    
  4. method(:bar, ArrayList, String, ArrayList) do 
  5.  aload 1   
  6.  invokevirtual(String:toLowerCaseString)   
  7.  aload 2     
  8.  swap  
  9.  invokevirtual(ArrayList, :add, [Boolean::TYPE, Object])   
  10.  aload 2    
  11.  areturn  
  12. end 
  13. [...] 

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

  1. class Fac  
  2. def self.fac(max)  
  3. {max => :int:return => :int}  
  4.  i = max  
  5.  result = 1  
  6. while i > 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代码
责任编辑:佚名 来源: ddvip.com
相关推荐

2009-07-17 17:34:15

JRuby On Ra

2009-07-17 17:05:29

JRuby是什么JRuby

2009-04-03 10:25:32

C#XML扩展代码

2009-07-17 17:00:13

在JRuby下将RoR

2009-07-20 09:22:36

用jruby调用jfr

2012-04-16 14:55:54

JVMJRuby

2009-07-20 16:11:41

JRuby Swing

2009-07-17 17:02:54

JRuby是什么

2010-09-25 12:38:40

JVM内存模型

2010-09-27 13:48:41

JVM内存结构

2010-09-26 11:00:48

JVM参数配置

2023-10-11 18:35:20

Java编程语言

2009-07-20 15:37:26

JRuby安装JRuby配置

2009-12-17 18:16:44

JRuby语言技术

2024-01-12 09:48:01

自动驾驶技术

2011-03-17 09:27:00

JRuby

2018-11-01 10:34:37

JVM内存配置

2023-08-02 08:38:27

JVM加载机制

2009-07-17 16:17:04

在tomcat上配置j

2009-07-17 16:43:02

JRuby性能优化
点赞
收藏

51CTO技术栈公众号