related: mimium新内部表現の構想 mimiumの中間表現を考える mimiumのMIRコンパイル過程を真面目に考える
既存の多段階計算の文献は基本的に操作的意味論を定義しているため、そのままナイーブに実装するならツリーウォークインタプリタやCEKマシン的なものにならざるを得ない。
ただmimiumでは既にVMのフォーマットを定めており、マクロ展開やコンパイル時計算をMIRレベルで展開する全く別の処理系をもう一つ作らなければいけないのか?という悩みがある。
一つの方向として、多段階計算の意味論を丸ごとVMの命令列の中に組み込むことはできないだろうか?というのを考える。
追加命令
incl_level / decl_level <dst>
のような命令があるとする
VMは最初、マクロ評価時に自分の現在の評価ステージを0として評価スタート
VMは、命令記録モードと実行モードの2種類で、現在の評価ステージが0のときに実行モードになる
mainプログラムの先頭はマクロ展開のため必ずincl_levelからスタート=命令記録モードから開始
命令記録モードでは、decl_levelがでてくるまでバッファに実行した命令をコピーし続ける decl_levelでレベル0になったら…うーん
addc
の型は(&int,&int) -> &int
CodeもEscapeもネストできる構造なんだから命令型に直すとなにかしらのスタック構造を操作するものになるはず Escapeはあくまで埋め込むだけで評価をするわけじゃないんだよな
&(~x + ~y)
ここだけ取り出すとどうだろう
~x
はxを評価した後にエスケープする、ってことだもんなあ
fn addc x y // reg 1,2にはプログラム辺のインデックス
startescape
mov 1 x
endescape
startescape
mov 2 y
endescape
add 1 1 2 //最後は必ずこうなるわけで
fn main
movc 1 100
movc 2 200
lift 2 1
lift 3 2
startescape
move 1 "addc"
call 1 2 1
endescape
ret 1