SWIGとTcl

SWIGは、C/C++のコードへスクリプト言語からアクセスするラッパを生成する開発ツールです。
Tcl, Python, Perlのスクリプト言語に対応し、UNIX,Windows,Macintoshのプラットフォームで動作します。

例えば、速度が要求されるコードはC/C++で、それ以外はTclで記述するとか、
GUI部だけTcl/Tkで、エンジン部はC/C++で記述するという役割分担が可能です。
また、tcltestと組み合わせて、C/C++のライブラリやプログラムのテストを行えます。
Tcl拡張を作成する第3の手段とも言えます。

チュートリアル

まず、CまたはC++の関数を作成します。

/* example.c */
 
#include <time.h>
double My_variable = 3.0;
 
int fact(int n) {
    if (n <= 1) return 1;
    else return n*fact(n-1);
}

int my_mod(int x, int y) {
    return (x%y);
}

char *get_time()
{
    time_t ltime;
    time(&ltime);
    return ctime(&ltime);
}
/* example.h */

extern double My_variable;
extern int fact(int n);
extern int my_mod(int x, int y);
extern char *get_time();

次に、SWIGに入力するインタフェースファイルを作成します。

/* example.i */

%module example
%{
#include "example.h"
%}

次に、Tclモジュールの構築をします。
コマンドで以下のようにタイプして下さい。
SWIGは、example_wrap.cというラッパを生成します。

UNIX(gcc)の場合:
% swig -tcl8 example.i
% gcc -fpic -c example.c example_wrap.c -I/usr/local/include
% gcc -shared example.o example_wrap.o -o example.so
% tclsh
% load ./example.so example
% puts $My_variable
3.0
% fact 5
120
% my_mod 7 3
1
% get_time
Sun Feb 11 23:01:07 1996

Windows(Visual C++ 6.0)+ActiveTclの場合:
% nmake -f example.mak
% tclsh
% load ./example.dll example
% puts $My_variable
3.0
% fact 5
120
% my_mod 7 3
1
% get_time
Sun Feb 11 23:01:07 1996
※nmakeを実行する前に、VCVARS32.BATを実行してください。

その他の詳細なサンプルはSWIG and Tclにあります。

注意事項

SWIGをターゲットとなるスクリプト言語と異なるC++コンパイラで使用するとうまく動かないことがあります。
(例えば、Tcl/TkモジュールをBorlandコンパイラでコンパイルし、Tcl/TkがVisual C++でコンパイルされていた場合など)

参考文献