プログラムロード




\begin{emtabbing}
{\bf load}
\it fname \&key \= :verbose \hspace{20mm} \= *load...
...
\> :symbol-output \> ''a.out'' \\
\> :ld-option \> ''''
\rm
\end{emtabbing}

loadはソースファイルあるいはコンパイルされたオブジェクトファイル をEuslispに読み込むための関数である。 もし、fnameで指定されたファイルが存在するとき、 Euslispはロードする。 そのファイルがソースとバイナリーの内どちらかは、magic numberを見ることにより 自動的にチェックされる。 もし、そのファイルが存在しないが'.o'の型のファイルが存在する場合、 そのファイルをオブジェクトファイルとしてロードする。 その他、'.l'のファイルが見つかったならば、ソースプログラムとしてロードする。 もし、ファイル名の最初に"/"を付ける絶対パスを指定していない場合、 loadは、グローバル変数*load-path*に指定されているディレクトリ の中からファイルを検索する。 例えば、*load-path*("/user/eus/" "/usr/lisp/")であり、 fnameとして"llib/math"が与えられたとき、 load"/user/eus/llib/math.o", "/usr/lisp/llib/math.o", "/user/eus/llib/math.l", "/usr/lisp/llib/math.l"をこの順番に捜す。 適当なファイルが見つからなければ、エラーを返す。

:entryオプションは、ロードモジュールを初期化する入力アドレスを 指定する。 たとえば、:entry "_myfunc"オプションは_myfuncから実行を始める ことを意味する。 デフォルト入力アドレスは、[*]節に記述されているように ロードされたファイル名のbasenameである。 ライブラリモジュール名は:ld-optionオプション文字列の中に指定 することができる。 たとえば、suncoreライブラリを使用するモジュールをリンクするために、 :ld-optionには "-lsuncore -lsunwindow -lpixrect -lm -lc" を与える必要がある。Solarisシステム以外では、 ライブラリがリンクされるときldは2度実行される。 1度はサイズを決定するため、2度目は固有のメモリーに実際にリンクするため。

:symbol-input:symbol-outputオプションはあるオブジェクト モジュールから他のモジュールへの参照を解決するため、あるいは ライブラリーの2重ロードを避けるために使用される。 A,B2つのオブジェクトモジュールがあり,BがAの中で定義されているsymbolを 参照しているとする。 :symbol-output ="a.out"を指定してモジュールAをロードする。 このリンクによって生成されたsymbol情報は、a.outに書き込まれる。 モジュールBをロードするためには、BからAへの参照を解決する :symbol-input = "a.out"を指定しなければならない。



Solaris2 OSにおいて、コンパイルコードのロードは、動的ロードライブラリの中の dlopenを呼び出すことにより実行している。 dlopenの使用は、共有オブジェクトに制限されている。 そのオブジェクトは、位置に依存するようにコンパイルされるために、 "-K pic"オプションを指定する。 また、dlopenは同じファイルを2度オープンすることができないので、 既にロードされているファイルに関しては、dlcloseを最初に 実行する。

load-files &rest files [関数]

:verboseにTを設定し、 filesを連続的にロードする。


*modules* [変数]

これまでにロードされたモジュールの名前の リストを持つ。


provide module-name [関数]
module-nameをすでにロードされた モジュールの名前として*modules*の中に加える。 module-nameはsymbolあるいは文字列でなければならない。 requireの呼び出しは、完全なモジュールを構成するファイルの最初に 存在しなければならない。


require module-name &optional file [関数]
*modules*の中にmodule-nameが見つからなかったとき fileをロードする。 providerequireは、モジュールの中の依存を制御し、 基本モジュールの2重ロードを避けるために使用される。 1つの基本モジュール"A"と2つの応用モジュール"B"と"C"があったとし、 "B"と"C"は互いに依存しないが"A"に依存しているとする。 それぞれのファイルの最初にprovideでモジュール名を宣言する。 "A"モジュールがどのモジュールにも依存していないなら、なにもrequire しなくてよい。 "B"や"C"の中のprovide呼び出しに続いて(require "A" "a.o")が 実行される。 もし"B"をロードするとき、*modules*の中に"A"が見つからなければ "a.o"もロードし、*modules*に"A"と"B"のモジュール名を追加する。 その後、もし"C"がロードされるなら、"A"モジュールはロードされず、"C"が *modules*に追加されるのみである。



\begin{emtabbing}
{\bf system:binload}
\it opath qpath \&optional \=
(entry (pa...
.../bin/eus'') \\
\> (symout ''a.out'') \\
\> (ldopt '''')\\
\rm
\end{emtabbing}

バイナリファイルをロードしリンクする。


system:txtload fname [関数]



2016-04-05