SWIG

Fiche logiciel validé
  • Création ou MAJ importante : 25/09/10
  • Correction mineure : 25/09/10
Mots-clés
Pour aller plus loin

SWIG : interfacer des programmes C, C++ avec des programmes python, perl...

  • Site web
  • Système : UNIX-like, Windows, MacOS X
  • Téléchargement
  • Version évaluée : 1.3
  • Langue(s) de l'interface : anglais
  • Licence : Autre

    Le logiciel est distribué sous une licence de logiciel libre puisqu'il peut être utilisé, modifié, distribué pour une utilisation non-commerciale et non commerciale.

Description
Fonctionnalités générales

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.

Autres fonctionnalités

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.

Contexte d'utilisation dans mon laboratoire/service

SWIG est utilisé pour accélérer certaines parties de codes Python réalisés au sein du laboratoire.

Environnement du logiciel
Distributions dans lesquelles ce logiciel est intégré

Debian, Ubuntu, FreeBsd, Cygwin

Plates-formes

Unix-like, Windows et MacOSX.

Autres logiciels aux fonctionnalités équivalentes
Environnement de développement
Type de structure associée au développement

Les personnes actives dans ce projet sont référencées à la page suivante: http://www.swig.org/guilty.html.

Eléments de pérennité

SWIG est utilisé dans différents projets que l'on peut trouver à la page suivante http://www.swig.org/projects.html. On peut citer PETSc qui a été interfacé avec Python grâce à SWIG via le module petsc4py. Il existe également dans ce projet le module mpi4py qui permet d'utiliser MPI via Python.

Environnement utilisateur
Liste de diffusion ou de discussion, support et forums
Documentation utilisateur