JRuby

JRuby
開発元 Charles Nutter、Thomas Enebo、Ola Bini、Nick Sieger
最新版
9.4.1.0 / 2023年2月7日 (22か月前) (2023-02-07)[1]
リポジトリ ウィキデータを編集
対応OS 各種
プラットフォーム Java仮想マシン
種別 Rubyインタプリタ
ライセンス CPL/GPL/LGPL
公式サイト http://www.jruby.org/
テンプレートを表示

JRuby は、RubyインタプリタJavaによる実装である。フリーソフトウェアであり、CPL/GPL/LGPL の3つのライセンスを採用している。JRuby はJavaと密に連携しており、インタプリタを任意のJavaアプリケーションに埋め込むことができ、JavaとRubyのコード間で双方向のアクセスを可能にしている。

JRuby の主な開発者は Charles Nutter[1]、Thomas Enebo[2]、Ola Bini[3]、Nick Sieger[4] である。2006年9月、サン・マイクロシステムズは Enebo と Nutter を雇用し、仕事として JRuby の開発をさせている[2]。2007年6月、ThoughtWorks は Ola Bini を雇用し、Ruby と JRuby に関する仕事をさせている[3]。 2009年7月、JRubyの開発者らはサンを離れ、Engine YardでJRubyの開発を継続している[4]

歴史

JRuby は2001年、Jan Arne Petersen が開発した。その当時(およびそれから数年間)、そのコードは Ruby 1.6 のC言語コードの直接的な移植に過ぎなかった。Ruby 1.8.6 のリリースをきっかけとして、JRuby を 1.8.6 対応させる作業が開始された。2001年からプロジェクトには何人かのコントリビュータが参加し、最終的に現在の4人を中核とするチームになった。

NetBeans Ruby Pack は NetBeans 6.0 から利用可能になっており、Ruby および JRuby の統合開発環境として利用できると共に、2つのRuby実装での Ruby on Rails の開発環境としても利用できる[5][6]

JRuby 1.1 は実行時コンパイラ事前コンパイラを追加し、Ruby 1.8.6 リファレンス実装よりも多くの場合高速に動作する[7][8]

JRuby 1.1.1 は Fedora 9 にパッケージとして含まれるようになった[9][10]

バージョン 1.1.1 以降、JRubyチームはポイントリリースを頻繁に行い、ユーザーに指摘された問題に素早く対処するようにしている[11]

2015年7月22日「JRuby 9.0.0.0」をリリースした。約3年ぶりのメジャーリリースとなり、Ruby 2.2系と互換性がある[12]

Rails

JRuby はバージョン 0.9(2006年5月)以降 Ruby on Rails をサポートしており[13][14]、同時に RubyGemsWEBrick の実行も可能である。サンが2人の開発者を雇って以来、Rails 対応と性能は大幅に強化されてきた。JRuby バージョン 1.0 は Rails のテストケースのほとんどにパスした[15]。その後、JRuby を Rails アプリケーション開発環境に使う開発者がでてきた[16]

マルチ Virtual Machine 共同開発

2008年2月27日サン・マイクロシステムズ東京大学は、RubyまたはJRubyアプリケーションを複数同時に1つのインタプリタ上で実行できる仮想機械の実装を行う共同研究プロジェクトを発表した[17]

Java仮想マシン上の動的呼び出し

JSR 292 (Supporting Dynamically Typed Languages on the JavaTM Platform) [18]は以下を提案している。

  • 新たに JVM レベルで invokedynamic 命令を追加し、動的型検査に基づくメソッド呼び出しを可能にする。
  • 実行時に動的にクラスやメソッドを変化させられるようにする。

サンのオープンソースプロジェクト Da Vinci Machine で、このJSRのプロトタイプ実装を行っている[19]。最初のプロトタイプは OpenJDK のパッチとして開発され、2008年8月末に完成が発表された[20][21]

JRubyチームは、非常に簡単な方法だが、コードベースに動的呼び出しを組み込んだ。動的呼び出しは次の 1.1.5 でリリースされ、動的呼び出しのないJVM上ではそれが機能しないようにしておくことになる[22]

設計

