BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース InvokeDynamic と Javascript - 新コンパイラ Dyn.js と Oracle Nashorn,Rhino

InvokeDynamic と Javascript - 新コンパイラ Dyn.js と Oracle Nashorn,Rhino

原文(投稿日:2011/10/02)へのリンク

Javascript の新たな実装である dyn.js が,ヨーロッパ JavaScript カンファレンス jsconf.eu で発表された。Javascript コードを Java バイトコードにコンパイルする。動作には invokedynamic やメソッドハンドラなど,新しい Java 7 の動的言語機能 が必要だ。

Java 7 は,動的言語の JVM への実装を支援する invokedynamic とメソッドハンドル (Method Handle) を備えている。JRuby チームは invokedynamic を統合する作業を実施中で,Rhino の実行速度改善の試みも開始されている。
Java 7 で動的言語を改善するプロジェクトとしてはもうひとつ,Attila Szepedi 氏の進める Dynalink がある。この "invokedynamic ベースの多言語結合とメタオブジェクトプロトコルのフレームワーク" には,JVM 上のさまざまな言語ランタイム間の統合実現が期待されている。氏は JVM の Javascript 実装である Rhino も開発している。

Oracle は Java 言語による Javacsript 実装である Nashorn (PDF へのリンク) を発表した。Java 7 の動的言語機能を使用する。現時点ではまだリリースされていないが,リンクされているスライドによると Java 8 と合わせて公開される予定のようだ。

さらに別の JVM 用 Javascript 実装が,JSConf.eu で Douglas Campos 氏によって発表された。それが dyn.js だ (GitHub リポジトリへのリンク) 。

InfoQ では Douglas Campos 氏に,dyn.js の開発理由などについて聞いた。

InfoQ: dyn.js とは,どんなものなのでしょう?

ECMAScript 5 仕様の新しい実装です。invokedynamic や MethodHandles など最新のクールな JVM 機能を活用して,よりフレンドリなコードベースを実現することが,開発のおもな動機です。

InfoQ: AOT (ahead-of-time) コンパイラや動的ランタイムの開発は行っていますか?

バイトコードへの AOT コンパイラの構築作業を初めています。仕様の実装が進んでいけば,間違いなくそちらに切り替えていくことになるでしょう。

InfoQ: Rhino,あるいは Oracle の Nashorn とはどのように違うのでしょう?

Rhino はまさに芸術作品です – Rhino が生まれたとき,JVM は今ほどクールではありませんでした。開発者たちは,ランタイムほぼ全体にわたってハンドクラフトを施すことで,奇跡的なパフォーマンスを獲得したのです。dyn.js は 2011 年の Rhino とも言うべきものです – JVM は以前よりもパワフルになっていますし,上位互換性を気にする必要もありません。

dyn.js は BrazilJS 2011 (braziljs.com.br) で,Oracle の Nashorn は JVM Language Summit (http://openjdk.java.net/projects/mlvm/jvmlangsummit/) で発表されました。この2つの大きな違いは,Oracle の実装は有償製品であることと,私の知る限りソースを公開する予定がない ("To Be Defined" とされています) ことです。dyn.js はオープンソースソフトウェア (Apache 2 に似たライセンス) なのです。

InfoQ: invokedynamic と Attila Szegedi 氏の Dynalink はどのように使われているのでしょう?

invokedynamic を使用するおもな理由は,ポリモーフィックメソッドなメソッドシグネチャ(ランタイム時にのみリンクされる) によってランタイムを小さくするためと,動的コードを JIT フレンドリなものにするためです。

Szegedi 氏の Dynalink は dyn.js ランタイムのコアとして,すべての動的呼び出しをルーティングする機構を提供しています。Dynalink は型変換 (現在は JS プリミティブのオートボクシング/アンボクシングに使用しています) やインラインキャッシュ (単一型のインラインキャッシュを備えています) など,数多くの機能を持っていますが,中でも面白いのはメタオブジェクトプロトコルです。言語ランタイム間での JIT インライン化も実現されていて,JVM ベースの動的言語間の関係に革新を起こすかも知れません。

InfoQ: Node.js スタイルのフレームワーク,例えば RingoJS を統合する計画はありますか?

確かによい目標です。すでに node.x フレームワーク (https://github.com/purplefox/node.x) について検討しているところです。仕様準拠に近づくことができれば,このような方向は自然な流れだと思います。

InfoQ: dyn.js は誰がサポートしているのでしょう?

最初は私と Alexadre Procelli (@porcelli) (パーザ担当) で始めて,以降は多くの友人の助力を求めてきました。 ギークの力も借りたいところですが,私は言語ランタイム開発への関心が強く (JRuby のコントリビュータです),そこから Java 7 の機能に関わることになりました - そういうわけで残念ながら,ドキュメントがあまり充実しているとは言えないのです (私たちは hotspot/mlvm の連中がやったような,クールで新しいものを目指しています)。

dyn.js のリポジトリ は GitHub 上で公開されている。実行には Java 7 の他,BiteScript 由来のバイトコード生成 API である Jitescript も必要だ。技術的な詳細については,氏が JSConf.eu で行った dyn.js の解説に用いたスライド を参照してほしい。

この記事に星をつける

おすすめ度
スタイル

BT