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版)