JRuby 1.6 シリーズの初回リリース から,すでに1年以上が経過している。そして今回,JRuby 1.7.0 の最初のプレビュー版がリリースされた。
JRuby 1.6 は Ruby 1.9.2 と互換性を持った最初のバージョンだった。JRuby 1.7 ではさらに,Ruby 1.9 がデフォルトの実行モードとなっている。その他の主な変更点として リリースノート に記載されているのは次のものだ。
- 1.9.x 互換性に関する多数の修正
- Java7 の invokedynamic をサポート
- パフォーマンスと並行性の向上
- Java 5 サポートの廃止 (Java 6 以降が必須である)
- Rubygems 1.8.24 へのアップデート
- Rake 0.9.2.2 へのアップデート
invokedynamic のサポートは自動的に有効になるが,最大限に活用するためには最新の Java 7 上で実行する必要がある。InfoQ では,この invokedynamic サポートで JRuby プラットフォームが獲得したメリットについてより詳細に知るために,Charles Nutter 氏から話を聞く機会を持つことができた。
JRuby は invokedynamic を利用することによって,Ruby を Java の速度で実行するという目標に大きく近づきました。動的呼び出しの実行方法を JVM が正確に把握できるようになったため,通常の静的呼び出しと同等の最適化が可能になったのです。Java を高速にするためのトリックがいきなり,昔ながらの Ruby コードに適用できることになったのですから,まさに驚きです。
JRuby にも JVM にも,未開発の潜在的な可能性がまだたくさんあります。現在の JRuby は invokedynamic を 100% 最適に使い切れてはいませんし,あるケースでは,人為的に速度を遅くしているような不要なオーバーヘッドが存在しています。invokedynamic が安定的に利用可能になったので,今後はその使い方の改善に注力することができます。JVM (具体的には Hotspot) についても,まだ改善の余地がたくさん残っています。最初の Java 7 リリースでは ivokedynamic が十分に最適化されていませんでしたが,機能的には動作していました。しっかりした JVM JIT サポートとサーバコンパイラでの最適化が導入されたのはアップデート2です。さらにアップデート6では JIT ロジックが書き換えられるので,JVM の最適化のフルセットが invokedynamic コールに容易に適用できるようになるはずです。
invokedynamic を引き続き改善していくため,私たちは Hotspot 関係者と共同で作業を進めるつもりです。
InfoQ: JRuby が現時点で最速の Ruby 実装であることに間違いはないでしょうか?
最終的には,そのように言って問題ないと思います。私たちがうまく扱えていなかったり,将来的な JVM の改善を要するケースは常に存在するでしょう。しかし一般論として,JRuby はほとんどの場合において他の実装よりも高速であるはずです。JRuby と OpenJDK で現在進めている invokedynamic の作業によって,この差はさらに大きなものになるでしょう。
InfoQ: ファイバ (Fiber) に関してはどうでしょう。Java 8 では,コルーチンに関するサポートがいくつか追加されるという噂がありますが,それについて詳細をご存知ですか?
残念ですが,コルーチンのような重要なものが Java 8 に加えられることはありません。しかし Java 9 ならば可能性はあります。JRuby にファイバを実装する場合のオーバーヘッドを軽減するために,Google Summer of Code の学生と一緒に Kilim ベースの実装について調査しているところです。うまく行くかどうかは分かりませんが,すでに作業は進んでいます。
InfoQ: Tom Enebo 氏とあなたは Engine Yard から Red Hat に 移籍したのですが,あなたは JRuby の開発を続けていますね。あなたも Red Hat 自身の JVM 言語である Ceylon を使って開発する予定なのでしょうか?
何だってできますよ! 今回の移籍はとてもエキサイティングです。JRuby の開発に加えて,他の JVM 言語の調査やそれらのサポートが私の仕事の一部になるからです。言語が静的であれ動的であれ,私は JVM こそが最良のランタイムであると考えていますし,それを証明するつもりでいます。
InfoQ: インタビューへのご協力,ありがとうございました!
プレビュー1リリースは JRuby ウェブサイトからダウンロードすることができる。RVM を使用しているなら,rvm install jruby-1.7.0.preview1 でインストールすることも可能だ。