cellは64bit(今回はあまり考えない?)
definitionの詳細はSection 6.2
The dictionary is a linked list.
Linked listの構造は実装依存。複数あるかもしれない(6.6)
re-entrant
space, backspace, carriage retrun以外は名前として使える。
- head
- link
- name
- locate where this word is defined in source code.
- control bits (type and use of definition)
- precedence bits, IMMEDIATE による優先順位 コンパイル時にセットされる
- smudge bit コロン定義中にコンパイラによってセットされ、セミコロンで解除される 循環参照を避ける?
- body
- code field(関数ポインタとか、ソースそのままとか)
- parameter field (実行時に必要になるデータへの参照 variableの値とかが入る)
topへのポインタとbottomへのポインタを管理。bottomはアンダーフローの検出やスタックのクリアなど。
return stack
- holds return address for nested definitions.
- holds loop parameters
- other system temp
気をつけて使おう。
入力はエンターを待ってparseされる?
- スペースをとばしてwordを読み込む
- dictionaryでwordを検索
- interpretation modeであればinterpretation behaviorを実行
- compiling modeであればcompilation behaviorを実行
スタックアンダーフローのチェック - 平気なら1へ
- 駄目ならabort
- wordがdictionaryに無い
- 数字に変換できれば(interpretation modeなら)スタックに
- compiling modeでは 実行時にその数字をstackに積む code をcompile(LITERALの定義を見てごらん)
- 1へ
- 辞書にもない、数字でもない。 → abort
データスタックとリターンスタックをもつ 命令列中のポインタ(Instruction pointer)
dictionaryは連想リスト
2015/03/27
ForthVMについての知識が不足しており実装が爆発してしまった。 本を読もう。