JRubyとJRuby on Railsのメリット

Ruby on Railsはその開発効率のよさと、Rubyという言語のプログラマに対する親和性のよさによって、大ブレイクした感があります。では、そこにJavaの「J」がつくことで、どんなメリットがあるのでしょうか。
Ola BiniのJRoR本で、1ページに簡潔にまとめてありましたので(CHAPTER1 P.5)、それを自分なりにかみくだいてみます。

パフォーマンスの問題を解決

Ruby on Rails(以下RoR)は、もちろんネイティブなRubyインタプリタを使っています。Ruby陣営は「十分実用的な速さ」と言っていますが、ベンチマークを取ると、他の言語にだいたい遅れを取ってしまうようです。もちろん、Ruby 1.9ではかなりの改善がされましたが、それでもパフォーマンス・クリティカルな部分は代替手段が必要になってしまうようです。Ola Biniさんは本の中で、「代替手段としてCで書き直すのは、やりたくないね」と書いています。

Javaであれば、JVMのパフォーマンスは年々上がってきており、Javaでネイティブライブラリを書く、ということがCで書くことの代替案となりえます。そちらのほうが、やっぱりいいよね、ということです。

ちなみに、JRuby 1.0では、Ruby 1.8.6よりも1.5〜2倍ほどパフォーマンスがよかった、とのことです。

文字コードの問題を解決

Rubyでは文字コードの問題を解決するのにKCodeなどのライブラリによってサポートしています。ネイティブにUTF-8を扱うのは、あまり得意ではないようです。よって、RoRではMultibyteというライブラリを呼び出して使っています。

でも、JavaをベースとしているJRubyの場合は、JavaUTF-8ベースであるので、そのような考慮は必要ない、ということです。

スレッドの問題を解決

Webアプリケーションに対して、一番大きいのはRubyが基本シングルスレッドである、ということでしょう。RubyはGreen Threadの言語として書かれており、それを実現するためにプロセスで1つのOSスレッドを使う、という特性があります。しかし、Webアプリケーションとして考えると、多数のリクエストを処理するために、多数のスレッドを使う必要があります。RoRでは、この問題に複数のRubyプロセスを立ち上げる(具体的にはMongrelなどのサーバを複数プロセス立ち上げる)という必要があります。プロセスを増やすやり方だと、OSのリソースをスレッドの場合よりも多く必要としますし、プロセス管理を自前で行う必要があるため、保守性という面でも問題が生じます。

しかし、JRoRではJavaのネイティブスレッドを使うことができるので、この問題を解決することができます。

ライブラリの問題を解決

RubyJavaは、おおよそ同じくらいの歴史(どちらも1993年ごろ生まれ)を持っています。しかし、この10年間でJavaはかなりの量、アプリケーション(特にエンタープライズ向け)に使われ、Sunをはじめとする各種組織にもサポートを受けてきたため、いろいろな分野でのライブラリが非常に充実しています。
しかし、Rubyは最近でこそRoRのお陰で使用頻度が高まっていますが、まだまだライブラリの充実という面では、Javaに大きく遅れを取っています。

この、既存資産であるJavaライブラリを自由に利用できるというアドバンテージは、特にエンタープライズ向けシステムで大きなメリットとなります。


このように、JRubyは特に、Webアプリ(さらにエンタープライズ向け)には特別なメリットを持っています。ただし、まだ日があたって間もないため、利用例などが少ない、というデメリットの方が勝っています。
また、利用方法のドキュメント等が少ないため、利用しにくい、という問題があります。

このブログで、よりJRubyを普及させるための一助となりたいと思います。