## Tcl9.0.3/Tk9.0.3 Documentation > Tcl Commands > load

### Tcl/Tk Applications | Tcl Commands | Tk Commands | [incr Tcl] Package Commands | SQLite3 Package Commands | TDBC Package Commands | tdbc::mysql Package Commands | tdbc::odbc Package Commands | tdbc::postgres Package Commands | tdbc::sqlite3 Package Commands | Thread Package Commands | Tcl C API | Tk C API | [incr Tcl] Package C API | TDBC Package C API

### NAME

load — 機械語命令を積込み､新命令を初期化する Load machine code and initialize new commands

### 構文 SYNOPSIS

load ?-global? ?-lazy? ?--? fileName
load ?-global? ?-lazy? ?--? fileName prefix
load ?-global? ?-lazy? ?--? fileName prefix interp

### DESCRIPTION

この命令はファイルから応用譜の番地空間に二進符号を積込み､解釈実行機能内に組込む為に､外部函数の初期化手続き函数を呼出す｡ fileName はその符号命令を含んでいるファイル名であり; その正確な形式は系毎に変化しているが､ Windows では DLL ､ ソラリス銘柄では .so ファイルの様に､殆どの系では共有外部函数群である｡prefix は初期化手続函数の名前の算出に使用される｡interp は解釈実行機能の経路名で､その中に､外部函数を積込む(詳細は interp 取扱い説明書を参照されたい); interp が省略されると､無為設定として､そこで load 命令が起動された解釈実行機能になる｡ This command loads binary code from a file into the application's address space and calls an initialization procedure in the library to incorporate it into an interpreter. fileName is the name of the file containing the code; its exact form varies from system to system but on most systems it is a shared library, such as a .so file under Solaris or a DLL under Windows. prefix is used to compute the name of an initialization procedure. interp is the path name of the interpreter into which to load the library (see the interp manual entry for details); if interp is omitted, it defaults to the interpreter in which the load command was invoked.

ひとたびファイルが応用譜の番地空間に積込まれると､二つの初期化手続函数の内の一つが新しい命令内で起動される｡典型的には､その初期化手続函数は新しい命令をTcl 解釈実行機能に追加する｡初期化手続函数の名前は prefix と目標の解釈実行機能が安全か否かとで確定する｡ 通常の解釈実行機能に関しては､初期化手続函数の名前は､pfx_Init の形式を有す｡ 譬えば､ prefix が Foo の場合､初期化手続函数の名前は Foo_InitR になる｡ [訳註:8.6版に少し丁寧な説明がある｡] 　 Once the file has been loaded into the application's address space, one of two initialization procedures will be invoked in the new code. Typically the initialization procedure will add new commands to a Tcl interpreter. The name of the initialization procedure is determined by prefix and whether or not the target interpreter is a safe one. For normal interpreters the name of the initialization procedure will have the form prefix_Init. For example, if prefix is Foo, the initialization procedure's name will be Foo_Init.

もし､目標の解釈実行機能が安全な解釈実行機能の場合､初期化手続函数の名前は､prefix_Init ではなく､prefix_SafeInit になる｡ prefix_SafeInit 函数は､信頼できない符号命令による使用には部分的な機能が提供される安全な解釈実行機能のみを初期化するよう注意深く書かれなければならない｡安全な-Tcl に関する更なる情報は安全取扱い説明書項目を参照されたい｡ If the target interpreter is a safe interpreter, then the name of the initialization procedure will be prefix_SafeInit instead of prefix_Init. The prefix_SafeInit function should be written carefully, so that it initializes the safe interpreter only with partial functionality provided by the library that is safe for use by untrusted code. For more information on Safe-Tcl, see the safe manual entry.

初期化手続函数は次の模範に合致しなければならない: 　 The initialization procedure must match the following prototype:

    typedef int Tcl_LibraryInitProc(
            Tcl_Interp *interp);

