XS (Perl)
XSは、プログラムがCまたはC++のサブルーチンを呼び出すことができるPerlの外部関数インターフェースです。XSまたはxsubは「eXtendable Subroutine」の 略です
XS は、そのようなインターフェースをサポートする呼び出しインターフェースを指定するための 接着言語も指します(以下を参照)。
背景
Perlのサブルーチンライブラリはモジュールと呼ばれ、xsubsを含むモジュールはXSモジュールと呼ばれます。Perlは、モジュールの開発、パッケージ化、配布、インストールのためのフレームワークを提供します
Perl プログラムでは、 CPUやメモリを大量に消費するタスクを処理したり、ハードウェアや低レベルのシステム機能とインターフェイスしたり、既存の C サブルーチン ライブラリを利用したりするために、 C サブルーチンを呼び出すことが望ましい場合があります。
Perlインタプリタ
PerlインタプリタはCプログラムなので、原則としてPerlからCへの呼び出しに障害はありません。しかし、XSインターフェースは複雑で高度な技術を要するため、使用するにはインタプリタに関するある程度の理解が必要です。この件に関する最も初期の参考文献は、perlguts PODでした
ラッパー
C++コードをラップする XSモジュールを書くことは可能です。これを行うには、主にモジュールビルドシステムの設定が必要です。[ 1 ]
サンプルコード
以下は、2つの文字列を連結する関数concat()(つまり、Perlの.演算子に相当するもの) を公開するXSモジュールを示しています
# PERL_NO_GET_CONTEXT を定義します# "EXTERN.h"をインクルードします# "perl.h"をインクルードします# "XSUB.h"をインクルードしますSV * _do_sv_catsv ( pTHX_ SV * one_sv 、SV * two_sv ) { SV * one_copy = newSVsv ( one_sv ); sv_catsv ( one_copy 、two_sv ); one_copyを返します。}モジュール=デモ:: XSModuleパッケージ=デモ:: XSModuleSV * concat ( SV * one_sv 、SV * two_sv )コード: SV * to_return = _do_sv_catsv ( aTHX_ one_sv 、two_sv ); RETVAL = to_return ;出力: RETVAL最初の 4 行 (#defineおよび#includeステートメント) は標準の定型文です。
その後に、ローカルで呼び出し可能な任意の数のプレーン C 関数が続きます。
で始まるセクションでは、MODULE = Demo::XSModule実際のXSマクロ言語を用いて、このコードへのPerlインターフェースを定義しています。CODE:セクション下のCコードは、前のセクションで定義された純粋なC関数を呼び出していることに注意してください_do_sv_catsv()。
Perl のドキュメントでは、上記の すべての「特殊」記号 (例:aTHX_および)の意味と目的について説明しています。RETVAL
このモジュールをPerlで利用できるようにするには、コンパイルする必要があります。ExtUtils ::MakeMakerなどのビルドツールは、これを自動的に実行できます。(手動でビルドする場合:xsubppツールはXSモジュールを解析し、Cソースコードを出力します。このソースコードは共有ライブラリにコンパイルされ、Perlが参照できるディレクトリに配置されます。)Perlコードは、コンパイルされたXSモジュールをXSLoaderなどのモジュールを使用してロードします。この時点で、PerlはPerlで記述されているかのように、文字列を呼び出し、Demo::XSModule::concat('foo', 'bar')それを受け取ることができます。 foobarconcat()
既存の C ライブラリへの Perl インターフェイスを構築する場合、h2xsはXS ファイル自体の作成の大部分を自動化できることに注意してください。
難しさ
XSモジュールの作成と保守には、C言語自体とPerlの広範なC APIの専門知識が必要です。XSモジュールは、CコンパイラとPerlインタプリタがコンパイルされたヘッダーファイルが利用可能な場合にのみインストールできます。また、Perlの新しいバージョンではバイナリ互換性が失われ、XSモジュールの再コンパイルが必要になる場合が あります
参照
参考文献
- ^ 「C++とPerlの融合」 johnkeiser.com、2001年8月27日。2001年12月11日時点のオリジナルよりアーカイブ。2005年5月5日閲覧
- ジェネス、ティム&コーゼンス、サイモン(2002年)『Perlの拡張と埋め込み』グリニッジ:マニング・パブリケーションズ社ISBN 1-930110-82-0