libffi es una biblioteca de interfaz de funciones externas . Proporciona una interfaz de lenguaje de programación C para llamar a funciones compiladas de forma nativa , dada información sobre la función de destino en tiempo de ejecución en lugar de en 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.
libffi se utiliza con mayor frecuencia como tecnología puente entre implementaciones de lenguajes compilados e interpretados . libffi también se puede utilizar para implementar complementos , donde las firmas de funciones del complemento no se conocen en el momento de crear la aplicación host.
Los usuarios notables 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] Common Lisp y Mozilla integrables . [4]
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 adaptado y se publica bajo una licencia MIT .
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 de máquina (la convención de llamadas ) varían. Cuando se quiere cargar una subrutina dinámicamente en tiempo de ejecución, se requiere conocimiento de estas convenciones.
libffi tiene conocimiento de la convención de llamada en muchas plataformas (combinaciones de procesador y 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 admite funciones variadas de estilo C.
La convención de llamada de C no solo la utiliza 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 funciones en dicha convención. Como resultado, libffi también puede interactuar con algunas funciones escritas en estos lenguajes.
libffi, desarrollado originalmente por Anthony Green, se inspiró en la biblioteca Gencall de Silicon Graphics . Gencall fue desarrollado por Gianni Mariani, entonces empleado de SGI , con el propósito de permitir llamadas a funciones por dirección y crear un marco de llamada para la convención de llamada particular ( MIPS O32). Anthony Green refinó la idea y la extendió a otras arquitecturas y llamó a convenciones y código abierto libffi.
La biblioteca libffi es útil para construir un puente entre el código interpretado y el compilado de forma nativa. Algunos usuarios notables incluyen:
{{cite web}}
: Mantenimiento CS1: copia archivada como título ( enlace )