| 原作者 | デビッド・M・ビーズリー |
|---|---|
| 開発者 | SWIG開発者 |
| 初回リリース | 1996年2月[1] |
| 安定リリース | 4.2.1 [2]
/ 2024年2月24日 |
| リポジトリ |
|
| 書かれた | C、C++ |
| ライセンス | GPLv3 |
| Webサイト | swig.org |
Simplified Wrapper and Interface Generator ( SWIG ) は、CまたはC++で記述されたコンピュータ プログラムまたはライブラリを、Lua、Perl、PHP、Python、R、Ruby、Tclなどのスクリプト言語や、C#、Java、JavaScript、Go、D、OCaml、Octave、Scilab、Schemeなどの他の言語実装に接続するために使用するオープンソース ソフトウェア ツールです。出力はXML形式にすることもできます。
関数
その目的は、他のプログラミング言語からネイティブ関数 (C または C++ で記述されたもの) を呼び出し、それらの関数に複雑なデータ型を渡し、メモリが不適切に解放されるのを防ぎ、言語間でオブジェクト クラスを継承できるようにすることです。プログラマーは、インタープリターに表示される C/C++ 関数のリストを含むインターフェイス ファイルを作成します。SWIG はインターフェイス ファイルをコンパイルし、通常の C/C++ とターゲット プログラミング言語でコードを生成します。SWIG は、単純な引数を持つ関数の変換コードを生成します。複雑な引数の変換コードはプログラマーが記述する必要があります。SWIG ツールは、 C/C++ とターゲット言語を結び付けるソース コードを作成します。言語に応じて、この結び付けには 2 つの形式があります。
- 既存のインタープリタが何らかの拡張モジュールとしてリンクできる共有ライブラリ、または
- ターゲット言語でコンパイルされた他のプログラムにリンクできる共有ライブラリ (たとえば、 Java でJava Native Interface (JNI) を使用)。
- コンパイルされ、動的にロードされる共有動的ライブラリソース コード (例: Node.js ネイティブ拡張)
SWIG はネイティブ コードによる解釈された関数の呼び出しには使用されません。これはプログラマが手動で行う必要があります。
例
SWIGは、Cプログラムで宣言が使用される方法とほぼ一致するインターフェースを作成することで、単純なC宣言をラップします。たとえば、次のインターフェースファイルを考えてみましょう。[3]
%モジュールの例
%inline % { extern double sin ( double x ); extern int strcmp ( const char * , const char * ); extern int Foo ; % } #define STATUS 50 #define VERSION "1.1"
sin()このファイルには、2 つの関数とstrcmp()、グローバル変数Foo、および 2 つの定数STATUSとがありますVERSION。SWIG が拡張モジュールを作成すると、これらの宣言はそれぞれスクリプト言語関数、変数、定数としてアクセス可能になります。Python の場合:
>>> example.sin ( 3 ) 0.141120008 >>> example.strcmp ( ' Dave ' , ' Mike ' ) - 1 >>> print ( example.cvar.Foo ) 42 >>> print ( example.STATUS ) 50 >>> print ( example.VERSION ) 1.1
目的
既存の C/C++ プログラムに スクリプト エンジンを埋め込む主な理由は 2 つあります。
- プログラムは、C/C++ ではなくスクリプト言語を使用して、はるかに速くカスタマイズできます。スクリプト エンジンはエンド ユーザーに公開されることもあるため、エンド ユーザーはスクリプトを記述して一般的なタスクを自動化できます。
- 最終製品にスクリプト エンジンが含まれていない場合でも、テスト スクリプトの作成には非常に役立ちます。
既存のインタープリターにロードできる動的ライブラリを作成する理由はいくつかあります。
- スクリプト言語に相当するものがないC/C++ライブラリへのアクセスを提供します。
- まずプログラム全体をスクリプト言語で記述し、プロファイリングした後、パフォーマンスが重要なコードを C または C++ で書き直します。
歴史
SWIG は C および C++ で書かれており、1996 年 2 月から公開されています。最初の著者であり主な開発者はDavid M. Beazleyで、彼はロスアラモス国立研究所とユタ大学の大学院生として、またシカゴ大学の教員として勤務していたときに SWIG を開発しました。現在、開発は William Fulton が率いるボランティアの活動的なグループによってサポートされています。SWIG はGNU General Public Licenseに基づいてリリースされています。
Google サマー オブ コード
SWIG は、2008 年、2009 年、2012 年のGoogle Summer of Codeに成功裏に参加しました。2008 年、SWIG は 4 つのスロットを獲得しました。Haoyu Bai は夏を SWIG の Python 3.0 バックエンドに費やし、Jan Jezabek はCOMラッパー生成のサポートに取り組み、Cheryl Foil は SWIG のコメント「トランスレータ」に時間を費やし、Maciej Drwal は C バックエンドに取り組みました。2009 年、SWIG は再び Google Summer of Code に参加しました。今回は 4 人の学生が参加しました。Baozeng Ding はScilabモジュールに取り組みました。Matevz Jekovec はC++0x機能に時間を費やしました。Ashish Sharma は夏をObjective-Cモジュールに費やし、Miklos Vajna は PHP ディレクターに時間を費やしました。
2012 年、SWIG は Google Summer of Code に参加しました。今回は 5 人の学生のうち 4 人がプロジェクトを無事に完了しました。Leif Middelschulte は C ターゲット言語モジュールに取り組みました。Swati Sharma は Objective-C モジュールを拡張しました。Neha Narang は JavaScript に新しいモジュールを追加しました。Dmitry Kabak はソース コードのドキュメントとDoxygenコメントに取り組みました。
代替案
Python の場合、 SIP、Pybind11、Boost の Boost.python ライブラリによって同様の機能が提供されます。
SWIG を使用したプロジェクト
- ZXID (Apache ライセンス、バージョン 2.0)
- Symlabs SFIS(商用)
- LLDB
- GNU Radioバージョン3.8.xxまで(含む); それ以降のバージョンではPybind11を使用[4]
- ザピアン
- テンソルフロー
- アパッチ・シンガ
- クォンタムライブラリ
- バベルトレース
参照
- 言語バインディング
- 外部関数インターフェース(FFI)
- 呼び出し規約
- 名前のマングリング
- アプリケーションプログラミングインターフェース
- アプリケーションバイナリインターフェース
- アプリケーション仮想マシンの比較
- ラッパー関数
- SWIG の逆のGIWS : C/C++ から Java を呼び出す
参考文献
- ^ 「SWIGの歴史」。
- ^ 「リリース v4.2.1」。
- ^ 「SWIGの基礎」。
- ^ Müller, Marcus. 「GNU Radio 3.9.0.0 の変更ログ」。GitHub。
さらに読む
- Victor Volkman による記事「簡単な SWIG で C/C++ プログラムの内部 API を公開する」
- Michael Fötsch による記事「SWIG を使用した C++ での Python 拡張」
- Klaus Kämpf によるプレゼンテーション「openSUSE のアプリケーション概要」
外部リンク
- 公式サイト
