言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

Tamarin: Javascript, ActionScript, Firefox, Flash, AVM の関係について

Tamarin プロジェクトについて人に説明しようとしてやっぱりよく分かってなかった事に気が付いたので、調べてみた。知りたかった事は、結局 Flashオープンソースになるかという事だった。ならないというのが結論。しかし、javascript による javascript コンパイラも含まれていて、かなり面白いプロジェクトである事が分かった。

Tamarin とは何か?

話は昨年に遡る。AdobeFlashスクリプトエンジン Tamarinオープンソース化し、Mozilla に提供すると発表した。それを受けて、将来のバージョンの Firefox には、Adobe 製の Javascript エンジンが搭載されると言う。この発表の分かりにくい所は、一体何がオープンソース化されたのかという所。Flash プレイヤなのか?開発環境なのか?スクリプトエンジンって一体何なの?

まずそもそも公開されてるのは現在の Flash9 用のエンジン AVM1 では無く、開発中の AVM2。

中身は AVM2 と呼ばれるバーチャルマシンで、開発環境は付属しない。という事は、そのままじゃ Javascript の実行は出来ないという事?ActionScript 自身で書かれたコンパイラを開発中とある。

Tamarin の中心は、avmplus というコマンド。abc と呼ばれるバイトコードファイルを実行する物らしい。Flash は、swf ファイルに埋め込まれた abc ファイルを実行しているらしいが、その部分だけ抽出した物。

Tamarin をビルドする。

読むだけじゃ分からないので、実際に Windows + VS2003 でビルドしてみた。

Tamarin のソースは mercurial というツールで管理されているので、まずこちらを用意します(http://www.selenic.com/mercurial/wiki/index.cgi)。私は cygwin でソースから make all して make install しました。その後奇妙な事に

$ export PYTHONPATH=/usr/local/lib/python2.5/site-packages:${PYTHONPATH}

が必要でした。後は書いてある通りに、

$ hg clone http://hg.mozilla.org/mozilla-central mozilla-central
$ mkdir ../modules
$ cp -r mozilla-central/modules/zlib ../modules/zlib
$ hg clone http://hg.mozilla.org/tamarin-central
  • tamarin-central\platform\win32\avmplus.sln をビルド (VS2003 の場合)
  • tamarin-central\platform\win32\obj_7\shell\Debug\avmplus_d.exe に出来ました。

avmplus を使う

あとは、 アプリケーションのコンパイルと実行 のとおりにすれば良いです。が、Tamarin に含まれるには VM だけなので、プログラムを開発するには別途 FlexSDK や java が必要です。

javascript で書かれた javascript コンパイラ esc を試す。

えー Flex が要るの???じゃオープンじゃ無い!と言う潔癖症の皆さんに朗報。javascript で書かれた javascript コンパイラ esc が開発中であります。ちょっと遊ぶ程度には充分です。これは超楽しみ。avmplus_d.exe を tamarin-central/esc/build にコピーしてから以下のようにします。

$ cd tamarin-central/esc/build/
$ ./avmplus_d.exe ../bin/debug.es.abc ../bin/ast.es.abc ../bin/ast-decode.es.abc ../bin/ast-encode.es.abc ../bin/util.es.abc ../bin/lex-char.es.abc ../bin/lex-token.es.abc ../bin/lex-scan.es.abc ../bin/parse.es.abc ../bin/util-tamarin.es.abc ../bin/bytes-tamarin.es.abc ../bin/util-tamarin.es.abc ../bin/asm.es.abc ../bin/abc.es.abc ../bin/emit.es.abc ../bin/cogen.es.abc ../bin/cogen-stmt.es.abc ../bin/cogen-expr.es.abc ../bin/main.es.abc
es> print (3 + 4)
7