SWIG
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.
Fonction
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:
- une bibliothèque partagée qu'un interpréteur peut lier à une sorte de module d'extension, ou;
- une bibliothèque partagée qui peut être liée à d'autres programmes compilés dans le langage cible (par exemple en utilisant Java Native Interface (JNI) en Java).
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.
Exemples
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