言語ゲーム

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

Twitter: @propella

AVM2 アセンブラ続き

内部プレゼンがあるので現在の進捗をまとめています。

現在内部で使っている lisp (やや scheme サブセット) があるのですが、その同じソースを使って x86 と AVM2 用のコードを生成する予定で、その AVM2 の部分を作っています。独自 lisp はさらに高級な言語をデザインするための基盤となります。

ソースは S 式からアセンブラを生成する部分が独自 lisp で、アセンブラからバイナリを生成する部分は PLT-Scheme です。アセンブラ部分は http://github.com/propella/abckit にアップしています。コンパイラ部分は独自 lisp が無いと動かないのでアップしていません。最終的に全部独自 lisp になって全部 AVM2 で動作する予定です。実用的かどうかは別として、ウェブブラウザから x86 コードを出力する事も可能になると思います。

今の所、AVM2 のうち限られた機能しか使っていないのでコンパイラはとても単純です。300 行くらいしか無いです。関数は全てグローバルオブジェクトに登録しています。アセンブラはテストケース含めて 2000 行ほどあります。クロージャは使えないし、FlashAPI にアクセスも出来ないのでまだ実用にはほど遠いです。

現在次の手順で動作します。

実行環境

デバッグには Tamarin avmshell と Flash の両方を使っています。avmshell は VMデバッグに必要な最低限の機能を付けたもので、標準出力が使えます。入力は使えません(追記: System クラスに結構色々 IO が用意されていました)。Flash はオプションによってローカルファイル入力が使えますが、出力は出来ません。入出力がしたい場合はサーバーを通して行う事になります。あと試してませんが Flash をローカルアプリのように使う Air というのがあります。Air はファイル入出力は出来ますが標準入出力やパイプは無いみたいです。という事でプログラミング環境として使うために次のオプションがあります。

  • Tamarin avmshell を改造して IO を拡張する。
  • Flash とサーバを使う。
    • ブラウザで作業するのが苦でない人向け。
  • Air を使う。
    • 未知数。

課題