SWIG (de l'anglais Simplified Wrapper and Interface Generator) est un outil logiciel open source, permettant de connecter des logiciels ou bibliothèques logicielles écrites en C/C++ avec des langages de scripts tels que : Tcl, Perl, Python, Ruby, PHP, Lua ou d'autres langages de programmation comme Java, C#, Scheme et OCaml. Des sorties peuvent également être faites en format XML ou Lisp S-expressions.
Le but est de pouvoir appeler des fonctions natives (écrites en C ou C++) par d'autres langages de programmation, passer des données types complexes à ces fonctions, protéger la mémoire contre les libérations inappropriées, hériter d'objet de classes entre langages, etc. Le programmeur écrit un fichier d'interfaçage contenant une liste de fonctions en C/C++ étant visible par un interpréteur. SWIG va compiler le fichier d'interfaçage et générer du code en C/C++ et dans le langage de programmation cible. SWIG va générer du code de conversion pour des fonctions avec des arguments simples; du code de conversion avec des types complexes d'arguments doit être écrit par le programmeur. L'outil SWIG fournit le lien entre C/C++ et l'autre langage de programmation cible. En fonction du langage, le lien se présente sous deux formes:
SWIG n'est pas utilisé pour appeler des fonctions interprétées par le code natif, ceci doit être implémenté manuellement par le programmeur.
SWIG enveloppe de simples déclarations en C en créant une interface qui correspond à la manière dont les déclarations seraient utilisées dans un programme en C. Par exemple, le fichier d'interfaçage suivant:
%module example
%inline %{
extern double sin(double x);
extern int strcmp(const char *, const char *);
extern int Foo;
%}
#define STATUS 50
#define VERSION "1.1"
Dans ce fichier, il y a deux fonctions sin()
et strcmp()
, une variable globale Foo
, et deux constantes STATUS
and VERSION
. Quand SWIG crée un module d'extension, ces déclarations sont accessibles comme des fonctions, variables, constantes du script. En 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