interp 引数は､外部函数が積込まれる解釈実行機能を識別する｡初期化手続函数は､成功裡に完了したか否かを示す TCL_OK 又は TCL_ERROR を返さねばならない; 不具合の行事中には不具合伝達文を指す為に解釈実行機能の結果を設定するべきである｡この load 命令の結果は､初期化手続函数から返されることになる｡ 　 The interp argument identifies the interpreter in which the library is to be loaded. The initialization procedure must return TCL_OK or TCL_ERROR to indicate whether or not it completed successfully; in the event of an error it should set the interpreter's result to point to an error message. The result of the load command will be the result returned by the initialization procedure.

実際のファイル積込みは応用譜の中のそれぞれの fileName につき一度だけ行われる｡もし､与えられた fileName が複数の解釈実行機能に積込まれると､初めの load は機械語命令を積込み初期化手続函数を呼出す; それに引続く load は機械語命令を再び積込むことなく初期化手続函数を呼出す｡Tcl の版番号が 8.5 より若いと､外部函数の積込み解除や再積込みはできない｡しかし､8.5版からは､ unload 命令が load 命令を使って積込んだ外部函数群を取除くことを許容している､外部函数群にとって､Tclの取外し機構は周知されている｡ 　 The actual loading of a file will only be done once for each fileName in an application. If a given fileName is loaded into multiple interpreters, then the first load will load the code and call the initialization procedure; subsequent loads will call the initialization procedure without loading the code again. For Tcl versions lower than 8.5, it is not possible to unload or reload a library. From version 8.5 however, the unload command allows the unloading of libraries loaded with load, for libraries that are aware of the Tcl's unloading mechanism.

もし､この様な外部函数が､ Tcl_StaticLibrary 手続函数の呼出によって既に登録されていると､この load 命令は静的に応用譜と連結した外部函数にも対応している｡もし､ fileName が空文字列であると､ prefix が指定されなければならない｡ The load command also supports libraries that are statically linked with the application, if those libraries have been registered by calling the Tcl_StaticLibrary procedure. If fileName is an empty string, then prefix must be specified.

もし､ prefix が省略されているか､空文字列が指定されていると､Tcl は､ fileNameの最後の要素を剥ぎ､最初の三文字がlibならそれを剥ぎ､次の四文字がtcl9ならそれを剥ぎ､次の数字以外のどの様な文字でもそれを使い､前置辞として先頭文字を大文字に変換して､前置辞の推測を試みる｡ 譬えば､命令 load libxyz4.2.so は prefix の Xyz を使い､命令 load bin/last.so {} は prefix の Last を使う｡ If prefix is omitted or specified as an empty string, Tcl tries to guess the prefix by taking the last element of fileName, strip off the first three characters if they are lib, then strip off the next four characters if they are tcl9, and use any following wordchars but not digits, converted to titlecase as the prefix. For example, the command load libxyz4.2.so uses the prefix Xyz and the command load bin/last.so {} uses the prefix Last.

もし､fileNameが空文字列であると､prefixが指定されねばならない｡ 本load命令は最初に､静的に積込まれた外部函数(Tcl_StaticLibrary手続函数の呼出しによって登録された)をその名前で捜す; もし見つかると､それが使われる｡それ以外の場合､本loadめいれいは､その名前で､道的に積込まれた外部函数を捜し､見付けるとそれを使う｡もし､幾つかのファイルが､異なる外部函数の版で積込まれていると､Tcl は最初に積込まれたファイルを拾う｡ If fileName is an empty string, then prefix must be specified. The load command first searches for a statically loaded library (one that has been registered by calling the Tcl_StaticLibrary procedure) by that name; if one is found, it is used. Otherwise, the load command searches for a dynamically loaded library by that name, and uses it if it is found. If several different files have been loaded with different versions of the library, Tcl picks the file that was loaded first.

