El generador de interfaces y envoltorios simplificados ( SWIG ) es una herramienta de software de código abierto que se utiliza para conectar programas informáticos o bibliotecas escritos en C o C++ con lenguajes de programación como Lua , Perl , PHP , Python , R , Ruby , Tcl y otras implementaciones de lenguaje como C# , Java , JavaScript , Go , D , OCaml , Octave , Scilab y Scheme . La salida también puede estar en forma de XML .
Función
El objetivo es permitir la llamada de funciones nativas (escritas en C o C++) por parte de otros lenguajes de programación, pasando tipos de datos complejos a esas funciones, evitando que se libere memoria de forma inapropiada, heredando clases de objetos entre lenguajes, etc. El programador escribe un archivo de interfaz que contiene una lista de funciones de C/C++ que se harán visibles para un intérprete. SWIG compilará el archivo de interfaz y generará código en C/C++ normal 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 complejos de argumentos debe ser escrito por el programador. La herramienta SWIG crea código fuente que proporciona el pegamento entre C/C++ y el lenguaje de destino. Dependiendo del lenguaje, este pegamento viene en dos 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 a otros programas compilados en el lenguaje de destino (por ejemplo, utilizando la Interfaz nativa de Java (JNI) en Java).
- un código fuente de biblioteca dinámica compartida que debe compilarse y cargarse dinámicamente (por ejemplo, extensiones nativas de Node.js)
SWIG no se utiliza para llamar a funciones interpretadas por código nativo; esto debe hacerlo el programador manualmente.
Ejemplo
SWIG envuelve declaraciones C simples creando una interfaz que coincide estrechamente con la forma en que se utilizarían las declaraciones en un programa C. Por ejemplo, considere el siguiente archivo de interfaz: [3]
Ejemplo de %module
%inline % { externo double sin ( doble x ); externo int strcmp ( const char * , const char * ); externo int Foo ; % } #define ESTADO 50 #define VERSIÓN "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 programación respectivamente. En Python:
>>> ejemplo . sin ( 3 )
0.141120008
>>> ejemplo . strcmp ( 'Dave' , 'Mike' )
-1
>>> print ( ejemplo . cvar . foo )
42
>>> print ( ejemplo . STATUS )
50
>>> print ( ejemplo . VERSION )
1.1
Objetivo
Hay dos razones principales para integrar un motor de scripting en un programa C/C++ existente:
- De esta forma, el programa se puede personalizar mucho más rápido mediante un lenguaje de programación en lugar de C/C++ . El motor de programación puede incluso exponerse al usuario final, de modo que pueda automatizar tareas comunes mediante la escritura de scripts.
- Incluso si el producto final no contiene el motor de scripts, puede ser de todas formas 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 C/C++ que no tiene equivalente en el lenguaje de script.
- Primero escriba todo el programa en el lenguaje de scripting y, después de crear el perfil , reescriba 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. El autor inicial y desarrollador principal fue David M. Beazley, quien desarrolló SWIG mientras trabajaba como estudiante de posgrado en el Laboratorio Nacional de Los Álamos y la Universidad de Utah y mientras era profesor en la Universidad de Chicago . El desarrollo cuenta actualmente con el apoyo de un grupo activo de voluntarios dirigido por William Fulton. SWIG se ha publicado bajo una Licencia Pública General 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 pasó sus veranos en el backend Python 3.0 de SWIG, Jan Jezabek trabajó en el soporte para generar contenedores COM , Cheryl Foil pasó su tiempo en el "traductor" de comentarios para SWIG y Maciej Drwal trabajó en un backend 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 pasó su tiempo en las características de C++0x . Ashish Sharma pasó su verano en un módulo de Objective-C , Miklos Vajna pasó su tiempo en directores de PHP.
En 2012, SWIG participó en Google Summer of Code. Esta vez, cuatro de los cinco estudiantes completaron el proyecto con éxito. Leif Middelschulte trabajó en un módulo de lenguaje de destino C. Swati Sharma mejoró el módulo Objective-C. Neha Narang agregó el nuevo módulo sobre JavaScript. Dmitry Kabak trabajó en la documentación del código fuente y 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)
- SFIS de Symlabs (comercial)
- Banco de Desarrollo Local
- GNU Radio hasta (incluida) la versión 3.8.xx; las versiones posteriores utilizan Pybind11 [4]
- Xapiano
- Flujo tensorial
- Apache SINGA
- Biblioteca cuántica
- Rastro de Babelt
Véase también
- Vinculación de idiomas
- Interfaz de función externa (FFI)
- Convención de llamadas
- Mutilació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 de SWIG: llamar a Java desde C/C++
Referencias
- ^ "Historia de SWIG".
- ^ "Versión v4.2.1".
- ^ "Conceptos básicos de SWIG".
- ^ Müller, Marcus. "Registro de cambios de GNU Radio 3.9.0.0". GitHub .
Lectura adicional
- 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++ con SWIG" de Michael Fötsch
- Presentación "Descripción general de la aplicación para openSUSE" por Klaus Kämpf
Enlaces externos
- Sitio web oficial