`
xzy_love
  • 浏览: 32655 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

使用JRuby生成JVM代码

 
阅读更多

尽管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的类似方法。现在,对于JRuby来说,你想使用何种代码生成方式呢?

分享到:
评论

相关推荐

    Ruby-JRuby一个Ruby语言的Java实现

    为了开始使用JRuby,你需要下载并安装JRuby,配置环境变量,然后可以像使用普通Ruby那样运行Ruby代码。开发过程中,你可以使用像`jirb`(JRuby交互式 shell)这样的工具,或者通过`bundle`管理Gem(Ruby的包管理系统...

    jruby-src-1.1b1.zip

    源代码包如"jruby-src-1.1b1.zip"则需要通过编译步骤来生成可执行的JRuby环境。 5. ** JRuby的开发与调试**:开发JRuby程序可以使用任何文本编辑器或IDE,如IntelliJ IDEA或Eclipse的JRuby插件。调试可以通过Ruby的...

    jvm分享ppt

    JSR 292允许JVM支持更广泛的动态语言特性,比如Java 7引入的 invokedynamic 指令,提升了动态语言如Groovy和JRuby在JVM上的运行效率。 8. **微基准测试与性能评估** 在优化程序时,要注意微基准测试的结果可能并...

    jruby_on_rails

    2. **无缝集成 Java 类库**:使用 JRuby on Rails,你可以直接调用 Java 代码,这意味着你可以利用 Java 生态系统中的丰富类库,如数据库驱动程序、企业服务和安全框架。 3. **部署灵活性**:JRuby on Rails 应用...

    JVM简介以及历史.docx

    字节码是由Java编译器将源代码编译生成的,它包含了Java虚拟机指令集和其他辅助信息,如符号表。 JVM的结构主要包括以下几个关键组件: 1. 字节码指令集:这是JVM执行的基本单元,由一系列特定的二进制指令组成,...

    client_java,用于jvm应用程序的prometheus工具库.zip

    这个库不仅适用于纯Java应用,还兼容Clojure、Scala和JRuby等在JVM上运行的语言。 首先,让我们深入了解Prometheus的工作原理。Prometheus通过HTTP拉取目标服务暴露的metrics,这些metrics是自定义的键值对,通常以...

    基于Java平台的多语言混合编程.pdf

    1. 跨平台性:Java虚拟机(JVM)屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在JVM上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。 2. 跨语言性:JVM可以支持多种语言的开发,包括...

    ruby-2.6.9.tar.gz

    同时,对于JRuby来说,可能有对JVM优化的更新,使得Ruby代码在Java平台上运行得更快,以及与Java库更好的互操作性。 总的来说,Ruby-2.6.9.tar.gz是一个为开发者准备的软件包,包含了在不同平台上编译和使用Ruby ...

    vertx-lang-jruby:Vertx jruby API 填充模板

    2. **构建项目**:在项目根目录下运行`mvn package`命令,这将编译源代码并生成一个包含JRuby Verticle的JAR文件。 3. **运行测试**:接着,运行`rake test`,这将执行任何定义的测试用例,验证HTTP服务器的正确性。...

    ruby2java:查尔斯·纳特(Charles Nutter)的JRuby项目的分支,该项目从Ruby源代码构建Java .class文件-java project source code

    JRuby是Ruby的一个实现,它允许Ruby代码在JVM上运行,利用JVM的优化和多线程能力,提升了运行效率。 Ruby2Java项目则更进一步,它尝试直接将Ruby源代码转换为Java字节码,从而避免了JRuby中的解释阶段,理论上可以...

    jvm

    "jvm-main"可能是类似的文件,但鉴于其名称,可能包含了一些与Java平台交互的特定逻辑,比如使用Java库或服务,或者实现了某种桥接技术,使得Ruby代码能够调用Java代码。 总结来说,这个项目可能是一个使用Ruby on ...

    JAVA上百实例源码以及开源项目源代码

    EJB中JNDI的使用源码例子 1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件...

    Java虚拟机规范(中文 翻译版 Java_SE_7).rar

    1. **字节码执行**:Java源代码经过编译器编译后生成.class文件,里面包含的是 JVM 可以理解的字节码。JVM的解释器将字节码转换为机器码并执行,使得Java具有跨平台性。 2. **类加载机制**:JVM按照“加载、验证、...

    java-jdk1.7.0_80

    7. **动态类型语言支持**:允许在Java中使用一些动态语言的特性,如Groovy或JRuby。 **配置与使用** 在使用Java JDK 1.7.0_80之前,需要设置环境变量`JAVA_HOME`指向安装目录,并将`bin`子目录添加到系统PATH中,...

    jdk1.7.0_80

    3. **动态类型语言支持**:通过JSR 292,JDK 7允许开发者创建和使用自定义的字节码,为动态语言如Groovy、JRuby等提供了更好的支持。 4. **改进的字符串操作**:例如,`switch`语句支持字符串,`split()`方法的性能...

    Java7编程实战手册代码中文

    5. **动态类型语言支持**:Java 7通过`invokedynamic`指令增强了对动态类型语言的支持,使得JVM能更好地运行脚本语言和字节码生成库,例如Groovy和JRuby。 6. **钻石运算符**:在创建匿名内部类或泛型实例时,Java ...

    jdk1.7.zip

    JDK 1.7的JVM引入了 invokedynamic 指令,这是Java语言层面的重大改进,主要用于动态语言的支持,如Groovy、JRuby等。同时,JVM在垃圾回收、内存管理和性能方面也有显著提升。 3. **Java类库**:JDK包含了大量的...

    java jdk

    此外,Java文档生成器(javadoc)也是JDK的一部分,它可以自动生成Java源代码的API文档,帮助开发者理解和使用API。 在JDK 1.7.0中,还引入了一些重要的更新和改进。比如,改进了垃圾收集器,提升了性能;引入了...

Global site tag (gtag.js) - Google Analytics