-global がファイル名の前に指定されていると､共有外部函数内に現れる全ての記号は他の外部函数によって大域使用として移送される｡ -lazy 指示項目は実際の記号の積込みを最初の実使用まで遅らせる｡指示項目は短縮表記できる｡指示項目 -- は指示項目の末尾を指し示し､ - で始まるファイル名を使いたい時に使われるべきで､ prefix を load 命令に伝えることができる｡ If -global is specified preceding the filename, all symbols found in the shared library are exported for global use by other libraries. The option -lazy delays the actual loading of symbols until their first actual use. The options may be abbreviated. The option -- indicates the end of the options, and should be used if you wish to use a filename which starts with - and you provide a prefix to the load command.

-global や -lazy 指示項目に対応していないOSでは､指示項目は依然存在しているが効果を有さない｡註意すべきは -global や -lazy 指示項目の使用は後に応用譜を崩壊に導くかもしれない(記号が対応する失われた記号と衝突する場合)､それは load の間には検出ができない｡そこで､これを使用する場合､何をしているかをわきまえないと､積込んだ外部函数が何か悪い時に､気の利いた不都合伝言文を得られない｡ On platforms which do not support the -global or -lazy options, the options still exist but have no effect. Note that use of the -global or -lazy option may lead to crashes in your application later (in case of symbol conflicts resp. missing symbols), which cannot be detected during the load. So, only use this when you know what you are doing, you will not get a nice error message when something is wrong with the loaded library.

### 互換性の問題　PORTABILITY ISSUES

Windows
  積込が “library not found(外部函数群が見付らない)” 不具合と共に失敗したときは､それに依存する外部函数群も見付からない可能性がある｡依存している外部函数群を見るには､Dos黒窓から “dumpbin -imports <dllname>” を打込み､持込む必要のある外部函数群を見る｡現在のディレクトリーの中にDLL を積込む時に､ Windows は経路の指定符号としての “./” を無視し､DLLを見付ける代わりに安呆なことばかりする｡これを回避して､DLLを積込むにはこうする: When a load fails with “library not found” error, it is also possible that a dependent library was not found. To see the dependent libraries, type “dumpbin -imports <dllname>” in a DOS console to see what the library must import. When loading a DLL in the current directory, Windows will ignore “./” as a path specifier and use a search heuristic to find the DLL instead. To avoid this, load the DLL with:

      load [file join [pwd] mylib.DLL]

### 瑕疵 BUGS

もし､同一ファイルが異なる fileName で積込まれると､それは､手順の番地空間に複数回積込まれる｡この振舞いは系毎に異なっている(ある系では､過剰な積込みを検知するが､他ではそうしない) If the same file is loaded by different fileNames, it will be loaded into the process's address space multiple times. The behavior of this varies from system to system (some systems may detect the redundant loads, others may not).

### EXAMPLE

次は最小の拡張である: The following is a minimal extension:

    #include <tcl.h>
    #include <stdio.h>
    static int fooCmd(void *clientData,
            Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) {
        printf("called with %d arguments\n", objc);
        return TCL_OK;
    }
    int Foo_Init(Tcl_Interp *interp) {
        if (Tcl_InitStubs(interp, "8.1", 0) == NULL) {
    	return TCL_ERROR;
        }
        printf("creating foo command");
        Tcl_CreateObjCommand(interp, "foo", fooCmd, NULL, NULL);
        return TCL_OK;
    }

共有/動的な外部函数群を適切な名前(譬えば､Windows では foo.dll ､Solaris と Linuxでは libfoo.so)で組み込んだ時､それはTclに次の様に積み込まれるかもしれない: When built into a shared/dynamic library with a suitable name (e.g. foo.dll on Windows, libfoo.so on Solaris and Linux) it can then be loaded into Tcl with the following:

    # 拡張の積込み # Load the extension
    switch $tcl_platform(platform) {
        windows {
            load [file join [pwd] foo.dll]
        }
        unix {
            load [file join [pwd] libfoo[info sharedlibextension]]
        }
    }

    # これ以降は拡張により定義された命令が実行できる
    # Now execute the command defined by the extension
    foo

### SEE ALSO

info sharedlibextension, package, Tcl_StaticLibrary, safe

### KEYWORDS

binary code, dynamic library, load, safe interpreter, shared library
Copyright © 1995-1996 Sun Microsystems, Inc.