新JavaScriptエンジン「Nashorn」でNode.jsにも接近
現在のJava SEには、JavaScriptエンジンとしてMozillaが開発した「Rhino」がバンドルされている。
Rhinoは、各種スクリプト言語を実行するために、Java SE 6からAPI「JSR 223: Scripting for the Java Platform」が導入されたのにともなって、そのうちのJavaScriptのための実行基盤として導入された。
従って、現時点でもJavaプログラム内でJavaScriptを実行したり、JavaScriptからJavaのライブラリにアクセスしたりすることは可能なのだが、オラクルはJava SE 8からRhinoに代わる新しいJavaScriptエンジンを採用する予定でいる。それが「Nashorn」だ。
JavaOne Tokyoで「The Future of JavaScript in the JDK」のセッションを行ったオラクルのAkhil Arora氏によれば、Nashornの開発はもともと同社の社内プロジェクトとしてスタートしたもので、次のような目標が掲げられているという。
- Javaと同等のパフォーマンスを実現
- Java開発者が慣れ親しんだAPIを、そのままJavaScriptにマッピング
- Javaのサンドボックスを壊さないセキュアな実行環境を構築
- JavaとJavaScript間のシームレスなデバッグ体験を提供
- JVMの状態を監視できるようにする
- エンタープライズの要求を満たすようカスタマイズ
- 「ECMAScript 262 Edition 5」に準拠
Nashornでは、Java SE 7から導入された動的言語向けのバイトコード命令「invokeDynamic」や、JVMメソッドに対する匿名参照をサポートする「メソッド・ハンドル」などの機能を利用することで、パフォーマンスの大幅な向上を実現しているという。
具体的に、どのようにJavaScriptが実行されるかというと、まずJavaScriptのコードからAST/IR(抽象構文木/中間表現)を生成し、そこから「ASM」を使ってJavaバイトコードを生成する。従って、実行時にはネイティブのバイトコードになるため、Javaと同等のパフォーマンスを実現できるという。
JavaからJavaScriptを呼び出す際にも、JavaScriptがすでにバイトコードに変換されているので、バイトコードからバイトコードを呼ぶことになる。つまり、通常のメソッドコールとまったく同じ仕組みであるため、Javaのサンドボックスが壊されることはない。
また、JavaScriptのコンテンツはそれぞれ個別のクラスローダによってロードされるため、セッション間の独立性を保てるという。
Nashornでは、オブジェクトを表すルートクラスとして「ScriptObject」クラスが定義されている。ScriptObjectは次の3つのプロパティを持つ。
- オブジェクトのプロパティを格納する「Map」
- 未定義のプロパティの値を決めるための「Prototype」
- ダイナミックなプロパティの値を格納する「Spill」
JavaとJavaScriptの型の対応は、下図ようになっているという。
JavaScriptからJavaコードの呼び出しについては、次の原則に基づいて処理される。
- NashornのオブジェクトでなければJavaのオブジェクトとして扱う
- フィールドや配列へのアクセスはJavaと同様の方法を提供
- メソッドの引数は適切な型に暗黙で変換
- メソッドのオーバーロードをサポート
- プロパティの読み書きはJavaBeansのgetter/setterによって行う
JavaからJavaScriptの呼び出しは、Rhinoと同様にJSR 233の「Scripting API」(「javax.script」パッケージ)を利用して行える。その際、Nashornのオブジェクトは、Java側では「Map<K,M>」クラスにマップされるという。
NashornはOpenJDKプロジェクトの下でオープンソースで公開する予定とのことだが、現在のところ、まだ具体的な時期は明らかにされていない。最初のベータ版はオープンソース化された後にリリースする計画だという。そして、冒頭で触れたように、最終的にはRhinoを置き換える形でJava SE 8に搭載されることになる。その他、NetBeansによるサポートも予定されているという。
セッションでは、Node.jsの内部JavaScriptエンジンを既存のV8からNashornに置き換え、Javaのライブラリを呼び出すというデモが行われた。Javaの魅力の1つは、その豊富なライブラリである。Nashornによって、これまで以上にJavaとJavaScriptの連携が実用的になれば、サーバサイドJavaScriptアプリケーションの開発にも一石を投じることになるかもしれない。Node.jsのデモは、その可能性の一端を見せてくれるものだった。
なおArora氏によれば、V8からNashornへの置き換えは、APIのラッパの作成などをはじめとした大幅な変更が必要であり、決して容易ではなかったとのこと。ただし、このデモに使用したNashorn版Node.jsについても、いずれはオープンソースとして公開予定だそうだ。
Java SE 9以降のJavaは、どうなるのか
最後に、Java SE 9以降での導入が検討されている機能について触れておきたい。Java SE 9以降の機能については、Strategy Keynoteで下図のように紹介された。
現時点で、JVMはさまざまな言語の基盤としての立場を確立しているが、今後もその流れを推し進めるほか、ネイティブコードとのインテグレーションについても強化していく方針だという。
また、Java EE 7がクラウドへの対応を主眼に開発されているのに続いて、Java SEでもクラウドを視野に入れ、マルチテナンシーやリソース管理の問題に取り組んでいくようである。また、ハイパーバイザ対応のJava VMも登場する予定だという。
Technology Keynoteでは、上記の他に「レイフィケーションの導入」「Tail Call(末尾呼び出し)およびContinuation(継続)のサポート」などといった項目も挙げられた。レイフィケーションは、一時はJava SE 7でのサポートが検討されたこともある「具象ジェネリクス」に関連する機能を指すのではないかと思われる。「Tail Call/Continuation」については、「The Da Vinci Machine Project」において、これをサポートしたVMのプロトタイプが実装されている。
ここで挙げられているのは、あくまでも提案の段階であり、今後本当に追加されることになるかはまだ分からない。Java SE 8が登場する来年には、その次のバージョンとなるJava SE 9の姿も見えてくるだろう。
Java SE 6からJava SE 7の登場までには5年のビハインドがあり、そのため、Javaの開発が停滞しているのではないかという印象を持たれた時期もあった。しかし、2011年にはJava SE 7が登場し、Java SE 8の開発も着々と進められている。Javaは再び前に進み出したと言っていいだろう。
JavaOne Tokyo 2012の実行プロジェクトでリーダーを務めた日本オラクルの伊藤敬氏は、Technology Keynoteの最後に参加者に向けて次のように呼びかけた。
「今年のサンフランシスコのJavaOneは1つのキーになるだろう。次期バージョンのJavaプラットフォームのリリースが近づき、現在少しずつ情報が明らかになっている技術が、実際にどう実装されていくのかを見ることができるはずだ。ぜひ参加して、その進化を見ていただきたい」
「JavaOne 2012」は、9月30日から10月4日(米国時間)にかけて開催される。世界中からJava開発者が集まるJavaの祭典におけるさらなるJavaの進化の発表に期待したい。
関連リンク
7年ぶりのJavaOne Tokyoで見たJavaの未来
JavaOne Tokyo 2012まとめレポート(前編) iOSやHTML5、クラウドに接近しつつ、自身も進化を続けるJava。前進する鍵は開発者やコミュニティにある
「Java Solution」フォーラム 2012/4/13
JavaはクラウドやHTML5、iOS/Androidも取り込む?
JavaOne 2011まとめレポート Java SE 8/9、マルチクラウドに進むJava EE 7、JavaFXと融合しAndroid/iOS対応を目指すJava ME、HTML5を取り込むProject Avatarなど
「Java Solution」フォーラム 2011/10/14
オラクル買収後のJava 7と8、JavaFXはどうなるのか
JJUG Cross Community Conference 2011 Spring レポート Java SE/EEの今後やJRockitとHotSpotの統合など最新情報をお伝えする。そして今後のJavaOneは?
「Java Solution」フォーラム 2011/5/30
沖縄の技術者がアツい!ハッカソン&代表者に聞いた
Made in Javan!地方コミュニティ探訪記(1) 「Java Kueche」ハッカソンでHeroku、Rails 3.1、jQuery Mobile、Facebook、Hadoop、Play!、GitHubそして地獄のミサワが!?
「Java Solution」フォーラム 2011/12/14
あなたの知らないJDKの便利ツールたち
安藤幸央のランダウン(43) 最近のJDKに含まれている開発やデバッグに便利なツールを、プロファイリングや情報取得、監視、配備、スクリプティングの5種類に分けて紹介
「Java Solution」フォーラム 2008/11/13
開発者が知っておくべきJavaと仮想マシンの歴史
安藤幸央のランダウン(42) JavaとVMが生まれた背景や名前の由来、さまざまなJDK、マイクロソフトやAndroid、iPhoneとの関係、Java VMで動くスクリプト言語など
「Java Solution」フォーラム 2008/9/4
「Javaは遅い」から「Javaは楽しい」に至る歴史
小山博史のJavaを楽しむ(12) 最新のJava実行環境は起動が速いドラッガブルアプレットなど楽しい機能が満載です。ここまで至るには、いろいろな出来事がありました……
「Java Solution」フォーラム 2008/12/15
【改訂版】Eclipseではじめるプログラミング
これからプログラミングを学習したい方、Javaは難しそうでとっつきづらいという方のためのJavaプログラミング超入門連載です。最新のEclipse 3.4とJava 6を使い大幅に情報量を増やした、連載「Eclipseではじめるプログラミング」の改訂版となります
「Java Solution」フォーラム
Copyright © ITmedia, Inc. All Rights Reserved.