2006年初めごろから、JRubyチームはそれまでのC言語コードの単なる移植からJavaのバイトコードを生かした高性能の実装にする努力を開始した。そして、JRuby を使って Ruby on Rails に全く手を加えずにそのまま実行できるようにすることを目標とした。その過程でJRubyのテストスイートも拡張され、JRubyの「正しさ」を保証する役目を果たした。結果として2006年末から2007年初めにはJRubyの中核部分の再設計とリファクタリングにとりかかることが可能になった。

JRuby は複数モードの Ruby 用仮想機械として設計されている。コードは直接インタプリタで解釈実行されるだけでなく、JITコンパイラJavaバイトコードに実行時にコンパイルされたり、AOTコンパイラで実行前にJavaバイトコードにコンパイルされたりする。2007年10月まではインタプリタモードしかなかったが、バージョン1.1からAOT/JITコンパイラがサポートされるようになった[23]。これらのモードは混在可能であり、また生成したバイトコードからJavaクラスファイルを生成することもできる。

JRubyプログラミング

JRuby は基本的には Ruby インタプリタだが、Javaで実装されている点が異なる。JRuby と Ruby は基本的に同じだが、JRuby では Java との緊密な連携が可能である[24]

JRuby から Java を呼び出す

JRuby の強力な機能の一つとして、Javaプラットフォームのクラスを呼び出すことができる。これをするには、まず "include Java"(以前のバージョンでは "require 'java'")として JRuby の Java サポートをロードする。以下の例は、Javaの JFrameJLabel を付与したものを生成する。

include Java

frame = javax.swing.JFrame.new()
frame.getContentPane().add(javax.swing.JLabel.new('Hello, World!'))
frame.setDefaultCloseOperation(javax.swing.JFrame::EXIT_ON_CLOSE)
frame.pack()
frame.set_visible(true)

また、JavaコードをよりRuby的なアンダースコアを使った命名規則で呼び出し、JavaBeanのプロパティを属性として参照できる。

frame.content_pane.add label
frame.visible = true

Java から JRuby を呼び出す

JRuby は容易に Java から呼び出すことができ、それには JSR 223[25] Scripting for Java 6 か Bean Scripting Framework を使う。詳しくは JRuby Wiki を参照されたい。

性能

JRuby は上述したように、インタプリタモード、AOTモード、JITモードをサポートしている(後2者はバージョン1.1から[23])。

インタプリタモード

このモードでは、JRuby は標準の Ruby リファレンス実装よりも遅い[26]

例えば、Rails 処理をインタプリタモードで行うと Ruby 1.8 のリファレンス実装に比べて 50% から 70% 遅い。

Ruby 1.9 (YARV)ベンチマークを Java 6 で使ってみると、JRuby は Ruby の4倍の遅さである(立ち上げ時間を含む)[27]

JITモード

JITモードは JRuby 1.1 から利用可能である。ベンチマークの結果から見れば、Ruby 1.8 リファレンス実装よりも高速である[28][7] [29]。ただし Ruby 1.9 よりは低速である[8]。しかし、JRubyチームは 1.1 の性能が Ruby 1.9 をも一部ベンチマークで凌駕しつつあると指摘している[30]

また、実際のアプリケーションであるMongrelというWebサーバでは、Ruby よりも JRuby の方が性能がよい(JVM立ち上げ完了後)[31]

AOTモード

サーバVMのままさらにインタプリタからコンパイルモードに変えると、ほとんどRuby 1.9.1と変わらない実行速度を実現しており、さらに各種最適化を実施することで実行速度は向上し、How JRuby Makes Ruby Fastで紹介している限りでは最終的にRuby 1.8.6よりも50倍、Ruby 1.9.1よりも10倍高速な実行速度が計測されている[32]

