| ffidl-full.tar.gz 命令その他Commands, et al. ::ffidl::callout ::ffidl::callback ::ffidl::symbol ::ffidl::stubsymbol ::ffidl::typedef ::ffidl::info ffidl_pointer_pun ::ffidl::find-lib ::ffidl::find-type 型 Types 搭載 Install 例示 Demos 出来栄え Performance 懸案事項 Issues 賞賛 Credits ::dll libffi ffcall 著作権表示 Copyright 免許 License 無保証 No Warranty |  | Ffidl 0.6版 Ffidl Version 0.6 Ffidl は純 Tcl 記述譜を使用して C 函数を呼ぶことを許容する｡使用者が函数の名前､外部関数､引数の型のリスト､返り値の型を指定すると､使用者の為に Tcl 命令呼出しから C 函数呼出しへの変換の不快な詳細に気を配る｡そこで､使用者に共有外部函数と外部函数の全体の仕様がある場合､使用者は Ffidl と純 Tcl を使って外部函数を Tcl 拡張に組入れられる｡ Ffidl allows you to call C functions using pure Tcl wrappers. You specify a function name, a library, a list of argument types, and a return type, and Ffidl takes care of the nasty details of converting a Tcl command call into a C function call for you. So, if you have a shared library and a specification of the entries in the library, you can wrap the library into a Tcl extension with Ffidl and pure Tcl. Ffidl 0.6 は次の変更がある(0.5 から)｡ Ffidl 0.6 has the following changes (since 0.5): libffi & ffcallの2005版に関する更新　updates for 2005 versions of libffi & ffcall TEA 3.2 buildsystem Tcl 8.4､ Tcl_WideInt､TclpDlopen の運営　　support for Tcl 8.4, Tcl_WideInt, TclpDlopen POWERPC_DARWIN の運営　　support for POWERPC_DARWIN SIZEOF_LONG==8 && SIZEOF_INT==4 の64ビット集積回路の為の問題解決　 fixes for 64bit processors with SIZEOF_LONG==8 && SIZEOF_INT==4 callouts と callbacks は現在の名前空間に関連して 生成/使用 される(非修飾名称について)　　 callouts & callbacks are created/used relative to current namespace (for unqualified names) stubs表経由の Tcl/Tk 記号決定のための ::ffidl::stubsymbol の追加　 addition of ::ffidl::stubsymbol for Tcl/Tk symbol resolution via stubs tables callbacks は callouts 内部から以外でも何時でも呼出し可能になった(不都合伝達には Tcl_BackgroundError を使う)　　 callbacks can be called anytime, not just from inside callouts (using Tcl_BackgroundError to report errors) この 0.6 変更は Daniel A. Steffen によって実装された､これに関する援助の為に元のFfidl 著者に連絡をとってはならない｡　 The 0.6 changes were implemented by Daniel A. Steffen, do not contact the original Ffidl author for support about them. Ffidl は ､ Tcl から C 函数への呼出しの動的構築と､ C 函数から Tcl 内部への呼出しの動的構築の為に､ gcc CVS からの最新の libffi-2.00-beta を使用する｡　 gcj が利用可能な(使用している)全てのOS上でgcc libffi が稼動する｡ Ffidl uses the latest libffi-2.00-beta from gcc CVS to dynamically construct calls to C functions from Tcl, to dynamically construct calls from C functions into Tcl. gcc libffi runs on all platforms where gcj is available (which uses it). Ffidl はGPL 化された異種外部函数梱包のffcall-1.10 を使う為に構成設定可能である､後者は次の所で callouts と callbacks の両方が実装されている｡ Ffidl can also be configured (--enable-ffcall) to use ffcall-1.10 a GPL'ed foreign function package which implements both callouts and callbacks on: i486-unknown-linux (gcc) i386-unknown-sysv4.0 (gcc, /usr/bin/cc, /usr/ucb/cc) i386-pc-solaris2.6 (gcc) i486-unknown-sco3.2v4.2 (gcc, cc -Of) i486-unknown-os2emx (gcc), i386-pc-cygwin32 (gcc) i386-pc-win32 (msvc4, msvc5) m68k-next-nextstep3 (cc), m68k-sun-sunos4.0 (cc) m68k-unknown-linux (gcc) mips-sgi-irix4.0.5 (gcc, cc -ansi, cc -D__STDC__, cc -cckr) mips-sgi-irix5.2 (gcc, cc -ansi, cc -D__STDC__, cc -cckr) mips-sgi-irix5.3 (gcc, cc -ansi, cc -D__STDC__, cc -cckr) mips-sgi-irix6.2 (cc -32), mips-sgi-irix6.4 (cc -32, cc -n32, cc -64) mips-sgi-irix6.5 (cc -n32 is broken, gcc works) sparc-sun-sunos4.1.1 (gcc, cc) sparc-sun-solaris2.3 (gcc) sparc-sun-solaris2.4 (gcc, cc) alpha-dec-osf3.0 (gcc, cc) alpha-dec-osf4.0 (gcc, cc) hppa1.0-hp-hpux8.00 (gcc, cc) hppa1.1-hp-hpux9.05 (cc), hppa1.1-hp-hpux10.01 (cc) hppa2.0-hp-hpux10.20 (cc +DA1.1) arm -- untested rs6000-ibm-aix3.2.5 (gcc, c89, xlc) powerpc-ibm-aix4.1.4.0 (cc) powerpc-unknown-linux (gcc) powerpc-apple-darwin6.8 (gcc) m88k -- untested convex -- untested ia64-unknown-linux (gcc) 86_64-suse-linux (gcc) Ffidl は 動的外部函数群を積込む為と､函数の場所を発見する為に Tcl の TclpDlopen() と TclpFindSymbol() を使用する Ffidl uses Tcl's TclpDlopen() and TclpFindSymbol(), to load dynamic libraries and discover the locations of functions. Ffidlはどの様な系上の､stub可能なTcl とも､libffi や ffcall の運営とも､libdl 実装とも実行可能である｡ Ffidl should be able to run on any system with a stubs enabled Tcl, libffi or ffcall support, and a libdl implementation. Ffidl 0.6 は仮出版である｡使用者が現在の出版内で自身で取り掛かる必要がある詳細の構成設定がある｡ 最初の開発がlinux-x86 の元のlibffi 内の不具合を掘り起こした､そこで､使用者は他の構造でも同じ問題に注意すべきである｡ 猶も解決されるべき開示された設計上の問題があるので､そこで将来の出版内の対話機能は変化があるかもしれない｡ Ffidl 0.6 is an alpha release. There are configuration details which you will need to attend to by hand in the current release. The initial development turned up a few bugs in libffi under linux-x86, so users on other architectures should be alert for similar problems. There are several open design issues still to be resolved, so there may be changes in the interfaces in future releases. 実装が､libffi によって運営される全ての構造上で稼動する事を､証明する為に補助者が必要である､又､開示された設計の問題は何かの討論を使うかもしれない｡ Assistance is needed to verify that the implementation works on all the architectures supported by libffi, and the open design issues could use some discussion. 命令､函数､手続き函数 Commands, Functions, and Procs FfidlはFfidl梱包内に６つのTcl命令を定義する: ::ffidl::callout と ::ffidl::callback と ::ffidl::symbol と ::ffidl::stubsymbol と ::ffidl::typedef と ::ffidl::info ; 又､Ffidl 共有外部函数から一つの函数を移入する｡: ffidl_pointer_pun; 　 又 demos/ffidlrt.tcl内の Ffidlrt 梱包内に二つの補助手続き函数を定義する ::ffidl::find-lib と ::ffidl::find-type それは現在､その真の書式のstub である｡ Ffidl defines six Tcl commands in the Ffidl package: ::ffidl::callout, ::ffidl::callback, ::ffidl::symbol, ::ffidl::stubsymbol, ::ffidl::typedef, and ::ffidl::info; exports one function from the Ffidl shared library: ffidl_pointer_pun; and defines two helper procs in the Ffidlrt package in demos/ffidlrt.tcl: ::ffidl::find-lib, and ::ffidl::find-type, which are currently just stubs of their true form. これらの対話機能は改版の対象と看做されている｡ These interfaces should be considered subject to revision. ::ffidl::callout name {?arg_type1 ...?} return_type address ?protocol? ::ffidl::calloutは指定されたnameを伴う Tcl 命令を定義し､それは､ 起動された時､その引数を指定されたarg_typesに従って変換し､ 指定されたaddressにある函数を呼出し､ 指定されたreturn_typeを Tcl 結果に変換する｡ 許容される型は下に記述する｡ ::ffidl::callout defines a Tcl command with the specified name which, when invoked, converts its arguments according to the arg_types specified, calls the function at the specified address, and converts the specified return_type into a Tcl result. The allowed types are described below. protocolは使用される呼び出し変換を指定する｡ protocolsを運営しているOSはWindowsのみであり､ そこではprotocolはcdeclかstdcallであり､ 前者は省略時設定でもある｡ The protocol specifies a calling convention to be used. The only platform which supports protocols is Windows where protocol may be cdecl, which is the default, or stdcall. ::ffidl::callback name {?arg_type1 ...?} return_type ?protocol? ::ffidl::callback は､ 指定された name を伴う Tcl の手続函数を定義し､ それは､ C 命令から呼戻しとして起動される｡ 起動された時､引数は指定されたarg_types に従ってTcl 値に変換され､ nameに渡される､nameからの戻り値は指定された return_typeに 従って戻され値は呼出し元に戻される｡ 許容される型は下に記述する｡ ::ffidl::callback declares that a Tcl proc with the specified name will be invoked as a callback from C code. When invoked the arguments will be converted to Tcl values according to the arg_types specified, passed to name, the return value from name will be converted back into the specified return_type, and the value will be returned to the caller. The allowed types are described below. このprotocolは使用される呼出し変換を指定する｡ protocolsを運営しているOSはWindows だけであり､此処でprotocolは無為設定のcdecl かstdcall だけである｡ The protocol specifies a calling convention to be used. The only platform which supports protocols is Windows where protocol may be cdecl, which is the default, or stdcall. ::ffidl::symbol library symbol ::ffidl::symbolは必要に応じ､libraryと謂う名前の動的連結函数を積込み､ その函数からsymbolの番地を持帰る｡ 利用できるsymbolsの種類は､動的積込みの実装により変動する｡ ::ffidl::symbol loads, if necessary, a dynamically linked library of name library and fetches the loaded address of symbol from the library. The kinds of symbols available vary with the implementation of dynamic loading. ::ffidl::stubsymbol library stubstable symbolnumber ::ffidl::stubsymbol は library のstub 表stubstable 内のsymbolnumber により参照された名前の番地を返す｡ ::ffidl::stubsymbol returns the address of the symbol indexed by symbolnumber in the library's stubs table stubstable. library はtclかtk の内の一つであり､stubstable はstubs か intStubs か intStubs か intPlatStubs か intXLibStubs の内の一つである｡ library can be one of tcl or tk and stubstable can be one of stubs, intStubs, intStubs, intPlatStubs or intXLibStubs. ::ffidl::typedef name type1 ?...? ::ffidl::typedef は新しい Ffidl 型名を定義する｡ これは実在する型の為の単純なショートカットであるか､ 集積構造を形成する型のリストのどちらかである｡ 値により構造を渡す為､または値により構造を持帰る為には､ その為の ::ffidl::typedef を作成しなければならない｡ しかし､構造を参照により渡すか受取るだけの場合､ ::ffidl::info 上へのformat, sizeof, alignof追加指定を使用する為に構造を定義したくなるかもしれない｡ ::ffidl::typedef defines a new Ffidl type name. This may be either a simple alias for an existing type, or a list of types which form a structured aggregate. To pass a structure by value or return a structure by value, you must make a ::ffidl::typedef for it. But even if you only pass or receive structures by reference, you might want to define a structure in order to use the format, sizeof, and alignof options of ::ffidl::info on it. ::ffidl::info option ?...? ::ffidl::info は種々の情報函数を実装する｡ ::ffidl::info implements a variety of information functions. ::ffidl::info alignof type typeの為の塊の並びを返す｡ returns the alignment modulus for type. ::ffidl::info callbacks ::ffidl::callback が宣言した名前のリストを返す｡　 returns a list of ::ffidl::callback declared names. ::ffidl::info callouts ::ffidl::callout が宣言した名前のリストを返す｡　 returns a list of ::ffidl::callout defined names. ::ffidl::info canonical-host autoconf による定義に沿って正統な識別用名称を返す｡ returns the canonical host name as determined by autoconf. ::ffidl::info format type type についてTcl binary format と binary scan 命令の様式で書式文字列を返す､その際､整数では正しい大きさ方向を遣い､ 構造では欄の端数切り上げに要求される余分を含む｡ returns a format string for type, in the style of the Tcl binary format and binary scan commands, using the correct endian format for integers and, for structures, including any pad bytes required for alignment of fields. ::ffidl::info have-int64 親機が 64 ビット整数を実装する時は真値を返す｡ returns true if the host implements a 64 bit integer. ::ffidl::info have-long-double 親機が"長倍精度"型を実装する時は真値を返す｡ returns true if the host implements the "long double" type. ::ffidl::info have-long-long 親機が"長長精度"型を実装する時は真値を返す｡ returns true if the host implements the "long long" type. ::ffidl::info interp Tcl解釈実行機能を整数として返す｡　 returns the current Tcl_Interp as an integer value. ::ffidl::info libraries ::ffidl::symbolによって開けられた外部函数群のリストを返す｡　 returns the list of libraries opened by ::ffidl::symbol. ::ffidl::info signatures ::ffidl::callout に使用された署名呼出し機能のリストを返す｡　 returns the list of function call signatures used by ::ffidl::callout. ::ffidl::info sizeof type typeの寸法を返す｡ returns the size of type. ::ffidl::info typedefs ::ffidl::typedefが定義した名前のリストを返す｡　 returns a list of ::ffidl::typedef defined names. ::ffidl::info use-callbacks 呼び戻しを使う為にFfidlが構成設定された場合真値を返す｡ returns true if Ffidl was configured to use callbacks. ::ffidl::info use-ffcall ffcallを使う為にFfidlが構成設定された場合真値を返す｡　 returns true if Ffidl was configured to use ffcall. ::ffidl::info use-libffi libffi を使う為にFfidlが構成設定された場合真値を返す｡　 returns true if Ffidl was configured to use libffi. ::ffidl::info use-libffi-raw libffi が固有の応用譜算譜対話機能を実装していれば真値を返す｡ returns true if libffi implements the raw api. EXTERN void *ffidl_pointer_pun(void *pointer); ffidl_pointer_pun は 指示子表現からFfidl 束縛として記号化される変換を許容する為にFfidl 共有外部函数から移送される｡ffidlrt.tcl内に幾つかの用例がある｡ ffidl_pointer_pun is exported from the Ffidl shared lib to allow conversions between pointer representations to be coded as Ffidl bindings. There are some examples in ffidlrt.tcl. ::ffidl::find-lib library ::ffidl::find-libは外部函数の為の従来の名前から､親系に適切な外部函数の為の経路名に変換する｡現在はffidlrt.tclの中で､表捜索として実装されていて､筆者のLinux 系に適切な型を返す｡ ::ffidl::find-lib converts a conventional name for a library into the path name for the library name appropriate to the host system. It is currently implemented in ffidlrt.tcl as a table lookup which returns the libraries appropriate to my Linux system. ::ffidl::find-type type ::ffidl::find-type はsize_t やsize_t の様な標準の型を親の系に適切な実際の型に変換する｡現在はffidlrt.tclの中で､表捜索として実装されていて､筆者のLinux 系に適切な型を返す｡ ::ffidl::find-type converts a standard types such as size_t and time_t into real types appropriate to the host system. It is currently implemented in ffidlrt.tcl as a table lookup which returns the types appropriate to my Linux system. 型　Types Ffidl 組込み型は寸法不定の形式とビット寸法明示の型の両方の単純 C 型､及び種々の指示子扱いを含む｡注意すべきは､幾つかの型は特定の文脈内のみで妥当である: 引数(arg) ､返り値(ret)､構造要素(elt) The Ffidl builtin types include the scalar C types in both their unsized forms and as explicitly bit sized types, and a variety of pointer treatments. Note that some types are only valid in certain contexts: arguments (arg), return (ret), or struct elements (elt). 組込みの型に加えて､::ffidl::typedef 命令は新しい型の定義に使用されることもある｡既存の型が使用されている箇所では既存の型の為の別名も使われてもよい｡構造化された集合は引数､返り値､他の構造の要素として使われることもある｡ In addition to the builtin types, the ::ffidl::typedef command may be used to define new types. Aliases for existing types may be used where ever the existing type may be used. Structured aggregates may be used as arguments, returns, or elements of other structures.
手続き函数 proc | 呼戻し callback | 要素 elt | 型 type | 型 definition
--- | --- | --- | --- | ---
引数 arg | 返値 ret | 引数 arg | 返値 ret
- | + | - | + | - | 空値 void | 空値 void
+ | + | + | + | + | 整数 int | 整数 int
+ | + | + | + | + | 符号無unsigned | 符号無整数 unsigned int
+ | + | + | + | + | 短整 short | 符号付短整数 signed short int
+ | + | + | + | + | 符号無短 unsigned short | 符号無短整数 unsigned short int
+ | + | + | + | + | 長 long | 符号付長整数 signed long int
+ | + | + | + | + | 符号無長 unsigned long | 符号無長整数 unsigned long int
+ | + | + | + | + | 浮動小数 float | 浮動小数 float
+ | + | + | + | + | 倍精度 double | 倍精度 double
+ | + | + | + | + | 長倍精度 long double | 長倍精度 long double
+ | + | + | + | + | 符号付8整 sint8 | 長倍精度 signed 8 bit int
+ | + | + | + | + | 符号無8整 uint8 | 符号無8ビット整数 unsigned 8 bit int
+ | + | + | + | + | 符号付16整 sint16 | 符号付16ビット整数 signed 16 bit int
+ | + | + | + | + | 符号無16整 uint16 | 符号無16ビット整数 unsigned 16 bit int
+ | + | + | + | + | 符号付32整 sint32 | 符号付32ビット整数 signed 32 bit int
+ | + | + | + | + | 符号無32整 uint32 | 符号無32ビット整数 unsigned 32 bit int
+ | + | + | + | + | 符号付64整 sint64 | 符号付64ビット整数 signed 64 bit int
+ | + | + | + | + | 符号無64整 uint64 | 符号無64ビット整数 unsigned 64 bit int
+ | + | + | + | + | 番地子 pointer | 整数値としての番地子 pointer as an integer value
+ | + | + | + | - | obj-番地子 pointer-obj | Tcl_Objからの番地子 pointer from Tcl_Obj
+ | + | + | - | - | utf8-番地子 pointer-utf8 | 文字列からの番地子 pointer from String
+ | + | + | - | - | utf16-番地子 pointer-utf16 | ユニコードからの番地子 pointer from Unicode
+ | - | - | - | - | バイト-番地子 pointer-byte | バイト配列からの番地子 pointer from ByteArray
+ | - | - | - | - | pointer-var | 変数に保存されたバイト配列からの指示子｡ バイト配列が共有されている場合､非共有の複写が生成され変数内に保存が戻される｡ pointer from ByteArray stored in variable. If the ByteArray is shared, then an unshared copy is made and stored back into the variable.
+ | - | - | - | - | pointer-proc | Tcl手続き函数を呼出す為に構築された函数呼び戻しへの指示子　 pointer to callback function constructed to call a Tcl proc.
搭載 Installation TEA 3.2 によって運営されているOS上での機械語翻訳は苦痛を伴わない筈である｡ Building on plaforms supported by TEA 3.2 should be painless. 実装は､どれか他の TEA 拡張と似ている､それは最低次のことから構成される｡ Installation is like for any other TEA extension, minimally it consists of:
    tar xzvf ffidl-full.tar.gz
    cd ffidl
    configure && make
