自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

JRuby生成JVM代碼詳解

開發(fā) 開發(fā)工具
本文向您介紹如何使用JRuby生成JVM代碼,作者列舉了CRuby、JRuby和Duby生成字節(jié)碼的不同示例來證明使用JRuby生成JVM代碼的好處。

盡管JRuby的性能已經(jīng)接近CRuby了,但有時它仍然不夠快。CRuby的用戶可以使用Ryan Davis的RubyInline庫,它提供了對C/C++的內(nèi)建支持以便更容易的產(chǎn)生Ruby的C擴展。來自JRuby陣營的Charles Nutter現(xiàn)在已經(jīng)為JRuby實現(xiàn)了一個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代碼的實現(xiàn) :

  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(對于編譯器),它可能還無法在所有系統(tǒng)上都可使用。

另一個可產(chǎn)生快速執(zhí)行代碼的方法就是直接使用JRuby生成JVM代碼。對于正常的應用來說,這聽起來有些過激了,像編譯器這樣的字節(jié)碼生成工具會從一個簡單的字節(jié)碼生成DSL中獲益,就像早前Charles Nutter的博客中提到的那樣。然而即便通過DSL來生成字節(jié)碼也并非易事。以下是Charles的博客中的一個例子:一個名為bar的方法將小寫的String參數(shù)加到傳進來的ArrayList中,下面就是產(chǎn)生的代碼:

  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的新語言,它實現(xiàn)了Ruby語法的一個子集,增強了一些類型推斷邏輯(請訪問Charles的博客來了解更多信息),以此來生成快速的字節(jié)碼。下面同樣是計算階乘的方法,這次是針對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 

這是一個原型,用來展現(xiàn)以一種類Ruby語言而不是一種新語言來實現(xiàn)類型推斷的可能性。它還可被JRuby程序員所用,以避免因為性能問題而回退到Java,或者用來實現(xiàn)JRuby本身的一些部分功能,這與Squeak Smalltalk的Slang很像,它是Smalltalk語言的一個子集,可以很輕易的轉化為C。Rubinius計劃使用叫做Garnet(InfoQ已經(jīng)就Cuby/Garnet采訪了Evan Phoenix)的類似方法。

現(xiàn)在,你應該知道使用JRuby生成JVM代碼的好處了。

 

【編輯推薦】

  1. 在JRuby下將RoR項目配置到tomcat詳解
  2. 如何在tomcat上配置jruby on rails
  3. JRuby是什么? JRuby語言概覽
  4. JRuby中調(diào)用java帶可變參數(shù)的方法
  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調(diào)用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-26 11:00:48

JVM參數(shù)配置

2023-10-11 18:35:20

Java編程語言

2010-09-27 13:48:41

JVM內(nèi)存結構

2010-09-25 12:38:40

JVM內(nèi)存模型

2011-03-17 09:27:00

JRuby

2009-12-17 18:16:44

JRuby語言技術

2023-08-02 08:38:27

JVM加載機制

2018-11-01 10:34:37

JVM內(nèi)存配置

2009-07-20 15:37:26

JRuby安裝JRuby配置

2024-01-12 09:48:01

自動駕駛技術

2009-07-09 14:01:22

JVM工作原理

2010-09-17 15:57:23

TomcatJVM
點贊
收藏

51CTO技術棧公眾號