BT

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

| 作者: Werner Schuster フォローする 9 人のフォロワー , 翻訳者 吉田 英人 フォローする 0 人のフォロワー 投稿日 2011年10月5日. 推定読書時間: 5 分 |

原文(投稿日: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 の解説に用いたスライド を参照してほしい。

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

あなたの意見をお聞かせください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする
コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

ディスカッション

InfoQにログインし新機能を利用する


パスワードを忘れた方はこちらへ

Follow

お気に入りのトピックや著者をフォローする

業界やサイト内で一番重要な見出しを閲覧する

Like

より多いシグナル、より少ないノイズ

お気に入りのトピックと著者を選択して自分のフィードを作る

Notifications

最新情報をすぐ手に入れるようにしよう

通知設定をして、お気に入りコンテンツを見逃さないようにしよう!

BT