SECDR-schemeをつくる の1

prev: http://d.hatena.ne.jp/mjt/20110317/p1
SECDR-schemeに収録されているドキュメントにSECDRマシンの命令19個すべてが説明されている。VMは単純にこれをパクることにする。

命令はオリジナルのSECDマシンからかなり変化している。ADDのようなプリミティブ命令が無く、Schemeのためのいくつかの最適化が導入されている。つまり:

  • AP(Apply)とSEL(Select)命令に末尾コンテキスト版が追加されている。
  • ASSIG命令とLD命令にtail版のバリアントが有る
  • Apply引数を積むためのPUSHCONS命令を追加している

SECDRマシンは多値に関する考察がない。Chibi-Schemeのように多値はエミュレーションで実装することになる。

Load/Assign群

  • LD (Load - ローカル変数を現在のフレームからロード)
  • TLD (Load/tail)
  • GLD (Load-global - グローバル変数のロード)
  • LDC (Load-constant - 定数ロード)
  • LDF (Load-function - Closureのロード)
  • ASSIG (Assign - ローカル変数への代入 - set!)
  • TASSIG (Assign/tail)
  • GASSIG (Global-assign - グローバル変数への代入 - set!)
  • DEF (Define - グローバル変数への代入 - define)

TLDやTASSIGは、フレーム構造が真正なリストでないときに使う。要するに可変長引数のlambdaを取り扱うケースで使用する。

Push群

  • PUSH
  • PUSHCONS

PUSHCONSはスタックトップのlistを伸ばす。これは、手続き呼び出しの引数を伸ばしていく操作に相当する。PUSHは文字通りのpush。

Apply/Return群

  • AP (Apply)
  • TAP (Apply/tail)
  • RTN (Return)

APはapplyを普通に実装している。APは現状のVM状態をDumpレジスタにプッシュする。
RTNはDumpレジスタからVM状態をpopすることで呼び出し元に戻る。
TAPは末尾呼び出し用のバリアントで、現状のVM状態をDumpレジスタに保存しない。つまり、後続のRTNではTAPした手続きの呼び出し元にもどることになる。

Select群

  • SEL (Select - 分岐)
  • TSEL (Select/tail - SELのtail版)

SELとTSELはifの実装に使われる。
TSELはTAP同様、VM状態をDumpレジスタに保存しない。

VM制御

  • SAVE
  • EXEC
  • STOP

これらは通常のプログラムでは生成されない。