KH-FDPL に関するメモ-0003
基本方針
- どうせメモなので、気にせずどんどん書く。後で整理すればいい。
いろいろと整理
- 基本オブジェクト:
- 0: 32ビット整数オブジェクト
- 1: 倍精度浮動小数点オブジェクト
- 2: 可変長バイト列オブジェクト
- 3: DB型オブジェクト
- 4: 単純一次元配列オブジェクト(可変長)
- 5: 実行可能バイトコードオブジェクト(実体は2に準ずる)
- 中身の生データを自由にはアクセスできない。専用の関数などでアクセスする。
- 6: 各種ハンドル・ポインタ類(分岐先アドレスなど)
- 中身の生データを自由にはアクセスできない。専用の関数などでアクセスする。
上位言語の仕様のメモ
- 明示しない限り整数オブジェクトは生成されない。基本的に倍精度浮動小数点。
- 通常の代入は、同じ型の実体を作った後に内容をcopyする。
- もしすでに実体があって、それに上書きするときは、同型の場合は実体の作り直しはしないで、内容のcopyだけをする。
最下部バイトコード仕様
- 基本的にレジスタマシン。スタックマシンはもうやめた(バイトコード化によってパラメータのパースをケチる必要が無くなったので)。
- レジスタはまあ32本もあれば十分だろう。本当は16本でも十分だろうと思うけど、用途の固定されているものもあるし、まあ余裕として。
- レジスタは原則としてオブジェクトを指す。差していたオブジェクトが無くなってしまう場合も想定の範囲内なので、アクセスのたびにチェックが入る。レジスタがnullになることもある。
- 用途が固定されているレジスタ
- エラー報告用整数オブジェクト
- アクセス権管理オブジェクト
- 名前解決用のスコープオブジェクト
- 00: NOP
- 01: オブジェクトの生成: [01 typ reg]: typに80をORすると、最初からretainされる。
- 02: オブジェクトのretain: [02 reg mod]: modが1だと子供もすべてretainされる。
- 03: オブジェクトのrelease: [03 reg mod]: modが1だと子供もすべてreleaseされる。
- 04: 定数のロード:[05 reg mod imm]
- 05: 要素検索: [05 reg(obj) mod reg(key) reg(out:value)]
- 06: 要素の追加: [06 reg(obj) mod reg(key) reg(value)]: modが1だとkeyとvalueをretainする(keyがreatinされるかどうかはルールがある)。
- 07: 要素の削除: [07 reg(obj) mod reg(key)]: modが1だとkeyとvalueをreleaseする。
- 08: 値のコピー: [08 reg(in) mod reg(out)]: modが80だと子供はreatinされた状態で作られる。
- コピーとは、inをいじってもoutが改変されない状態であることを指す。
- 09: 値のリンク: [09 reg(in) mod reg(out)]
- リンクとは、inをいじった時にoutにも影響される状態である。
- 0a: ラベル設定: [0a label mod]: ラベルオブジェクトが作られるが前方参照も可能。
- 0b: ラベル定数のロード: [0b label reg]
- 0c: 条件分岐: [0c reg(cond) mod label/reg]: mod=1なら間接jmpになる。
- 0d: エラーレジスタへの定数設定: [0d index imm]
- 0e: releasePoolのopen
- 0f: releasePoolのclose
- 残り:
- 各種の演算
- 名前設定
- 名前削除
- 名前解決: [0c reg(name)
こめんと欄