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
