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モジュールの再コンパイルが必要になる場合が あります

参照

  • SWIGはXSの代替であり、他のいくつかの言語からのCおよびC++関数の呼び出しもサポートしています
  • FFI は、別の言語で書かれたルーチンを呼び出すことを可能にするメカニズムです。

参考文献

  1. ^ 「C++とPerlの融合」 johnkeiser.com、2001年8月27日。2001年12月11日時点のオリジナルよりアーカイブ。2005年5月5日閲覧
  • perlxs Perl XS アプリケーションプログラミングインターフェース
  • perlxstut Perl XS チュートリアル
  • perlguts拡張を行う人のための Perl 内部関数
  • perlapi Perl API リスト (自動生成)
  • XSメカニクスチュートリアル
  • Perl と C++ でC++ 用の XS モジュールを構築する
  • xs-fun XS は楽しい: Perl XS の書き方に関するシンプルで簡単なチュートリアル