JRuby

JRubyとは



JRubyは、Rubyプログラミング言語のインタプリタJava実装したものです。このプロジェクトは自由ソフトウェアとして公開されており、CPL(Common Public License)、GPL(GNU General Public License)、LGPL(GNU Lesser General Public License)の3つのライセンスに基づいて利用できます。

JRubyの最大の特徴は、Javaとの深い連携です。これにより、JRubyインタプリタJavaアプリケーションに組み込むことができ、JavaRubyのコードが相互にアクセスできるようになります。この柔軟性が、JRubyを多くの開発者に選ばれる理由の一つです。

開発の歴史



JRubyは2001年にJan Arne Petersenによって開発が開始されました。当初はRuby 1.6のC言語による実装Javaに直接移植したものでした。その後、Ruby 1.8.6のリリースを機に、JRubyを1.8.6に対応させる作業が開始され、プロジェクトには多くのコントリビューターが参加し、現在の4人を中核とするチームが形成されました。

主要な開発者として、Charles Nutter、Thomas Enebo、Ola Bini、Nick Siegerが挙げられます。2006年にはサン・マイクロシステムズがEneboとNutterを雇用し、JRubyの開発を支援しました。さらに2007年には、ThoughtWorksがOla Biniを雇用し、RubyとJRubyに関連する仕事に携わらせています。

2009年7月、JRubyの開発チームはサンを離れ、Engine Yardに拠点を移し、開発を継続しました。

開発環境



NetBeans Ruby Packは、NetBeans 6.0以降からRubyおよびJRuby統合開発環境として利用できます。このパックは、Ruby on Railsの開発環境としても機能し、2つのRuby実装に対応しています。

JRubyの進化



JRuby 1.1では、実行時コンパイラ事前コンパイラが追加され、Ruby 1.8.6のリファレンス実装よりも高速に動作するようになりました。JRuby 1.1.1はFedora 9にパッケージとして含まれるようになり、その後もJRubyチームはポイントリリースを頻繁に行い、ユーザーからのフィードバックに迅速に対応しています。2015年7月には、Ruby 2.2系と互換性のある「JRuby 9.0.0.0」がリリースされました。

Railsとの連携



JRubyはバージョン0.9(2006年5月)以降、Ruby on Railsをサポートしています。同時にRubyGemsとWEBrickの実行も可能です。サンが開発者を雇用して以来、Railsの対応と性能は大幅に強化され、JRuby 1.0ではRailsのテストケースのほとんどに合格しました。これにより、多くの開発者がJRubyをRailsアプリケーションの開発環境として利用するようになりました。

マルチVM共同開発



2008年2月27日には、サン・マイクロシステムズ東京大学が、複数のRubyまたはJRubyアプリケーションを単一のインタプリタ上で実行できる仮想マシンの実装に関する共同研究プロジェクトを発表しました。

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



JSR 292では、Java仮想マシンレベルでの`invokedynamic`命令の追加が提案されました。これにより、動的型検査に基づくメソッド呼び出しや、実行時にクラスやメソッドを動的に変化させることが可能になります。サンのオープンソースプロジェクトであるDa Vinci MachineでこのJSRのプロトタイプ実装が行われ、JRubyチームは動的呼び出しをコードベースに組み込みました。この機能はJRuby 1.1.5でリリースされました。

設計



2006年初めから、JRubyチームはC言語コードの単純な移植から、Javaバイトコードを活用した高性能な実装へと移行しました。JRubyを使ってRuby on Railsをそのまま実行できるようにすることを目標とし、テストスイートを拡張してJRubyの正確性を保証しました。この結果、2006年末から2007年初めにかけてJRubyの中核部分の再設計とリファクタリングが可能になりました。

JRubyは、インタプリタ、JITコンパイラ、AOTコンパイラの3つのモードをサポートしています。コードは直接インタプリタで解釈実行されるだけでなく、実行時にJITコンパイラでJavaバイトコードにコンパイルされたり、実行前にAOTコンパイラでJavaバイトコードにコンパイルされたりします。これらのモードは混在可能であり、生成したバイトコードからJavaクラスファイルを生成することもできます。

JRubyプログラミング



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

JRubyからJavaを呼び出す


JRubyの強力な機能の一つに、Javaプラットフォームのクラスを呼び出す機能があります。これには、まず`include Java`(以前のバージョンでは`require 'java'`)としてJRubyJavaサポートをロードします。以下の例では、JavaのJFrameにJLabelを追加する様子を示しています。

ruby
include Java

jframe = javax.swing.JFrame.new("JRuby Frame")
jlabel = javax.swing.JLabel.new("Hello from JRuby!")
jframe.add(jlabel)
jframe.setSize(300, 200)
jframe.setVisible(true)


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

JavaからJRubyを呼び出す


JRubyJavaから簡単に呼び出すことができ、JSR 223 Scripting for Java 6やBean Scripting Frameworkを利用します。詳細については、JRuby Wikiを参照してください。

性能



JRubyは、インタプリタモード、AOTモード、JITモードをサポートしています(後2つはバージョン1.1から)。

インタプリタモード


インタプリタモードでは、JRubyは標準のRubyリファレンス実装よりも遅いです。例えば、Rails処理をインタプリタモードで行うと、Ruby 1.8のリファレンス実装に比べて50%から70%遅くなります。Ruby 1.9(YARV)のベンチマークをJava 6で試すと、JRubyRubyの4倍の遅さです(起動時間を含む)。

JITモード


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

AOTモード


AOTモードでは、サーバVMのままさらにインタプリタからコンパイルモードに切り替えることで、Ruby 1.9.1とほぼ同等の実行速度を実現できます。さらに最適化を実施することで実行速度は向上し、How JRuby Makes Ruby Fastで紹介されている事例では、最終的にRuby 1.8.6よりも50倍、Ruby 1.9.1よりも10倍高速な実行速度が計測されています。

まとめ



JRubyは、Javaの強力な機能とRubyの柔軟性を組み合わせた、非常に強力なツールです。Javaプラットフォーム上でRubyアプリケーションを実行する必要がある場合、JRubyは最適な選択肢の一つとなるでしょう。

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。