XS は、Perl と Perl といっしょに使おうとする C ライブラリの間の拡張イン タフェースを作るための言語です。XS インタフェースは、Perl とリンクするこ とのできる、新しいライブラリを作るためのライブラリと組み合わせて使われま す。XSUB は、XS 言語内の関数で、Perl アプリケーションインタフェースの中 核を成すものです。
XS コンパイラは、xsubpp と呼ばれています。このコンパイラは、実際には C
の関数を装って XSUB に Perl の値を操作させるために必要な構造を埋め込み、
Perl に XSUB をアクセスさせるために必要なグルー関数を作ります。コンパイ
ラは、C 関数の引数や変数を Perl の値にマッピングする方法を決めるために、
typemap
を使用します。デフォルトの typemap
では、多くの一
般的な C の型を扱っています。新たにリンクされるライブラリのための、特殊
な構造体や型を扱うときには、補助的な typemap
を作らなければなりま
せん。
以下の多くの例では、Perl と ONC+RPC 結合ライブラリ関数のインタフェースの
作成に焦点をおいています。特に、 rpcb_gettime()
関数が、XS 言語の
多くの機能を示すために用いられています。この関数は、2 つの引数をとります。
一つめの引数が入力用で、ふたつめの引数が出力用です。この関数はまた、ステー
タス値を返します。
bool_t rpcb_gettime(const char *host, time_t *timep);
C からは、以下のような形でこの関数が呼ばれます。
#include <rpc/rpc.h> bool_t status; time_t timep; status = rpcb_gettime( "localhost", &timep );
この関数と Perl の間で直接変換を行なうための XSUB を作れば、次のようなコー ドで、Perl からその XSUB が使われます。変数 $status と変数 $timep に、この関数の出力が得られます。
use RPC; $status = rpcb_gettime( "localhost", $timep );
以下に示す XS ファイルは、 rpcb_gettime()
関数へのインタフェース
の一例となる XS サブルーティン (XSUB のこと) を示しています。この XSUB
が C と Perl の間の直接変換を行ない、Perlからのインタフェースも確保しま
す。XSUB は上に示したような使い方で、Perl から起動されます。XS ファイル
ではいつも、最初に `EXTERN.h' 、 `perl.h' 、 `XSUB.h' の
ための 3 つの #include
文を指定しないといけません。この方法や他の
方法の拡張は、後述します。
#include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include <rpc/rpc.h> MODULE = RPC PACKAGE = RPC bool_t rpcb_gettime(host,timep) char * host time_t &timep OUTPUT: timep
XSUB を使うものを含めて、どんな Perl への拡張も、ブートストラップのよう
に起動時に、その拡張を Perl に組み込む Perl モジュールを用意するようになっ
ています。このモジュールが、拡張機能や変数を Perl プログラムにエクスポー
トし、拡張のためのXSUB を Perl に組み込みます。以下のモジュールは、この
ドキュメントのほとんどの例で使われ、前に示したように Perl からuse
コマンドで使われるはずです。Perl モジュールについては、このドキュメント
内でも、もう少し詳しく触れます。
package RPC; require Exporter; require DynaLoader; @ISA = qw(Exporter DynaLoader); @EXPORT = qw( rpcb_gettime ); bootstrap RPC; 1;
このドキュメントを通じて、さまざまな rpcb_gettime()
XSUB へ
のインタフェースを研究しています。XSUB は、場合によって、
順番や数の異なる引数をとるようになっています。どの場合にも、
XSUB は、Perl と実際の C の rpcb_gettime()
関数の間を取り持
つもので、XSUB が実際の rpcb_gettime()
関数を常に正しい引数
で呼ぶことを保証しなければなりません。この抽象化された仲介
によって、プログラマは、C 関数にいっそう Perl 風なインタフェ
ースを用意することができるようになっているのです。
Dean Roehrich <roehrich@cray.com> September 27, 1994
Go to the first, previous, next, last section, table of contents.