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