CommunityOne/JavaOneレポート
Javaプラットフォームを進化させるJRuby
2009/06/12
JRubyコア開発メンバーでサン・マイクロシステムズのチャールズ・ナッター(Charles Nutter)氏「JVM上で不可能なことなど何もない」(Nothing is impossible on the JVM)――、こう話すのはJRubyでコア開発メンバーを務めるチャールズ・ナッター氏だ。2009年6月1日、米国サンフランシスコで開催されたCommunityOne(JavaOne)で講演したナッター氏は、JavaVM上にRuby処理系を実装した経験について話した。当初まったく実現不可能に思えたプロジェクトで、どう障害を乗り越え、その取り組みがいかにJavaプラットフォームに影響を与えているかについて解説した。講演のタイトルは「不可能を超えて:JRubyはいかにJavaプラットフォームを進化させたか」(Beyond Impossible:How JRuby Has Evolved the Java Platform)だ。
Ruby on JVM!? そんなの実現不可能!
もともとJava言語向けに開発されたJVMだが、最近ではScala、Clojure、Groovy、JRubyなど多くのプログラミング言語が利用可能となっている。しかし、ScalaのようにもともとJVMをターゲットとして開発された言語と異なり、JRubyのような既存言語をJVM対応とするための課題は多かった。ナッター氏には、それは当初は不可能に思えたという。
「(JVMの文字列オブジェクトの扱いと異なる)バイナリの文字列、POSIX対応、ネイティブライブラリ、高速な正規表現ライブラリ、libcのI/Oセマンティクス、こうしたものを実装しつつ、ネイティブスレッドに対応させ、さらにCベースのRubyよりも高速に動作させる……、しかも、それを言語仕様もAPI仕様もなしにやる。これはまったく不可能なことに思えましたね」(ナッター氏)。
実現不可能に思えたものの、Rubyの美しさや楽しさ、Rubyコミュニティが生み出すGems、Rake、RSpec、Railsといった独特のツール群があったことなどから、ナッター氏は「Rubyが好きだったし、それに難しい問題ほど解くのが楽しいもの」とJRubyの開発に取り組んだという。
irb、Gems、Railsが動くまで
JRubyが現在のようなCRubyとの互換性を持つにいたるまで、いくつかステップがあった。
まず、インタラクティブな実行環境(REPL)の「irb」の実現のためにevalや基本的なバインディング、変数などで、Rubyの挙動を実現。これは実行と修正を繰り返すシンプルなステップだったという。次に取り組んだreadlineのサポートも、JVM上の複数のライブラリから選択して、それを流用するだけですんだ。
Rubyのライブラリパッケージ管理ツール、RubyGems対応とするには、もう少し手間がかかったという。まず、定義ファイルで使われるYAML形式のファイルをパースするJVM上のライブラリが部分的なものしかない。パッケージの圧縮に使われるzlibも、RubyはCで書かれたライブラリを使っていて、こうしたライブラリもJRubyでは実装する必要があったという。結果、「今やJRubyはRubyよりもYAMLとの互換性が高い」とナッター氏は笑う。
Ruby on RailsはRuby処理系の試金石だ。「Railsが動けば本物、もし動かないなら、それはRuby実装とは言えない」(ナッター氏)。今やRailsはRubyを使ったアプリケーションとして最大規模、しかもRubyの機能をもっとも深い部分まで使っていると言われている。これが動けば大きなマイルストーンとなる。
Rails対応で問題となったのは、ORマッパのActiveRecordだったという。Rubyによる実装はJRubyには複雑すぎ、かといってJDBCは低レベルすぎた。そこでJDBCのAPI上にラッパーを実装することで対応。JRuby on Railsが動くようになったという。「2006年5月に初めてRailsがJRubyで動いた時には感動しましたね。JavaOne2006のデモにも間に合って、それでサンに職を得たわけです(笑)」(ナッター氏)。2006年9月、サン・マイクロシステムズはJRubyコア開発者のナッター氏とトーマス・エネボー氏を雇い入れた。このとき実は、事前にサンでWeb技術担当責任者を務めるティム・ブレイ氏から、「JavaOneまでにRailsが動けば、何かいいことがあるかもね」とほのめかされていた、と明かす。
文字列オブジェクトや正規表現も実装、移植
当初、JRubyでは文字列オブジェクトをJavaのStringBufferを使って実装していたが、これも問題となった。セマンティクスが違うし、Rubyの文字列オブジェクトはバイナリにも使われるという特徴があったという。このため、Javaのbyte配列を使い、コピー・オン・ライトの特徴を持った文字列オブジェクトを独自に実装した。この変更によって、さらに多くの“不可能な課題”に遭遇することとなったが、「それが本家Rubyと同等になれる唯一の方法だった」とナッター氏は振り返る。
高速な正規表現ライブラリは、テキスト処理を得意とするRuby処理系のキモの1つだ。JRubyでは、ここでも苦労したという。JRubyで当初使っていたjava.util.regexは、大きなデータではエラーとなって使えず、それに代えて使っていたJRegexはchar配列ベースだったため、これも使えなかった。
次の“不可能な課題”は正規表現ライブラリの独自実装だった。ただ、このときには魔法のようなことが起こったのだという。CRubyでも使われている「鬼車」というライブラリをJVM上に移植するとメーリングリストで名乗り出た人がいて、実際、たった1人で1カ月で移植作業を終えたという。移植したMarcin Mielzynski氏のことを最初ナッター氏は気にしていなかったという。6万5000行にもなる、C言語特有のテクニックが多用されたソースコードを1人で移植できると思えなかったからで、ナッター氏は「まったく驚異的な馬力だった」と振り返る。
Mielzynski氏が鬼車から移植したこの正規表現ライブラリは、JVM上で動くものの中でも最高のものだとナッター氏は言う。そして「Jythonもバイナリ文字列を実装したら、これを使うと思います」と、JRubyがJavaプラットフォームに与えつつある影響を指摘する。
POSIXという“不可能な課題”も克服
POSIX対応も“不可能な課題”と思えた。JVMからは「chmod、symlink、fstat」といったシステム関連のAPIは手が出せない。このため、JNA(Java Native Access)を使ってPOSIX対応とするプロジェクトを開始。その後、マルチプラットフォーム対応としたほか、FFI(Foreign Function Interface)ライブラリベースに移行。JRubyの中からCで書かれたライブラリを呼べるようになったという。ナッター氏はさらにクイックソートのコード例を示しながら、JRuby側のブロック(ソート用の比較関数)をCの関数(qsort)のコールバックとして使うことができることもデモしてみせた。ただし、JRubyからFFIを使ったCプログラムの利用は一般的に推奨しているわけではなく、既存ライブラリの利用などに限定すべきだとしている。
JRubyではPOSIX関連のAPIも利用できる
FFIを使ってCの関数を呼び出す例
FFIを使ってCからRubyのブロックをコールバック関数として使う例「この中でOpenJDKにパッチを受け入れてもらったことがある人?」。会場に向かってそう問いかけたナッター氏は、誇らしげに「オレあるもんね」と笑う。I/O周りでlibcと同じセマンティクスを持つライブラリを実装したナッター氏は「libcのコードを追いかけたことある人? 私はひと夏やりましたが、お勧めしませんね」とも言って会場の笑いを誘っていた。
Java 7で動的言語対応強化
文字列、正規表現、I/O関連といった実装でパフォーマンスや互換性は向上したが、現在さらにパフォーマンスの改善に取り組んでいるという。Rubyでは明示的な型がなくクラスも動的に生成されるが、それをJavaのクラスにコンパイルするという難題に取り組み、さらに今は「Da Vinci Machine」と名付けられたプロジェクトが進行中だという。
Da Vinci Machineプロジェクトでは、JVM自体に変更を加え、特にJRubyをはじめとする動的言語サポートを強化するための新しい仕様でJSR 292として議論が続いている。この新仕様では、実行時にクラスの生成やメソッドの探索を行うRubyのような動的言語のために、「Invokedynamic」と呼ぶ新たなバイトコードなどを定義する。これらの新仕様はJava 7に含まれることになりそうだ。つまり、今やJVMはJava言語のためのVMという枠組みを超えて進化しつつあるということで、JRubyも影響を与えているということだ。ナッター氏は、OpenJDKがコミュニティによって開発が方向付けられるものであることを改めて指摘。「JVMで不可能なことなどない。やりたいことがあれば実装すればいい」と話した。
講演終了後、愛想良く撮影に応じ、Rubyへの愛と、ハックの喜び、世界中を旅して各地のコミュニティのメンバーと交流する楽しさを語ってくれたナッター氏だった関連リンク
関連記事
情報をお寄せください:
- Android NDKでJNIを使用してアプリを高速化するには (2010/3/17)
C/C++やOpenGL ESといったネイティブコードを使うためのNDKとJNIを紹介し、その使い方や注意点を徹底解説します - 調査の難しい「OutOfMemoryError」事例、5選 (2010/3/11)
Java開発者が避けて通れないメモリ不足エラーの基本的な問題切り分け方法と発生につながる事例、対処法を解説 - 究極の問題解析ツール、逆コンパイラJD-Eclipseとは (2010/3/8)
ライブラリ内で例外が発生! そのクラスのソースコードを調べたい!! 自動で逆コンパイルしてくれる無料Eclipseプラグインがあります - いまさら聞けない「Webサービス」の常識 (2010/2/26)
昨今では企業システムでも使われる「Webサービス」の概念やJava標準のJAX-WSを紹介しJBoss WSでサンプルを作成
|
|
スポンサーからのお知らせ
- - PR -
| 「いつかは壊れるサーバ」そんな故障に 迅速で安価に手軽に対応する方法とは? New! |
| 「特権ユーザー」の事件を防げ! 万能権限を持つユーザーの管理方法とは? New! |
| 仮想環境の構築とデータ保護の特効薬?! 実績と信頼性の高いパッケージで安心運用 |
| 仮想環境のバックアップもこれまでどおり 「まるごと取ってまるごと戻す」簡単運用 |
| おばかアプリ選手権、第4弾開催中!! ムダにカッコよくてくだらない作品求ム! |
| 社内ファイルサーバを“クラウド”に統合 VPN直結「クラウド型ストレージ」を紹介 |
| その数、なんと400台以上! グループ内 サーバの「統合管理」によるメリットは? |
| 美人!? まあまあ? 気になる いやし系!! PV急増で「美人時計」がとった手段とは? |
| 進化を続ける富士通ストレージETERNUS DX 製品開発者の自信を裏付けるものとは何か |
| 運用管理の課題を“2つの観点”から分析 ユーザー満足度の高い「仮想環境」とは? |
- - PR -
お勧め求人情報

