Simplified Wrapper and Interface Generator (SWIG)

SWIG เป็นตัวสร้างส่วนติดต่อกับภาษาซีมาตรฐานคล้ายๆ กับ JNI ของจาวา โดยมีช่องทางให้เชื่อมได้หลายภาษา

ตัวอย่าง

หลังจากที่ได้ลง freeBSD บน VM Ware ก็ลองมาเล่นเกี่ยวกับ SWIG ดู ก็ไม่ค่อยรู้อะไรมากเท่าไรอะนะ อ่านออกบ้างไม่ออกบ้าง ดังนั้นผู้อ่านโปรดใช้วิจารณญานในการรับชมด้วยนะครับ

เริ่มต้นกันจากการนิยามมันก่อนว่ามันคืออะไร เท่าที่ดูๆ อะนะ มันน่าจะเป็นตัวที่ช่วยให้เราเรียก ภาษา C/C++ โดยอีกภาษาหนึ่งที่ SWIG support ไว้ ซึ่งมันก็เยอะมาก java ก็มี พวก .net ก็เห็นว่ามีอะนะ แต่ยังไม่ได้ลอง

ซึ่งที่มองก็คล้ายๆ กับ java ไป call c อะเรียก native อะเป่าหรืออะไรสักอย่างเนี่ยแหละ

ถ้ายังไงลองอ่านตรงนี้ได้ครับจะเป็นรายละเอียดเกี่ยวกับว่ามันคืออะไร และก็ตัวอย่าง http://www.swig.org/Doc1.3/SWIGDocumentation.html#Introduction

พอรู้ว่ามันคืออะไรกันสักหน่อยก็มาติดตั้งกันครับ การติดตั้งบน freeBSD ก็ไม่ยากเท่าไร ไปที่ $ cd usr/ports/devel/swig13/ แล้วก็ $ make -python อันนี้จะติดให้ทำ interface กับ python อะครับถ้าจะเป็นตัวอื่นก็เปลี่ยน option เอาครับ หรือไม่ใช้แค่ make อย่างเดียวก็ติดมาให้หมดเลยก็ได้ครับ แต่อาจจะนานหน่อย มันเล่นติดมาหมดเลยทั้ง ruby perl

จากนั้นมันก็ไปโหลดตัวล่าสุดมาติดให้

เมื่อติดเสร็จก็เห็นมันอยู่ /usr/local/bin จะมีตัว swig อยู่ครับ

ก็ทดสอบกันได้เลย เริ่มจากเราจะสร้างโปรแกรม C ที่ทำการคำนวน fact และก็ mod ให้ครับ

/* File : example.c */

double  My_variable  = 3.0;

/* Compute factorial of n */
int  fact(int n) {
	if (n <= 1) return 1;
	else return n*fact(n-1);
}

/* Compute n mod m */
int my_mod(int n, int m) {
	return(n % m);
}

จากนั้นมาสร้างตัว interface ครับมันจะเป็น .i นะครับผมว่ามันน่าจะประกาศ เกี่ยวกับพวกตัวแปรหรือ function อะไรพวกนั้นอะนะ

/* File : example.i */
%module example
%{
/* Put headers and other declarations here */
extern double My_variable;
extern int    fact(int);
extern int    my_mod(int n, int m);
%}

extern double My_variable;
extern int    fact(int);
extern int    my_mod(int n, int m);

อะคราวนี้มาสร้าง interface กันด้วย swig

$ swig -python example.i ตั้งนี้มันจะได้พวก wrap ออกมาครับ

$ gcc -c -fpic example.c example_wrap.c -I/usr/local/include/python2.5 ตรงนี้มันจะได้ .o ออกมาครับ

$ gcc -shared example.o example_wrap.o -o _example.so ตรงนี้มันจะได้ .so ออกมาครับเหมือนกันเป็น lib ให้เราเรียกอะครับ

จากนั้นก็มารันดูโดย python หน้าตามันจะประมาณนี้อะครับ

unix > python
Python 2.0 (#6, Feb 21 2001, 13:29:45)
[GCC egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)] on linux2
Type "copyright", "credits" or "license" for more information.     
>>> import example
>>> example.fact(4)
24
>>> example.my_mod(23,7)
2
>>> example.cvar.My_variable + 4.5
7.5

Reference

  1. http://www.swig.org/