内部プレゼンがあるので現在の進捗をまとめています。
現在内部で使っている lisp (やや scheme サブセット) があるのですが、その同じソースを使って x86 と AVM2 用のコードを生成する予定で、その AVM2 の部分を作っています。独自 lisp はさらに高級な言語をデザインするための基盤となります。
ソースは S 式からアセンブラを生成する部分が独自 lisp で、アセンブラからバイナリを生成する部分は PLT-Scheme です。アセンブラ部分は http://github.com/propella/abckit にアップしています。コンパイラ部分は独自 lisp が無いと動かないのでアップしていません。最終的に全部独自 lisp になって全部 AVM2 で動作する予定です。実用的かどうかは別として、ウェブブラウザから x86 コードを出力する事も可能になると思います。
今の所、AVM2 のうち限られた機能しか使っていないのでコンパイラはとても単純です。300 行くらいしか無いです。関数は全てグローバルオブジェクトに登録しています。アセンブラはテストケース含めて 2000 行ほどあります。クロージャは使えないし、Flash の API にアクセスも出来ないのでまだ実用にはほど遠いです。
現在次の手順で動作します。
- コンパイラはプログラムを読んでアセンブラコードを生成。アセンブラコードは S 式テキストファイルとして保存される。
- アセンブラはアセンブラコードを読んでバイトコードを生成。バイトコードは abc バイナリとして保存される。
- avmshell で直接 abc を実行する。または flash で作られたランチャが abc ファイルから swf を生成し、動的に読み込む(flash には abc を直接実行する API は無い)。
実行環境
デバッグには Tamarin avmshell と Flash の両方を使っています。avmshell は VM にデバッグに必要な最低限の機能を付けたもので、標準出力が使えます。入力は使えません(追記: System クラスに結構色々 IO が用意されていました)。Flash はオプションによってローカルファイル入力が使えますが、出力は出来ません。入出力がしたい場合はサーバーを通して行う事になります。あと試してませんが Flash をローカルアプリのように使う Air というのがあります。Air はファイル入出力は出来ますが標準入出力やパイプは無いみたいです。という事でプログラミング環境として使うために次のオプションがあります。