脚注

  1. ^ JRuby 9.4.1.0 Released”. 2023年2月10日閲覧。
  2. ^ Jacki (2006年9月7日). “Sun Welcomes JRuby Developers”. On the Record. 2006年9月9日閲覧。
  3. ^ Ola Bini. “ThoughtWorks”. On the Record. 2008年9月16日閲覧。
  4. ^ JRuby guys jumped from fear of the unknown” (2009年8月3日). 2009年12月15日閲覧。
  5. ^ Ruby & JRuby Support Available in NetBeans IDE
  6. ^ Ruby brightens the NetBeans platform
  7. ^ a b JRuby performance benchmark”. shootout.alioth.debian.org (2007年11月5日). 2007年11月5日閲覧。
  8. ^ a b Cangiano, Antonio (2007年3月12日). “The Great Ruby Shootout”. 2008年2月1日閲覧。
  9. ^ Nutter, Charles (2008年4月25日). “JRuby 1.1.1 in RedHat Fedora”. 2008年4月26日閲覧。
  10. ^ jruby”. fedoraproject.org. 2008年4月26日閲覧。
  11. ^ JRuby 1.1.3 Released”. jruby.codehaus.org (2008年7月19日). 2008年7月19日閲覧。 “Our goal is to put out point releases more frequently for the next several months (about 3-4 weeks a release). We want a more rapid release cycle to better address issues brought up by users of JRuby.
  12. ^ Ruby 2.2互換の「JRuby 9.0.0.0」リリース”. OSDN Magazine (2015年7月23日). 2015年7月24日閲覧。
  13. ^ Rails Support”. JRuby Team. 2008年2月17日閲覧。
  14. ^ Nutter, Charles (2008年8月24日). “Zero to Production in 15 Minutes”. 2008年8月27日閲覧。
  15. ^ 2807のRails固有テストケースのうち 98.6% にパスした。詳しくは JRuby 0.9.8 Released 参照
  16. ^ Success Stories”. JRuby Wiki (2008年1月29日). 2008年2月17日閲覧。
  17. ^ 東京大学とサン・マイクロシステムズ、産学連携モデルによる共同研究テーマを決定、研究活動を開始”. サン・マイクロシステムズ (2008年1月10日). 2008年9月16日閲覧。
  18. ^ see JSR 292
  19. ^ Sub-Projects and Investigations”. Sun Microsystems (2007年). 2008年2月6日閲覧。
  20. ^ Rose, John (2008年8月26日). “Happy International Invokedynamic Day!”. 2008年9月3日閲覧。
  21. ^ Lorimer, R.J. (2008年9月1日). “Dynamic Invocation Runs on OpenJDK”. infoq.com. 2008年9月3日閲覧。
  22. ^ Nutter, Charles (2008年9月11日). “A First Taste of InvokeDynamic”. 2008年9月13日閲覧。 “I managed to successfully wire InvokeDynamic directly into JRuby's dispatch process! Such excitement! The code is already in JRuby's trunk, and will ship with JRuby 1.1.5 (though it obviously will be disabled on JVMs without InvokeDynamic).
  23. ^ a b Nutter, Charles (2007年9月27日). “The Compiler Is Complete”. 2007年10月12日閲覧。
  24. ^ Script your Java applications and efficiently reuse your Java libraries with this dynamic language”. javaworld.com (2006年7月17日). 2008年4月26日閲覧。
  25. ^ JSR 223: Scripting for the Java Platform Specification Request
  26. ^ Nutter, Charles (2007年4月16日). “Paving the Road to JRuby 1.0: Performance”. 2007年11月5日閲覧。
  27. ^ 一部のテストケースを除くと、Ruby 1.8 に比べて 50% 程度の遅さである(一部とは全部で39のうち、thread_create_join, sieve, count_words, mandelbrot, and answer の5つ)
  28. ^ Nutter, Charles (2007年10月12日). “Performance Update”. 2007年10月12日閲覧。
  29. ^ Nutter, Charles (2007年10月12日). “Performance Update”. 2007年10月12日閲覧。
  30. ^ Nutter, Charles (2008年2月16日). “JRuby RC2 Released; What's Next?”. 2008年2月17日閲覧。 “JRuby's performance regularly exceeds Ruby 1.8.6, and in many cases has started to exceed Ruby 1.9.
  31. ^ Sieger, Nick (2007年10月25日). “JRuby on Rails: Fast Enough”. 2007年10月28日閲覧。
  32. ^ JRuby 50倍速、MacRubyはすでに到達域 - 竹内関数

関連項目

外部リンク

マルチメディア