SWIG ( Simplified Wrapper and Interface Generator ) es una herramienta de software de código abierto que se utiliza para conectar programas o bibliotecas informáticas escritas en C o C++ con lenguajes de scripting como Lua , Perl , PHP , Python , R , Ruby , Tcl y otras implementaciones de lenguajes como C# , Java , JavaScript , Go , D , OCaml , Octave , Scilab y Scheme . La salida también puede ser en formato XML .
Función

El objetivo es permitir la llamada a funciones nativas (escritas en C o C++) desde otros lenguajes de programación, pasando tipos de datos complejos a dichas funciones, evitando la liberación inapropiada de memoria, heredando clases de objetos entre lenguajes, etc. El programador escribe un archivo de interfaz que contiene una lista de funciones de C/C++ que serán visibles para un intérprete. SWIG compilará el archivo de interfaz y generará código en C/C++ estándar y en el lenguaje de programación de destino. SWIG generará código de conversión para funciones con argumentos simples; el código de conversión para tipos de argumentos complejos debe ser escrito por el programador. La herramienta SWIG crea código fuente que sirve de enlace entre C/C++ y el lenguaje de destino. Dependiendo del lenguaje, este enlace se presenta en tres formas:
- una biblioteca compartida a la que un intérprete existente puede vincularse como algún tipo de módulo de extensión, o
- una biblioteca compartida que se puede vincular con otros programas compilados en el lenguaje de destino (por ejemplo, utilizando la Interfaz Nativa de Java (JNI) en Java).
- una biblioteca dinámica compartida de código fuente que debe compilarse y cargarse dinámicamente (por ejemplo, extensiones nativas de Node.js)
SWIG no se utiliza para llamar a funciones interpretadas desde código nativo; esto debe hacerlo el programador manualmente.
Ejemplo
SWIG encapsula declaraciones simples de C creando una interfaz que se asemeja mucho a la forma en que se usarían dichas declaraciones en un programa C. Por ejemplo, considere el siguiente archivo de interfaz: [ 4 ]
% ejemplo de módulo%inline % { extern double sin ( double x ); extern int strcmp ( const char * , const char * ); extern int Foo ; % } #define STATUS 50 #define VERSION "1.1"En este archivo, hay dos funciones sin()y strcmp(), una variable global Fooy dos constantes STATUSy VERSION. Cuando SWIG crea un módulo de extensión, estas declaraciones son accesibles como funciones, variables y constantes del lenguaje de scripting, respectivamente. 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.1Objetivo
Existen dos razones principales para integrar un motor de scripting en un programa C/C++ existente:
- El programa se puede personalizar mucho más rápido mediante un lenguaje de scripting en lugar de C/C++ . Incluso se puede poner el motor de scripting a disposición del usuario final, para que pueda automatizar tareas comunes escribiendo scripts.
- Aunque el producto final no incluya el motor de scripting, puede resultar muy útil para escribir scripts de prueba.
Existen varias razones para crear bibliotecas dinámicas que puedan cargarse en intérpretes existentes, entre ellas:
- Proporcionar acceso a una biblioteca de C/C++ que no tiene equivalente en el lenguaje de scripting.
- Primero, escribe todo el programa en el lenguaje de scripting y, después de realizar el análisis de rendimiento , reescribe el código crítico para el rendimiento en C o C++.
Historia
SWIG está escrito en C y C++ y está disponible públicamente desde febrero de 1996. Su autor inicial y principal desarrollador fue David M. Beazley, quien desarrolló SWIG mientras trabajaba como estudiante de posgrado en el Laboratorio Nacional de Los Alamos y la Universidad de Utah , y también como profesor en la Universidad de Chicago . Actualmente, su desarrollo cuenta con el apoyo de un grupo activo de voluntarios liderado por William Fulton. SWIG se distribuye bajo la Licencia Pública General de GNU .
Verano de Código de Google
SWIG participó con éxito en Google Summer of Code en 2008, 2009 y 2012. En 2008, SWIG obtuvo cuatro plazas. Haoyu Bai dedicó sus veranos al backend de Python 3.0 de SWIG, Jan Jezabek trabajó en el soporte para la generación de wrappers COM , Cheryl Foil dedicó su tiempo al traductor de comentarios para SWIG, y Maciej Drwal trabajó en un backend de C. En 2009, SWIG volvió a participar en Google Summer of Code. Esta vez participaron cuatro estudiantes. Baozeng Ding trabajó en un módulo de Scilab . Matevz Jekovec dedicó su tiempo a las características de C++0x . Ashish Sharma dedicó su verano a un módulo de Objective-C , y Miklos Vajna dedicó su tiempo a los directores de PHP.
En 2012, SWIG participó en Google Summer of Code. En esta ocasión, cuatro de los cinco estudiantes completaron el proyecto con éxito. Leif Middelschulte trabajó en un módulo para el lenguaje C. Swati Sharma mejoró el módulo para Objective-C. Neha Narang añadió el nuevo módulo para JavaScript. Dmitry Kabak trabajó en la documentación del código fuente y en los comentarios de Doxygen .
Alternativas
Para Python, SIP , Pybind11 y la biblioteca Boost.python de Boost ofrecen una funcionalidad similar .
Proyectos que utilizan SWIG
- ZXID (Licencia Apache, Versión 2.0)
- Symlabs SFIS (comercial)
- LLDB
- GNU Radio hasta (inclusive) la versión 3.8.xx; las versiones posteriores usan Pybind11 [ 5 ]
- Xapian
- TensorFlow
- Apache SINGA
- QuantLib
- Babeltrace
Véase también
- Encuadernación lingüística
- Interfaz de funciones externas (FFI)
- Convención de llamadas
- Deformación de nombres
- Interfaz de programación de aplicaciones
- Interfaz binaria de la aplicación
- Comparación de máquinas virtuales de aplicaciones
- Función de envoltura
- GIWS para lo opuesto a SWIG: llamar a Java desde C/C++
Referencias
- ↑ "Historia de SWIG" .
- ↑ "Versión 4.3.0" . Consultado el 10 de diciembre de 2024 .
- ↑ Adaptado de Ammar Nejati, Mikhail Svechnikov, Joachim Wuttke: Implementación de un software C++ con (o sin) integración y extensión de Python. En Bernoth et al, eds: deRSE24 - Contribuciones seleccionadas de la 4.ª Conferencia de Ingeniería de Software de Investigación en Alemania. ECEASST 83 (2025) .
- ↑ "Conceptos básicos de SWIG" .
- ↑ Müller, Marcus. "Registro de cambios para GNU Radio 3.9.0.0" . GitHub .
Lecturas adicionales
- Artículo " Exponga la API interna de su programa C/C++ con un SWIG rápido " de Victor Volkman
- Artículo " Extensiones de Python en C++ usando SWIG " de Michael Fötsch
- Presentación " Descripción general de la aplicación para openSUSE " por Klaus Kämpf
Enlaces externos
- Software multiplataforma
- Herramientas de programación informática gratuitas
- Herramientas de programación
- Lenguajes de scripting