J
Rubyは、
Rubyプログラミング言語の
インタプリタを
Javaで
実装したものです。このプロジェクトは自由ソフトウェアとして公開されており、CPL(Common Public License)、GPL(
GNU General Public License)、LGPL(
GNU Lesser General Public License)の3つの
ライセンスに基づいて利用できます。
J
Rubyの最大の特徴は、
Javaとの深い連携です。これにより、J
Rubyインタプリタを
Javaアプリケーションに組み込むことができ、
Javaと
Rubyのコードが相互にアクセスできるようになります。この柔軟性が、J
Rubyを多くの開発者に選ばれる理由の一つです。
開発の歴史
J
Rubyは2001年にJan Arne Petersenによって開発が開始されました。当初は
Ruby 1.6の
C言語による
実装を
Javaに直接移植したものでした。その後、
Ruby 1.8.6のリリースを機に、J
Rubyを1.8.6に対応させる作業が開始され、プロジェクトには多くのコントリビューターが参加し、現在の4人を中核とするチームが形成されました。
主要な開発者として、Charles Nutter、Thomas Enebo、Ola Bini、Nick Siegerが挙げられます。2006年には
サン・マイクロシステムズがEneboとNutterを雇用し、J
Rubyの開発を支援しました。さらに2007年には、ThoughtWorksがOla Biniを雇用し、
RubyとJ
Rubyに関連する仕事に携わらせています。
2009年7月、J
Rubyの開発チームはサンを離れ、Engine Yardに拠点を移し、開発を継続しました。
開発環境
NetBeans Ruby Packは、
NetBeans 6.0以降から
RubyおよびJ
Rubyの
統合開発環境として利用できます。このパックは、
Ruby on Railsの開発環境としても機能し、2つの
Ruby実装に対応しています。
J
Ruby 1.1では、
実行時コンパイラと
事前コンパイラが追加され、
Ruby 1.8.6の
リファレンス実装よりも高速に動作するようになりました。J
Ruby 1.1.1はFedora 9にパッケージとして含まれるようになり、その後もJ
Rubyチームはポイントリリースを頻繁に行い、ユーザーからのフィードバックに迅速に対応しています。2015年7月には、
Ruby 2.2系と互換性のある「J
Ruby 9.0.0.0」がリリースされました。
Railsとの連携
J
Rubyはバージョン0.9(2006年5月)以降、
Ruby on Railsをサポートしています。同時に
RubyGemsとWEBrickの実行も可能です。サンが開発者を雇用して以来、Railsの対応と性能は大幅に強化され、J
Ruby 1.0ではRailsのテストケースのほとんどに合格しました。これにより、多くの開発者がJ
RubyをRailsアプリケーションの開発環境として利用するようになりました。
マルチVM共同開発
2008年2月27日には、
サン・マイクロシステムズと
東京大学が、複数の
RubyまたはJ
Rubyアプリケーションを単一の
インタプリタ上で実行できる仮想マシンの
実装に関する共同研究プロジェクトを発表しました。
Java仮想マシン上の動的呼び出し
JSR 292では、
Java仮想マシンレベルでの`invokedynamic`命令の追加が提案されました。これにより、動的型検査に基づくメソッド呼び出しや、実行時にクラスやメソッドを動的に変化させることが可能になります。サンのオープンソースプロジェクトであるDa Vinci MachineでこのJSRのプロトタイプ
実装が行われ、J
Rubyチームは動的呼び出しをコードベースに組み込みました。この機能はJ
Ruby 1.1.5でリリースされました。
設計
2006年初めから、J
Rubyチームは
C言語コードの単純な移植から、
Javaバイトコードを活用した高性能な
実装へと移行しました。J
Rubyを使って
Ruby on Railsをそのまま実行できるようにすることを目標とし、テストスイートを拡張してJ
Rubyの正確性を保証しました。この結果、2006年末から2007年初めにかけてJ
Rubyの中核部分の再設計とリファクタリングが可能になりました。
J
Rubyは、
インタプリタ、JITコンパイラ、AOTコンパイラの3つのモードをサポートしています。コードは直接
インタプリタで解釈実行されるだけでなく、実行時にJITコンパイラで
Javaバイトコードにコンパイルされたり、実行前にAOTコンパイラで
Javaバイトコードにコンパイルされたりします。これらのモードは混在可能であり、生成したバイトコードから
Javaクラスファイルを生成することもできます。
J
Rubyは、基本的には
Rubyインタプリタですが、
Javaで
実装されている点が異なります。J
Rubyと
Rubyは基本的に同じですが、J
Rubyでは
Javaとの緊密な連携が可能です。
J
Rubyの強力な機能の一つに、
Javaプラットフォームのクラスを呼び出す機能があります。これには、まず`include
Java`(以前のバージョンでは`require 'java'`)としてJ
Rubyの
Javaサポートをロードします。以下の例では、
JavaのJFrameにJLabelを追加する様子を示しています。
ruby
include
Java
jframe = javax.swing.JFrame.new("J
Ruby Frame")
jlabel = javax.swing.JLabel.new("Hello from J
Ruby!")
jframe.add(jlabel)
jframe.setSize(300, 200)
jframe.setVisible(true)
また、
Javaコードをより
Ruby的なアンダースコアを使った命名規則で呼び出し、
JavaBeanのプロパティを属性として参照できます。
J
Rubyは
Javaから簡単に呼び出すことができ、JSR 223 Scripting for
Java 6やBean Scripting Frameworkを利用します。詳細については、J
Ruby Wikiを参照してください。
性能
J
Rubyは、
インタプリタモード、AOTモード、JITモードをサポートしています(後2つはバージョン1.1から)。
インタプリタモードでは、J
Rubyは標準の
Rubyリファレンス実装よりも遅いです。例えば、Rails処理を
インタプリタモードで行うと、
Ruby 1.8の
リファレンス実装に比べて50%から70%遅くなります。
Ruby 1.9(YARV)のベンチマークを
Java 6で試すと、J
Rubyは
Rubyの4倍の遅さです(起動時間を含む)。
JITモード
JITモードはJ
Ruby 1.1から利用可能です。ベンチマークの結果では、
Ruby 1.8の
リファレンス実装よりも高速ですが、
Ruby 1.9よりは低速です。しかし、J
Rubyチームは、1.1の性能が一部ベンチマークで
Ruby 1.9を凌駕しつつあると指摘しています。
AOTモード
AOTモードでは、
サーバVMのままさらに
インタプリタからコンパイルモードに切り替えることで、
Ruby 1.9.1とほぼ同等の実行速度を実現できます。さらに最適化を実施することで実行速度は向上し、How J
Ruby Makes
Ruby Fastで紹介されている事例では、最終的に
Ruby 1.8.6よりも50倍、
Ruby 1.9.1よりも10倍高速な実行速度が計測されています。
まとめ
J
Rubyは、
Javaの強力な機能と
Rubyの柔軟性を組み合わせた、非常に強力なツールです。
Javaプラットフォーム上で
Rubyアプリケーションを実行する必要がある場合、J
Rubyは最適な選択肢の一つとなるでしょう。