使用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(InfoQ已经就Cuby/Garnet采访了Evan Phoenix)的类似方法。

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

时间: 2024-09-30 02:35:03

使用JRuby生成JVM代码的相关文章

jax_ws 客户端远程调用方法时必须使用wsimport命令生成接口代码

问题描述 jax_ws 客户端远程调用方法时必须使用wsimport命令生成接口代码 jax_ws 客户端远程调用方法时,不生成服务端的代码如何实现?

自动生成代码-自动生成spring代码工具

问题描述 自动生成spring代码工具 有没有自动生成SPRING的代码工具? 能够自动生成pojo,dao,control,service, 我看到网上有个spring roo工具,但是感觉不好用. 解决方案 是自动生成Dao,Action,Service,Controller之类的吧? 解决方案二: 这种工具不知道有没有开源的,不过很多公司可能都有自己的一套. 我们公司也有,不过只有给你讲一下大概的思路. 该工具一般由以下几部分组成:读取数据库的数据表结构的功能,模板引擎(如:freemar

使用xsl来动态生成java代码

动态 xsl本身就是一个构型良好的xml,它能够把一个xml文档转换成另外一个xml文档,或者转换成文本文件.html文件等等.这里就是利用xsl来动态的生成我们想要的java文件(从某种角度看,java代码其实也就是一个文本文件),希望能够通过这篇文章,看到xml以及相关的技术所具有的强大能力! 这里首先给一个xml例子,我们将通过一个xsl从该xml文件中抽取有用的信息来生成java代码(实际上是一个javabean): 以下内容为程序代码<?xml version="1.0"

用JSP在客户端生成JavaScript代码来实现表单校验

javascript|js|客户端 今天费了一天时间就是做这个东西,原理很简单,就是用 JSP 在页面的开始部分生成一段代码,如 errorcheck.jsp 中所示,但程序太长,还是费了我不少时间来改写. 主程序是名为 ErrorCheck.java ,有了这个 ErrorCheck 的 Bean,我们就再也不用为了表单校验去写那一大堆烦人的 JavaScript 代码了.ErrorCheck 类已帮我们生成了几乎所有你将会用到的校验方法,如是否为数字,长度的校验,是否为合法email等,你只

用 JSP 在客户端生成 &amp;#106avascript 代码来实现表单校验

js|客户端 用 JSP 在客户端生成 JavaScript 代码来实现表单校验 ●○●○●○●○●○●○●○●○●○●○●○●○●○●○○ 作者:刘湛 日期:2000-01-05 jeru@163.net ●● http://www.cyberlabs.com/~jeru/ ○○ 欢迎访问爪哇人,获取更多资料 ●●○●○●○●○●○●○●○●○●○●○●○●○●○●○ 今天费了一天时间就是做这个东西,原理很简单,就是用 JSP 在页面的开始部分生成一段代码,如 errorcheck.jsp 中

用JSP在客户端生成&amp;#106avascript代码来实现表单校验

js|客户端 今天费了一天时间就是做这个东西,原理很简单,就是用 JSP 在页面的开始部分生成一段代码,如 errorcheck.jsp 中所示,但程序太长,还是费了我不少时间来改写. 主程序是名为 ErrorCheck.java ,有了这个 ErrorCheck 的 Bean,我们就再也不用为了表单校验去写那一大堆烦人的 JavaScript 代码了.ErrorCheck 类已帮我们生成了几乎所有你将会用到的校验方法,如是否为数字,长度的校验,是否为合法email等,你只需在 jsp 页面里调

简化Ajax和Java开发,第1部分:用JSP标记文件动态生成JavaScript代码

很多Web开发人员都经常抱怨说 Java EE 太复杂.构建新的 Web 组件太难.定制现有的组件没有预想的那样简单,并且即便是很小的更改都需要重新启动应用程序.本系列给出了针对这些问题的解决方案,即采用代码生成器.约定.脚本语言和先进的 JavaServer Pages (JSP) 特性.在本文中,您将了解如何基于 JSP 标记文件构建可重用的 Ajax 和 Java 组件,而这些 JSP 标记文件很容易开发和部署.更改之后,JSP 标记文件会由 Java EE 服务器自动重编译,而无须重启应

使用EMF进行建模,第3部分:使用Eclipse的JMerge定制生成的代码和编辑器

概述 本系列文章的 前一篇介绍了有关 Eclipse 的 Java Emitter Templates (JET)和代码生成的知识,在那篇文章中,您已经看到如何通过使用模板和代码生成器 来节省时间,并实现模式级的代码重用.然而在大部分情况中,这都还不够.您需要能够 将所生成的代码插入现有的代码中,或者允许以后的开发人员来定制所生成的代码,而不 需要在重新生成代码时重新编写任何内容.理想情况下,代码生成器的创建者希望可以支 持今后开发人员所有的需求:从修改方法的实现.修改各种方法签名,到修改所生成

hibernate tools自动生成entity代码

1.eclipse下载安装jboss tools插件 2.新建hibernate.cfg.xml 3.选择文件生成路径一般在 Project的配置文件存放地点resource.因为用maven创建所以放在src\main\resource下面 4.hibernate.cfg.xml 配置信息 sessonFactory 名字:oracle最好统一成 sessonFactory 控制台配置文件生成选项checkbox 打钩.oracle可以填写schema :数据库表空间来过滤表,sqlserve