libffi と ffcall の間の選択の為 (--enable-libffi and --enable-ffcall)と､呼戻しの除去( (--disable-callbacks) )の為と､ ffidl 試験函数を拡張の中に機械語翻訳可能にする (--enable-test)為に､誂え構成設定項目が実装される｡　 Custom configure options are implemented for selecting between libffi and ffcall (--enable-libffi and --enable-ffcall), for excluding callbacks (--disable-callbacks) and for enabling building of the ffidl test functions into the extension (--enable-test). 非Darwin Unix と Windows 上では library/ffidlrt.tcl を校正し ::ffidlrt::libs 内の外部函数の表と､::ffidlrt::types 内の型の表を捜すべきである｡ 使用者が更に先に進むには､恐らくこれらの表のどちらか又は両方に注意を払う必要がある｡ 譬えば､ gmp と gdbm に関して外部函数を見付けたり､機械語翻訳したり､実装したり､する必要があるかもしれず､外部函数や､libmや､tclや､ tk の経路名を調整する必要があるかもしれない｡ On non-Darwin Unix and on Windows you should edit library/ffidlrt.tcl and look at the table of libraries in ::ffidlrt::libs and the table of types in ::ffidlrt::types. Either or both of these tables will probably need attention if you go further. You may need, for instance, to find, build, or install libraries for gmp and gdbm, or to adjust the pathnames for libc, libm, tcl, and tk. 之を実行する　　 Running
    make test
