Chapter 6. 動的ロード (dynload)

ATS では、動的ロード (もしくは dynload と略します) はロードされたパッケージの初期化を表わします。

次のようなコードを含むファイル foo.dats を想定します:

// val x = 1000 val y = x + x // = 2000 val z = y * y // = 4000000 // extern fun sum_x_y_z (): int // implement sum_x_y_z () = x + y + z //

関数 sum_x_y_z の呼び出しが評価される前に、x, y, z の名前にはなんらかの値が束縛されていることは明確です。このような束縛を生成するために、なんらかの初期化が必要になります。さらに、次のコードを含むファイル foo2.dats を想定してみましょう:

staload "./foo.dats" dynload "./foo.dats" // for initialization implement main0 () = { val () = assertloc (4003000 = sum_x_y_z()) } (* end of [main0] *)

これで次のコマンドによって実行ファイル mytest を生成できます:


atscc -o mytest foo.dats foo2.dats

atsccpatscc と読み替える必要があるかもしれないことに、注意してください。

キーワード dynload で始まる行は dynload 宣言と呼ばれます。 foo2.dats ファイルからこの宣言を削除すると、上記のコマンドによって文字列 __dynloadflag で終わるある名前の変数に対する未定義参照のリンク時エラーが発生します。foo.dats に対する dynload 宣言はこの特殊な変数を導入し、それから foo.dats に関連する初期化を実行するための特別な関数呼び出しを生成します。この特殊関数は (foo.dats に対する) dynload 関数と呼ばれます。この関数は常に冪等です。

また foo2.dats に対して生成された dynload 関数もあります。特殊な関数 main の一種である main0 関数が foo2.dats で実装されているので、foo2.dats に対する dynload 関数は main 関数の本体中から自動的に呼び出されます。

もし dynload 関数の生成を抑制する理由があるのであれば、ATS_DYNLOADFLAG フラグを 0 に設定することができます。例えば、次の行を foo.dats に追加すれば、foo.dats に対する dynload 関数は生成されません:

#define ATS_DYNLOADFLAG 0

もちろん、foo.dats に対する適切な初期化を行なわないということは、sum_x_y_z が呼び出されると結果は誤った結果になることを意味しています。

foo2.dats に対する dynload 関数を明示的に呼び出したい場合には、dynload 関数に別名を付けて、その別名の関数を呼び出すことができます。例えば、foo2.dats に次の行を追加すると:

#define ATS_DYNLOADNAME "foo2_dynload"

このとき foo2.dats に対する dynload 関数には foo2_dynload という別名が与えられます。

この章のコード全体は オンライン から入手できます。