ytljitのVM案

追記 2/16

この方法だとレジスタの寿命が必ずネストしてなくてはいけないことになる。実際に使われているところを解析すればいいのだが、せっかくだからレジスタの寿命がlexicalに見えていたほうが嬉しい。ちょっと検討してみる。
結局、寿命解析をするようにする。具体的にはコード生成のVMの木のトラバースに先立って、レジスタが最後に使われるタイミングを調べるためにトラバースする。

本文

 ytljitのVM案をまとめてみます。
基本的にはLisp風です。

  1. let, if, 関数呼び出し, レジスタ参照 の要素を持つ
  2. 数値演算や型変換なども関数呼び出しで表現し、必要に応じて機械語に展開する。
  3. 制御構造はifのみで、ジャンプは関数呼び出しで行う
  4. Tail Callをサポートすることで関数呼び出しとジャンプを表現する
  5. letでレジスタの定義と代入を行う。レジスタは数が無制限で単一代入
  6. letは普通のLispと同様に一度に複数のレジスタの定義できる。これらの代入の順番は定義しない。これによって、可能ならば(副作用を解析する必要があるが)、並列に実行することができる。
  7. リテラルは型をもつ。式はリテラルの型をもとに推論する。

こんな感じのコードになります。

  (let ((r0 (label (pointer (int 8)) "foo")))
  (let ((r1 (memref r0))
          (r2 (label (function (int 32) ((int 8))) "rb_p")
      (call r2 r1)))

TODO 並列実行できそうな面白そうな例