JVM上で動くJavaScriptについて調べたので、メモしておきます。
これまでの状況
まずは、Rhinoが有名です。「ライノ」と呼びます。RingoJSやMayaaなど、すでに広く使われています。Java6から標準でJDKにバンドルされています。(ただし、バンドルされたものは若干バージョンが古いです。)
Rhinoの他には Apache Aptana Jaxerというサーバサイドでscriptタグを解釈するフレームワークがあります。こちらは、C言語で書かれたSpider Monkeyを利用しています(JNIでしょうか?)。
Spider MonkeyとRhinoはともに、Mozilla傘下で開発がされている姉妹関係にあります。Firefoxで使用されているのはSpider Monkeyの方で、現在のFirefoxでは、TraceMonkey, JagerMonkeyのようにパフォーマンス改善が施されています。
サーバサイドJSといえば、Node.jsが有名ですが、JVM上では、RingoJSというフレームワークがあります。これはRhinoをベースにしています。
その他、Java上でChromeOSで使われているV8エンジンを使おうという試みもあります。
http://rbackhouse.blogspot.com/2011/03/using-google-v8-javascript-engine-in.html
これからの動き?
Java7から、invokeDynamic機能が搭載されました。これによって状況が変わりました。なぜかというと、invokeDynamicを使用すると、JVM上で動くスクリプト言語のパフォーマンスを向上できるからです。Rhinoはパフォーマンスのために、ソースコードが職人芸になってしまい、読みづらいと言われています。
OracleはJava8で、新しいJVM上でのJavaScript実装 Nashorn をRhinoの置き換えとしてリリースするとアナウンスしました。Nashornとは、ドイツ語で「サイ」を意味する(中性)名詞です。「ナズホーン」と呼びます。ちなみにRhinoは英語で「サイ」という意味です。ソースが公開されるのかについての言及はないので、商用製品としてリリースされる可能性があります。
他にDyn.jsというプロジェクトがApache2.0ライセンスで開発が進められています。これは、Dynalinkやantlr3という、同じApache2.0ライセンスのライブラリをうまく利用して、ソースを読んで見ましたが非常に綺麗な印象を受けました。
Rhinoも開発が続けられていて、invokeDynamic対応が進められています。
今後どうなるのか?
2011年12月3日時点zipでダウンロード出来るバージョンのDyn.jsをダウンロードして実行したところ、次のコードが誤って実行されていました。
(funcion(x){print(x)})(1)
x
これはバグです。Rhinoで同じコードを書くと
1
と出力されます。最新版ソースからビルドしたものを使えば直っているかもしれませんが、やはりまだまだ開発途中という印象があります。ドキュメントが充実していないので、例えば、Javaオブジェクトとの連携方法がよくわかりません。RhinoではPackages.パッケージ.クラス名でアクセスできますが、この記法で統一されるのでしょうか?
Java8のリリースは2013年と言われているのでまだ時間があります。Rhino自体はパフォーマンスに問題がないため、今後も使われていくでしょう。NashornはOracleの力で、もしかしたら今後普及するかもしれません。Dyn.jsはソースが非常に美しいので、頑張って欲しいと思います。
HTML5ブラウザを内包するアプリケーションをJavaで作る場合は、V8エンジン+JNIを検討するのも選択肢として良いかもしれません。
Javaやが知るべき5つのJSエンジン
という釣りタイトルで以下のエンジンを列記した際は当エントリへ、今時流行らないトラックバックでもくださいw
- Rhino
- SpiderMonkey
- V8
- Nashorn
- Dyn.js
5人揃ったので
赤ライノ、青スパイダー、緑ブイ、ピンクナズホン、イエローディーン、5人揃ってJSエンジャー
参考にしたサイト
InvokeDynamic と Javascript - 新コンパイラ Dyn.js と Oracle Nashorn,Rhino
Mozilla Firefoxのバージョンの変遷(Wikipedia)
SpiderMonkey(Wikipedia)
RingoJSにAppengineJSを組み込んでGAE上で使う方法(Web系がおもしろい。)
Nashorn_(JavaScript_engine) (Wikipedia/en)
dyn.js(git-hub)
追記
2011/12/03 22:33 Aptana JaxerをApacheと記入してしまっていたので修正しました。やや言い回しやレイアウトなど修正しました。
この記事は以前多くのブックマーク・コメントを頂きました。
これからブックマークされる方はこちら↓