libffi es una biblioteca de interfaz para funciones externas . Proporciona una interfaz en lenguaje de programación C para llamar a funciones compiladas de forma nativa, a partir de información sobre la función objetivo en tiempo de ejecución, en lugar de en tiempo de compilación . También implementa la funcionalidad opuesta: libffi puede generar un puntero a una función que puede aceptar y decodificar cualquier combinación de argumentos definidos en tiempo de ejecución.
libffi se utiliza con mayor frecuencia como tecnología puente entre implementaciones de lenguajes compilados e interpretados . También puede utilizarse para implementar complementos , cuyas firmas de función se desconocen al crear la aplicación principal.
Entre los usuarios notables se incluyen Python , Haskell , Dalvik , F-Script , PyPy , PyObjC , RubyCocoa , JRuby , Rubinius , MacRuby , gcj , GNU Smalltalk , IcedTea , Cycript , Pawn , Java Native Access , Common Lisp (a través de CFFI), Racket , [ 3 ] Embeddable Common Lisp y Mozilla . [ 4 ]
En Mac OS X , libffi se usa comúnmente con BridgeSupport , que proporciona descripciones de interfaces de frameworks independientes del lenguaje de programación , y Nu , que vincula el acceso directo de Objective-C desde Lisp .
libffi ha sido ampliamente adaptado y se publica bajo una licencia MIT .
Fondo
Aunque el lenguaje de programación C es omnipresente en las plataformas, la forma en que se implementan las llamadas a funciones en código máquina ( la convención de llamada ) varía. Cuando se desea cargar una subrutina dinámicamente en tiempo de ejecución, es necesario conocer estas convenciones.
libffi conoce la convención de llamada en muchas plataformas (combinaciones de procesador y sistema operativo). Su API de 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 admite funciones variádicas al estilo de C.
La convención de llamada de C no solo la utiliza el lenguaje C: debido a la gran cantidad de código existente escrito en C, la mayoría de los lenguajes compilados más recientes también permiten escribir y llamar funciones siguiendo dicha convención. Como resultado, libffi puede interactuar con algunas funciones escritas en estos lenguajes.
Historia
libffi, desarrollada originalmente por Anthony Green, se inspiró en la biblioteca Gencall de Silicon Graphics . Gencall fue desarrollada por Gianni Mariani, entonces empleado de SGI , con el propósito de permitir llamadas a funciones mediante direcciones y crear un marco de llamada para la convención de llamada específica ( MIPS O32). Anthony Green perfeccionó la idea, la extendió a otras arquitecturas y convenciones de llamada, y liberó el código fuente de libffi.
Adopción
La biblioteca libffi es útil para construir un puente entre el código interpretado y el código compilado de forma nativa. Algunos usuarios destacados son:
D
- libffi-d
- Enlaces a la biblioteca libffi para D. Se utilizan principalmente para la MCI (Managed Compiler Infrastructure).
F-Script
- F-Script
- Genera dinámicamente clases Cocoa escritas en F-Script.
Engaño
- GNU Guile
- libffi se utiliza en Guile 1.9.8 y versiones posteriores.
Haskell
- GHC
- La biblioteca libffi se ha utilizado para la mayoría de las pruebas FFI realizadas por el GHC desde finales de 2009.
Java
- OpenJDK
- La implementación de código abierto de la Java Platform Standard Edition utiliza libffi para servir de puente entre el intérprete y el código nativo para la conversión a lenguaje ensamblador cero.
- Acceso nativo a Java (JNA)
- La forma de llamar a código nativo desde Java sin usar JNI.
- gcj
- La biblioteca de tiempo de ejecución del compilador GNU para el lenguaje de programación Java utiliza libffi para gestionar las llamadas entre el código interpretado y el código compilado de forma nativa. gcj formaba parte de GCC, la colección de compiladores GNU .
JavaScript
- JSCocoa
- Llamar a código Objective-C desde JavaScript en Mac OS X y el iPhone (a través del puerto libffi-iphone).
- Mozilla
- libffi se utiliza 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.). [ 5 ]
- nodo-ffi
- Un complemento de Node.js para cargar y llamar a bibliotecas dinámicas desde JavaScript.
Ceceo
- cffi-libffi
- La biblioteca estándar de interfaz de funciones externas para Common Lisp CFFI incluye el sistema cffi-libffi para brindar soporte para pasar y devolver argumentos de estructura por valor.
- duendecito
- Pixie (un dialecto de Lisp inspirado en Clojure ) utiliza libffi como mecanismo predeterminado de interfaz de funciones externas.
Perl
- FFI::Raw
- Una fina capa protectora alrededor de libffi.
- FFI::Ornitorrinco
- Una nueva y más práctica capa de abstracción para libffi.
Pitón

- CPython
- La implementación predeterminada y más utilizada del lenguaje de programación Python utiliza libffi en la biblioteca estándar ctypes.
- PyObjC
- Llamar a código Objective-C desde Python en Mac OS X.
Raqueta
- Raqueta
- Llama al código C desde esta popular implementación de Scheme.
Rubí
- Violín
- Un envoltorio de libffi en la biblioteca estándar de Ruby.
- Ruby-FFI
- Una extensión de interfaz de funciones externas para Ruby.
- Rubí y cacao
- Llamar a código Objective-C desde Ruby en Mac OS X.
Referencias
- ↑ "Versión 3.7.1" . 10 de julio de 2026. Consultado el 11 de julio de 2026 .
- ↑ "Estado" . GitHub . 25 de abril de 2022.
- ↑ "Copia archivada" (PDF) . Archivado del original (PDF) el 2 de septiembre de 2009. Consultado el 2 de agosto de 2009 .
{{cite web}}: CS1 mantenimiento: copia archivada como título ( enlace ) - ↑ "Manifiesto de archivos de Mozilla-central @ 2dc00d4b379a" .
- ↑ https://developer.mozilla.org/en/js-ctypes Archivado el 29/06/2011 en Wayback Machine , referencia js-ctypes Archivado el 29/06/2011 en Wayback Machine
Enlaces externos
- Bibliotecas de C (lenguaje de programación)
- Bibliotecas informáticas gratuitas