libffi es una biblioteca de interfaz de funciones foráneas . Proporciona una interfaz de lenguaje de programación C para llamar a funciones compiladas de forma nativa dada la información sobre la función de destino en tiempo de ejecución en lugar de tiempo de compilación . También implementa la funcionalidad opuesta: libffi puede producir un puntero a una función que puede aceptar y decodificar cualquier combinación de argumentos definidos en tiempo de ejecución.
Desarrollador (es) | Anthony Green |
---|---|
Versión inicial | 7 de octubre de 1996 |
Lanzamiento estable | 3.3 / 23 de noviembre de 2019 |
Repositorio | |
Escrito en | C , lenguaje ensamblador |
Sistema operativo | Tipo Unix , Microsoft Windows , OS X , iOS , Bare Metal |
Tipo | Biblioteca de ejecución |
Licencia | Licencia MIT [1] |
Sitio web | sourceware |
libffi se utiliza con mayor frecuencia como tecnología puente entre implementaciones de lenguaje compilado e interpretado . libffi también se puede usar para implementar complementos , donde las firmas de funciones del complemento no se conocen en el momento de crear la aplicación de host.
Los usuarios notables incluyen Python , Haskell , Dalvik , F-Script , PyPy , PyObjC , RubyCocoa , JRuby , Rubinius , MacRuby , gcj , GNU Smalltalk , IcedTea , Cycript , Pawn , Squeak , Java Native Access , Common Lisp (a través de CFFI), Racket , [2] Common Lisp y Mozilla integrables . [3]
En Mac OS X , libffi se usa comúnmente con BridgeSupport , que proporciona descripciones neutrales del lenguaje de programación de las interfaces del marco , y Nu que vincula el acceso directo a Objective-C desde Lisp .
libffi ha sido ampliamente portado y está publicado bajo una licencia MIT .
Fondo
Aunque el lenguaje de programación C es omnipresente entre las plataformas, las formas en que se implementan las llamadas a funciones en el código máquina, la convención de llamadas , varían. Cuando se desea cargar una subrutina dinámicamente en tiempo de ejecución, se requiere un conocimiento de estas convenciones.
libffi tiene conocimiento de la convención de llamadas en muchas plataformas (combinaciones de procesador-sistema operativo). Su API C , que se comparte en todas las compilaciones de libffi independientemente de la plataforma, abstrae la complejidad de cargar código en diferentes plataformas. Además de las funciones regulares, también soporta de estilo C funciones variadic .
La convención de llamadas de C no solo la usa el lenguaje C: debido a la cantidad de código existente escrito en C, la mayoría de los lenguajes compilados más nuevos también permiten escribir y llamar a funciones en dicha convención. Como resultado, libffi también puede interactuar con algunas funciones escritas en estos lenguajes.
Historia
libffi, desarrollado originalmente por Anthony Green, se inspiró en la biblioteca Gencall de Silicon Graphics . Gencall fue desarrollado por Gianni Mariani, entonces empleado por SGI , con el propósito de permitir llamadas a funciones por dirección y crear una trama de llamada para la convención de llamada particular ( MIPS O32). Anthony Green refinó la idea y la extendió a otras arquitecturas y convenciones de llamada y libffi de código abierto.
Adopción
La biblioteca libffi es útil para construir un puente entre el código interpretado y compilado de forma nativa. Algunos usuarios notables incluyen:
D
- libffi-d
- Enlaces a la biblioteca libffi para D. Se usa principalmente para MCI (Infraestructura de compilador administrado).
F-Script
- F-Script
- Genera dinámicamente clases Cocoa escritas en F-Script.
Engaño
- GNU Guile
- libffi se usa en Guile 1.9.8 y posteriores
Haskell
- GHC
- libffi se ha utilizado para la mayoría de las FFI realizadas por el GHC desde finales de 2009.
Java
- OpenJDK
- La implementación de código abierto de Java Platform Standard Edition usa libffi para hacer un puente entre el intérprete y el código nativo para el puerto Zero-Assembly.
- Dalvik
- Dalvik es la máquina virtual que ejecuta la plataforma Java en dispositivos móviles Android . libffi se utiliza en puertos de Android para los que no se ha escrito ningún código de puente personalizado.
- Acceso nativo de Java (JNA)
- La forma sin JNI de llamar a código nativo desde Java.
- gcj
- La biblioteca de tiempo de ejecución del compilador GNU para el lenguaje de programación Java utiliza libffi para manejar las llamadas entre el código interpretado y compilado de forma nativa. gcj es parte de GCC, la colección de compiladores GNU .
JavaScript
- JSCocoa
- Llame al código Objective-C desde javascript en Mac OS X y el iPhone (a través del puerto libffi-iphone).
- Mozilla
- libffi se usa en la biblioteca js-ctypes (anteriormente conocida como ctypes.jsm) para llamar a funciones C dentro del código JavaScript (disponible en aplicaciones XULRunner , extensiones de Firefox , etc.). [4]
- nodo-ffi
- Un complemento de Node.js para cargar y llamar a bibliotecas dinámicas desde JavaScript.
Ceceo
- cffi-libffi
- La biblioteca de interfaz de función externa estándar para Common Lisp CFFI incluye el sistema cffi-libffi para incluir soporte para pasar y devolver argumentos de estructura por valor.
- duendecito
- pixie (un dialecto Lisp inspirado en Clojure ) usa libffi como el mecanismo de interfaz de función externa predeterminado.
Perl
- FFI :: Crudo
- Una fina envoltura alrededor de libffi.
- FFI :: Ornitorrinco
- Envoltorio más nuevo y conveniente sobre libffi.
Pitón
- CPython
- La implementación predeterminada y más utilizada del lenguaje de programación Python usa libffi en la biblioteca ctypes estándar.
- PyObjC
- Llame al código Objective-C de Python en Mac OS X.
Raqueta
- Raqueta
- Llame al código C desde esta popular implementación de Scheme (también utilizada como plataforma de implementación para el nuevo Lisp, Arc de Paul Graham).
Rubí
- Violín
- Un contenedor libffi en la biblioteca estándar de Ruby
- Ruby-FFI
- Una extensión de interfaz de función externa para Ruby.
- RubyCocoa
- Llame al código Objective-C de Ruby en Mac OS X.
Referencias
- ^ https://github.com/atgreen/libffi/blob/master/LICENSE
- ^ http://repository.readscheme.org/ftp/papers/sw2004/barzilay.pdf
- ^ https://hg.mozilla.org/mozilla-central/file/2dc00d4b379a/js/ctypes/libffi
- ^ https://developer.mozilla.org/en/js-ctypes , referencia de js-ctypes
enlaces externos
- Página web oficial
- El blog de Anthony Green