SWIG
SWIG est un outil qui permet d'utiliser des programmes écrits en C/C++ depuis des langages, souvent interprétés, tels que Python, Perl, Ruby, Java.
L'interfaçage de deux langages demande au développeur la connaissance des adaptateurs (wrapper). Par exemple, si l'on veut interfacer un programme C en Python, il est nécessaire de bien connaître l'interface de programmation C (API) permettant de faire les connexions entre les deux langages.
SWIG permet de s'affranchir de ces connaissances en proposant au développeur un ensemble d'outils qui permet de réaliser directement l'adaptateur. Pour ce faire, il est juste nécessaire de décrire, via un fichier interface, les fonctions et les données à interfacer ainsi que la manière de le faire.
Prenons un exemple simple illustrant les fonctionnalités de base de SWIG. Nous avons un programme C (factorielle.c) qui calcule la factorielle
#include <stdio.h>
int factorielle(int n)
{
if (n > 1) return n * factorielle(n - 1);
else return 1;
}
auquel nous ajoutons un fichier interface factorielle.i comprenant les signatures des fonctions de l'adaptateur.
%module factorielle
%{
extern int factorielle(int);
%}
extern int factorielle(int);
Dans un terminal, nous utilisons la commande swig pour créer l'adaptateur factorielle_wrap.c, puis nous créons une librairie contenant le programme C original et cet adaptateur nouvellement créé.
Création d'un module Python
terminal$ swig -python factorielle.i
terminal$ gcc -fPIC -c factorielle.c factorielle_wrap.c -I/usr/include/python2.6
terminal$ ld -shared factorielle.o factorielle_wrap.o -o _factorielle.so
terminal$ python
Python 2.6.4 (r264:75706, Nov 2 2009, 14:44:17)
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import factorielle
>>> factorielle.factorielle(4)
24
Création d'un module Perl
terminal$ swig -perl factorielle.i
terminal$ gcc -fPIC -c factorielle.c factorielle_wrap.c `perl -MExtUtils::Embed -e ccopts`
terminal$ ld -G factorielle.o factorielle_wrap.o -o factorielle.so
terminal$ perl
use factorielle;
print factorielle::factorielle(4),"\n";
Ctrl + d
24
Cet exemple simple montre qu'il est possible de créer facilement et très rapidement des modules dans des langages de haut niveau sans connaissance préalable sur la manière d'interfacer du Python avec du C, du Perl avec du C, ...
Le fichier interface peut être beaucoup plus compliqué que ce que nous avons montré précédemment. SWIG gère l'interfaçage de structures, de classes,... Il est également fourni avec un ensemble de fichiers interfaces permettant par exemple d'utiliser la librairie STL. Vous pouvez également créer vos propres typemaps indiquant à SWIG comment passer d'un type de données C ou C++ à un type de données Perl, Python,... Ceci est par exemple utiliser dans numpy où vous pouvez grâce au fichier interface numpy.i faire le lien entre vos tableaux C et vos tableaux numpy dans Python.
Swig permet de rapidement prototyper des applications en servant de glue à différents codes afin de les présenter sous une interface et un langage commun.
SWIG est utilisé pour accélérer certaines parties de codes Python réalisés au sein du laboratoire.