操纵JRuby生成JVM代码[Java编程]
本文“操纵JRuby生成JVM代码[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
固然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来说,你想利用何种代码生成方法呢?
以上是“操纵JRuby生成JVM代码[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |