Next: 述語呼び出しの実現
Up: コンパイルドコード
Previous: コンパイルドコード
出力コードの原則として、モジュール全体の構造について解説する。
- 1モジュール、1関数。
- アトムID、ファンクタについては別ファイル(各々atom.h, funct.h)に
(少なくとも)リンク対象となるモジュールに含まれるもの、
KLICの実行可能ライブラリで利用されているものが全て記述され、
それをincludeする。
- コードは以下の様な順で記述されている。
- 1.
- ヘッダのinclude。常に固定して、runtime/klic/klichdr.h,
runtime/atom.h,runtime/funct.hがincludeされる。
- 2.
- 出力対象となるモジュール関数のforward宣言がなされる。
これはこの直後にて、必要なデータを出力するための措置である。
モジュール関数のCレベルの名称は規則的にエンコードされるが、その規則については、
第3.4.2章 (
ページ)を参照のこと。
- 3.
- 当該モジュールで定義されている述語の全述語構造体が
大域変数の形で出力される。
述語構造体のCレベルの名称は規則的にエンコードされるが、その規則については、
第3.4.2章 (
ページ)を参照のこと。
- 4.
- この後、モジュール関数が出力される。
- (a)
- モジュール関数の関数宣言がなされる。
- (b)
- 最初に、「定数の構造体」のデータ構造が出力される。
詳細は第3.4.2章 (
ページ)参照のこと。
- (c)
- その直後に、KL1で記述された内容を実行するCのコードが出力される。
このコードは概要としては以下のような構造になっている。
- まず、引数レジスタを模す、a0, a1といった変数が確保される。
この変数は必要な分(すなわち、当該モジュール中の述語の最大引数数)
だけ確保される。
- switch_on_pred なるマクロにより、述語間のdispatchを行うコードが
出力される。
- 以降に各述語を実現するコードが出力される。
- 末尾(ラベルinterrupt_N 以降)に、モジュール関数を抜ける時の処理
が出力される。「モジュール関数を抜けるとき」原因には、
他のモジュールの述語の呼び出しの発生、割り込みや、メモリ不足(を解消のため
GCを行う)などがある。
以上の説明の内容を、後述する例の出力コード図3.5全体を簡略化
したコードにより図3.1に示す。
Figure 3.1:
「モジュール」の構成
 |
Sekita Daigo
1998-05-18