- 嘘のアセンブリに対する、嘘のコード生成ライブラリ
- purescript製
- 0番地から始まる1MBのメモリ空間をもつ仮想機械用の仮想アセンブリ
- 仮想機械の各メモリ番地には32bit符号付き整数が格納される
- 仮想機械のメモリ番地0はプログラムカウンタである
- 仮想機械は標準入出力として32bit整数を出し入れする
- アセンブリ中で、即値は[数値]、アドレスに対する参照は@[アドレス]、参照に対する参照は@[参照]と表される
- @は何個つけてもよい(ゆとり仕様)
- 命令は以下の通り(以下、[値]は即値ないし参照を指すものとする)
- _ ←なにもしない
- ! [値] ←引数を標準出力に書き込む
- ? [参照] ←標準入力を1文字よみとり、参照先に書き込む
- : [参照] [値] ←参照先に値を書き込む
- ~ [参照] [値] ←参照先に値のbitwise notを書き込む
-
- or - or * or / or % [参照] [値] [値] ←四則演算
- & or | [参照] [値] [値] ←bitwise and/or
- { or } [参照] [値] [値] ←左右のシフト演算
- < or > or = [参照] [値] [値] ←2値の比較でその等式/不等式が成立していれば1, さもなくば0
- /data/*/cmds.sasm に例を載せた
- メモリの先頭20番地ぐらいまでをレジスタとしてつかうことにした
- それ以降のメモリ番地を互い違いにヒープ・スタックに割り当てた
- アドレスの演算が非常に大変であり、こんなことをすべきではない
- 二段階の抽象レイヤーを用意した
- 一段階目:制御構造・式・変数・関数・コールスタックについての抽象化
- このレイヤーのコンパイルは、上から順に抽象化した各処理を書き下し、生成されたコード長の情報を用いてifやwhile・関数呼び出しのジャンプ先を適切に設定することで行った
- ifやwhileといった制御構造を追加した
- 式の概念を導入し、評価してスタックに積むことができるようにした
- コールスタックを用意し、フレームを積んだりreturnしたりできるようにした
- 変数についてある程度の抽象化を行い、「n番目のstatic変数」「n番目のスタック変数」「番地nのヒープ変数」「レジスタx」という形で指定できるようにした
- 一段階目:制御構造・式・変数・関数・コールスタックについての抽象化
- 二段階目:関数名・変数名・型・モジュールについての抽象化
- このレイヤーのコンパイルは、変数をかき集めて適切な番号を振り、関数の依存関係を整理することで行った
- 型クラスの魔法でDSLっぽいことをできるようにした