そうすると､ffidl 試験が実行される(--enable-test により構成設定された時)｡ 系統だった試験揃いではないが､Ffidl の能力の好い扱いの実践であり､libffi に関する幾つかの問題を掘起こした｡　 will run the ffidl tests (when configured with --enable-test). It is not quite a systematic test suite, but it does exercise a good deal of Ffidl's capabilities, and it has turned up some problems with libffi. 例示 Demos 例示のディレクトリーには小さい又は中程度の大きさの外部函数を共有する為の Ffidl 束縛の幾つかの用例と､同じことを違う方法との比較をさせる為の幾つかの符号命令がある｡ The demos directory contains several small and medium size examples of Ffidl bindings to shared libraries, and some code for making comparisons to other ways of doing the same thing.
atol.tcl | atol()へのffidl 束縛と同族体 a Ffidl binding to atol() and congeners
ffidlrt.tcl | ffidl 束縛に関する実行時補助 run time support for Ffidl bindings
gdbm.tcl | gdbm-1.8へのffidl 束縛 a Ffidl binding to gdbm-1.8
getrusage.tcl | getrusage()へのffidl 束縛 a Ffidl binding to getrusage()
libm.tcl | libm へのffidl 束縛 a Ffidl binding to libm
qsort.tcl | qsort へのffidl 束縛 a Ffidl binding to qsort
tkphoto.tcl | Tk 写真映像へのffidl 束縛 a Ffidl binding to the Tk photo image.
pkgIndex.tcl | 手製の梱包索引 hand built package index
gmp.tcl | gmp-2.0.2 へのffidl 束縛 a Ffidl binding to gmp-2.0.2
gmpz.tcl | gmp.tcl経由の任意精度整数 arbitrary precision integers via gmp.tcl
gmpq.tcl | gmp.tcl経由の任意精度有理数 arbitrary precision rationals via gmp.tcl
gmpf.tcl | gmp.tcl経由の任意精度浮動小数 arbitrary precision floats via gmp.tcl
test-gdbm-1.tcl | gdbm 束縛の試験 a test of the gdbm binding
test-gdbm-2.tcl | gdbm 束縛の試験 a test of the gdbm binding
test-gmpz.tcl | gmpz 担当譜の試験 a test of the gmpz routines
time-libm.tcl | ffidl と exprの時計測比較 a timing comparison of Ffidl and expr
library/ffidlrt.tc はDarwin 上で実行しない限り注意が必要である｡ ::ffidl::find-lib と ::ffidl::find-type の､二つの函数があり､外部函数の名称､及び､符号命令の残りから系の型定義を抽出する｡ 但し､抽出は現在の処､私の Linux 装置の為の正しい結果に限定されている｡ 使用者は使用者自身の装置の為に対応付けを書き直す必要がある｡ library/ffidlrt.tcl will need attention unless you're running on Darwin. There are two functions, ::ffidl::find-lib and ::ffidl::find-type, which abstract library names and system typedefs out of the rest of the code. However, the abstraction on Unix is currently limited to the correct results for my Linux box. You'll need to rewrite the mapping for your own machine. ibrary/ffidlrt.tcl は更に､ Tcl 核そのものの中への束縛の用例を幾つか含んでいる｡ ibrary/ffidlrt.tcl also contains some examples of binding into the Tcl core itself. demos/tkphoto.tcl は､２進データとしての写真映像画素の抽出と挿入を許容する｡ 用例としては tests/tkphoto.testを参照されたい｡ demos/tkphoto.tcl allows extraction and insertion of photo image pixels as binary data. See tests/tkphoto.test for an example. demos/other/gdbm.tcl 拡張は gdbm ファイルを操作するための C 言語で書かれた Tcl 拡張符号命令の Tclgdbm0.6 と外部手続き迄含んだ互換性であろう｡理由は gdbm は構造を渡して返すので､また Ffidl 構造符号命令を試験する｡ The demos/other/gdbm.tcl extension should be plug compatible with Tclgdbm0.6, a C coded Tcl extension for manipulating gdbm files. Since gdbm passes and returns structures, it also tests the Ffidl struct code. demos/other/gmp*.tcl 拡張は好い実例を生成する｡主 Gmp 梱包は Gnu 多精度外部函数から移送された全ての mpz_*, mpq_*, and mpf_* entries をラップする｡ 仔群の Gmp[zqf] 梱包は文字列として表現された任意の精度の整数､有理数､浮動少数を定義する為に Gmp 梱包を使う｡　 これは任意の精度の算術の最も効果的な実行方法ではないが､便利であり､実際にはどの型の mp_limb_t と mp_size_t であるかを知らなくてもよいし､使用者が何かもっと効果的に機械語翻訳したい場合に基礎となる外部函数を如何に使用するかを表す｡ The demos/other/gmp*.tcl extensions make a nice example. The main Gmp package wraps all the exported mpz_*, mpq_*, and mpf_* entries from the Gnu multiple precision library. The subsidiary Gmp[zqf] packages use the Gmp package to define arbitrary precision integers, rationals, and floats which are represented as strings. This isn't the most efficient way to do arbitrary precision arithmetic, but it is convenient, it does avoid needing to know what type mp_limb_t and mp_size_t actually are, and it does show how to use the underlying library if you want to build something more efficient. 出来栄え Performance 出来栄えは傑出しているが､仕事の大部分を libffi が行っているので､私だけの成果とは言えない｡ demos/mathswig/time-libm.tcl 記述譜は libm 函数が包まれた ::ffidl::callout を同じ函数の Tcl expr 版とを比較している｡比較の目的には libm が包まれた SWIG を提供する libmathswig0.5 動的外部函数を手作業で機械語翻訳する必要がある｡もし､使用者が Linux-x86 か Windows 上で実行している場合､たのデータ位置の為の Robin Becker の ::dll を実装することもできる｡ demos/mathswig/time-libm.tcl は同じ函数上で時間測定する｡ Performance appears to be excellent, but I can't take any credit because libffi is doing most of the work. The demos/mathswig/time-libm.tcl script compares ::ffidl::callout wrapped libm functions to the Tcl expr versions of the same functions. You'll need to manually build the libmathswig0.5 dynamic library to provide a SWIG wrapped libm for comparison purposes. If you're running on Linux-x86 or Windows you can install Robin Becker's ::dll for another data point. demos/mathswig/time-libm.tcl will time them on the same functions. 懸案事項 Open Issues 最初の出版以来の幾つかの問題点は終結した｡ A few issues have been closed since the initial release. Windows 移送は終了した｡ The Windows port is done. x86 構造の為の呼戻しは実装された｡　 Callbacks are implemented for the x86 architecture. 但し､多くの懸案事項がある｡ But there are many open issues. 正しい外部函数を見つけ出すことは難しい｡私の装置内では､dlopen("libm.so")は libm を見付け出すが､dlopen("libc.so.6") が稼動している間では､dlopen("libc.so") は２進文字で装飾された不都合な文字列を返す｡ 使用者が､自身で機械語翻訳した共有外部函数を使って活動している場合は問題はないが､標準的な輩では標準はない｡ demos/ffidlrt.tcl 内では､ffidl-find-lib 函数は少なくとも､使用者の ffidl 束縛から外部函数に一層分問題点を取去る為の抽出を提供するが､抽出の実装は､私が標準外部函数を見付けた時点から先に進まない｡ Finding the right library is a pain. dlopen("libm.so") finds libm on my machine, but dlopen("libc.so") returns an error string decorated with binary characters while dlopen("libc.so.6") works. If you work with shared libraries you build yourself, it's not an issue, but for all the standard stuff there is no standard. In demos/ffidlrt.tcl the ::ffidl::find-lib function provides an abstraction for at least removing these issues one layer away from your Ffidl bindings to the library, but the implementation of the abstraction hasn't gone farther than listing where I find my standard libraries. 型が何かを発見することは苦痛である｡内包冒頭部は典型的には余りにも厳重で､実際の型定義がある箇所をみつけるには､捜しに捜さなければならない｡ demos/ffidlrt.tcl 内で､ffidl-find-type 関数は ffidl に起因するこれらの問題を抽出するが､抽出の実装はそこでもかなりの労力を要する｡　　　　　 Discovering what type a type is is also a pain. Include headers are typically so heavily conditionalized, that one needs to search and search to find which typedef is actually implemented. In demos/ffidlrt.tcl the ::ffidl::find-type function abstracts these issues out of the Ffidl bindings, but again the implementation of the abstraction will need some work. ffidl 束縛を生成している SWIG の為の処理業務譜は便利かもしれない｡ A backend for SWIG which generates Ffidl bindings might be useful. 定義すべき幾つかの更なる指示子型がある: 指示子のvariant - 非共有値を要求する変数; 本来の文字の文字列への指示子 -- しかし､ Tcl の層へは押し戻せないか? There are some more pointer types which ought to be defined: a variant of pointer-var which requires an unshared value; a pointer to a native character string -- but couldn't that be pushed back to the Tcl layer? Ffidl を伴うTcl拡張の記述はTcl 内の C 符号語の記述に似ている｡ 筆者にはどのような技巧が要求されているかは判らない｡しかし､読者は､何をしているのかが覚束ない時は､読者にとって難し過ぎるのであろう｡どの様な場合も､全出力（コア･ダンプ）はしない方が好い｡　　　　 Writing Tcl extensions with Ffidl is very much like writing C code in Tcl. I'm not sure what the actual required skill set is. But if you're not sure what you're doing, you might be in over your head. In any case, try not to take the core dumps personally. 電網から取得した"これを試して!"の記述譜に従って Ffidl が積まれている Tcl 解釈実行譜内に算譜の断片を積込むのは､有害になることがある｡ Ffidl_SafeInit() は実在しないし､その様なことを考慮して署名した記述譜が必要になるかもしれない(???) 　　　 Loading snippets of code into a Tcl interpreter with Ffidl loaded could be very hazardous, as in downloading "Try ME!" scripts from the web. There is no Ffidl_SafeInit(), we'd probably need signed scripts to even begin to consider such a thing. かって､SWIG と dll を眺め､どの共有 Tcl_Obj も Int か Double への変換を試みる前に注意深く､多重化されていることが判った｡ 又､Tcl の expr の源譜を眺めても､objects から Double か Int への変換は､ Double や Int が既存の文字列表表現と適正に並存することが判った場合のみ重複して共有される｡ Ffidl は pointer-var 変数を処理する時のみ共有対象を重複する､但し､それ以外の場合にそうする事を説明している｡ もし､使用者が型の決まった函数に媒介変数を渡すと､その媒介変数がその型に変換された場合には 引っくり返せない｡　　　 　 I've looked at SWIG and at dll and seen that they very carefully duplicate any shared Tcl_Obj before attempting a conversion to Int or Double. I've also looked at the source for Tcl's expr command, and it converts objects to Double or Int and only duplicates shared objects when it finds a valid Int or a Double with an existing string representation. Ffidl only duplicates shared objects when processing pointer-var, though I'm open to explanations why it should do otherwise. It seems that if you pass a parameter to a typed function that you shouldn't be upset if the parameter is converted to that type. 実に骨が折れる｡ ffidl 瑕疵修正様式が実装され 1) Tcl_Obj 文字列応答は修正されてない､ 2) Tcl_Obj バイト配列応答は割当て寸法などの外側は修正されない､等々 の制約が観察されることが検証された場合､初心者や実験者や粗忽者には好いかもしれない｡ これは tcl_ffidl_call() を代替する代りの実装によって成し遂げられ､呼出の後で複写され制約が検証される｡ 　 　 Hmm, this is a really pared to the bone. It would be nice for newbies and experimenters and the careless if Ffidl implemented a debugging mode which verified that constraints were observed: 1) that Tcl_Obj string reps were not modified, 2) that Tcl_Obj bytearray reps were not modified outside their allocated sizes, and so on. This could be done by switching in an alternate implementation of tcl_ffidl_call() which made copies and verified the constraints after the call. 用例内の幾つかの名前つけの一貫性｡毎回新しい実施例を始める時に､我が Ffidl 拡張様式を再発見していると思う｡ Some naming consistency in the demos. I seem to be reinventing my Ffidl extension style each time I start a new example. 試験内の幾つかの様式の一貫性｡試験が実行され､ある試験は､記述を生成し､他の試験は何が成し遂げられたかを報告し､あるいはなにもなし､或は要旨を与えることもある｡ 　 Some style consistency in the tests. The tests just run, some generate descriptions, some report what they've done, some say nothing, some give summaries. 賞賛 Credits Robin Becker の ::dll 梱包は､多くの事項で Ffidl と同じことを行う､又､今回の仕事について直接の霊感を与えられ､私に､設計上の幾つかの問題点の解決策を指摘した｡　　　　　　 　 Robin Becker's ::dll package, which does much the same thing as Ffidl, provided the immediate inspiration for this work and pointed to the solution of some of the design issues for me. And Robin hisself has been very helpful. Anthony Green の libffi 梱包は､ Ffidl の大多数の初期の実装を提供した｡　　　 　 Anthony Green's libffi package provided most of the initial implementation of Ffidl. Bruno Haibleのclisp系の為のffcall 梱包は代わりの実装と真に驚くべき cpp 纏め書き論の用例を提供した｡ Bruno Haible's ffcall package for the clisp system provided an alternate implementation and a truly amazing example of cpp macrology. 著作権､免許､無保証 Copyright, License, & No Warranty Ffidl 0.6版著作権; 1999 年から Roger E Critchlow Jr,米国 ニューメキシコ州サンタフェ在住 ｡ Ffidl Version 0.6, Copyright © 1999 by Roger E Critchlow Jr, Santa Fe, NM, USA 次の許可がここに賦与される､即ち､料金無料で､どのような個人にも､限界無しの､使用や､複写や､改訂や､併合や､出版や､配布や､再免許や､算譜の複写の販売､に関わる権利を含み制限なしに算譜を販売する為にこの算譜と関連する説明文のファイル(以下``算譜''と謂ふ)の複写を取得すること､及び､そうする為に算譜が提供されることを個人に許容するためには､以下の事が適用される： Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 上記著作権告知とこの許諾告知は全ての複写物かこのソフトの重要な部分全てに含まれなければならない｡ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. この算譜は､商品性及び特定の目的と非侵害への適合性の保障を含むがそれに限定されず明示でも暗示でも如何なる種類の保証なしに､ ``在る通りで'' 提供される｡どの行事も､契約若しくは､不法行為若しくは､それ以外の算譜又は算譜の使用や他の取引の関連の内外で生じる事､の活動であるかによらず､如何なる請求や損害や他の責任について､ ROGER E CRITCHLOW JR に責任を帰すことはない｡ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ROGER E CRITCHLOW JR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ffidl 0.5 からの変更は BSD 許諾に基づき､且つ © 2005 by Daniel A. Steffen により著作権設定された｡ Changes from ffidl 0.5 are under BSD License and are Copyright © 2005 by Daniel A. Steffen 注意すべきはlibffi は © 1996-2003 Red Hat, Inc. による著作権設定があり同様の著作権告知､許諾告知､無保証告知 が添えられている｡ Note that libffi is Copyright © 1996-2003 Red Hat, Inc. and bears a similar copyright notice, license, and non-warranty. 注意すべきはffcall-1.10 は © 1995-2004 Bruno Haible と© 2000 Adam Fedor と © 2004 Paul Guyot による著作権設定があり､｡ GNU General Public License に基づき許諾されている｡ Note that ffcall-1.10 is Copyright © 1995-2004 Bruno Haible, © 2000 Adam Fedor, © 2004 Paul Guyot and is licensed under the GNU General Public License .

|  |  | Last modified: Apr 22 2005