**先週の人気講座ランキング**
〜CCNA編〜
| ◆ | TomcatやJBossなどAPサーバ環境に関する 情報を集約! “業務”用APサーバ大百科 New! |
| ◆ | 一気に解説! 最新のクラスタストレージ 「RAIDを超えたストレージ基準」……など New! |
| ◆ | クラウド的ユーザー体験の変化は脅威か? 仮想化技術を使いこなす運用管理術を紹介 New! |

| ◆ | 上司や部下、部署内メンバーとの情報共有 を“ガラッ”と変えるコラボツールとは? New! |
| ◆ | おばかアプリ選手権、第4弾開催中!! ムダにカッコよくてくだらない作品求ム! |
| ◆ | 社内ファイルサーバを“クラウド”に統合 VPN直結「クラウド型ストレージ」を紹介 |

| ◆ | Twitterのアカウントはなぜ突破された? メールによる新手の攻撃手法とその対策 |
| ◆ | もう仮想化のお試しフェイズは終わりだ! Hyper-V 2.0が基幹システムも仮想化 |
| ◆ | 美人!? まあまあ? 気になる いやし系!! PV急増で「美人時計」がとった手段とは? |

| ◆ | クライアント企業から求められる人材 ⇒IT技術と経営戦略を併せ持つ「戦略家」 |
| ◆ | .NET編集長が実践する「技術情報検索術」 サンプル・コードを簡単に探す“技”は? |
| ◆ | 業務効率と情報セキュリティ対策を両立! 手間なく確実に機密情報を守る方法とは? |

| ◆ | 進化を続ける富士通ストレージETERNUS DX 製品開発者の自信を裏付けるものとは何か |
| ◆ | 運用管理の課題を“2つの観点”から分析 ユーザー満足度の高い「仮想環境」とは? |

| ◆ | 【CTC事例】約30の基幹システムを統合! 膨大なバッジジョブを制御した方法は? |
| ◆ | 仮想化すればコストは削減できるか? 仮想化に必要な「3つの視点」を解説する |
| ◆ | その数、なんと400台以上! グループ内 サーバの「統合管理」によるメリットは? |






