Articulo de referencia

Interfaz de funciones externas

Una interfaz de función externa ( FFI , por sus siglas en inglés) es un mecanismo mediante el cual un programa escrito en un lenguaje de programación puede llamar a rutinas inte...

Una interfaz de función externa ( FFI , por sus siglas en inglés) es un mecanismo mediante el cual un programa escrito en un lenguaje de programación puede llamar a rutinas interoperables o utilizar servicios escritos o compilados en otro. Una FFI se usa frecuentemente en contextos donde se realizan llamadas a una biblioteca de enlace dinámico binario .

Nomenclatura

El término proviene de la especificación de Common Lisp , que se refiere explícitamente a la característica del lenguaje de programación que permite llamadas entre lenguajes como tales; [ 1 ] el término también se usa a menudo oficialmente en la documentación del intérprete y del compilador para Haskell , [ 2 ] Rust , [ 3 ] PHP , [ 4 ] Python y LuaJIT ( Lua ). [ 5 ] [ 6 ] : 35 [ 7 ] Otros lenguajes usan otra terminología: Ada tiene enlaces de lenguaje , mientras que Java tiene Java Native Interface (JNI), Java Native Access (JNA) o, desde Java 22, Foreign Function and Memory API . La interfaz de función externa se ha convertido en una terminología genérica para los mecanismos que proporcionan tales servicios.

Operación

La función principal de una interfaz de función externa (FFI) es combinar la semántica y las convenciones de llamada de un lenguaje de programación (el lenguaje anfitrión , o el lenguaje que define la FFI) con la semántica y las convenciones de otro (el lenguaje invitado ). Este proceso también debe tener en cuenta los entornos de ejecución y las interfaces binarias de las aplicaciones de ambos. Esto se puede hacer de varias maneras:

  • Exigir que las funciones del lenguaje invitado que deben poder ser invocadas desde el lenguaje anfitrión se especifiquen o implementen de una manera particular, a menudo utilizando algún tipo de biblioteca de compatibilidad.
  • Uso de una herramienta para envolver automáticamente las funciones del idioma invitado con el código de enlace apropiado , que realiza cualquier traducción necesaria.
  • Uso de una biblioteca contenedora
  • Restringir el conjunto de funcionalidades del lenguaje anfitrión que se pueden usar entre lenguajes. Por ejemplo, las funciones de C++ llamadas desde C no pueden (en general) incluir parámetros de referencia ni generar excepciones.

C++ ofrece compatibilidad con C de forma trivial; sin embargo, como C++ utiliza la modificación de nombres , los símbolos que se van a exportar en bibliotecas compartidas deben encapsularse en bloques extern "C" que impiden dicha modificación. extern "C"Las funciones pueden llamar internamente a código C++, pero solo pueden devolver tipos C y no pueden lanzar excepciones .

Las FFI pueden verse complicadas por las siguientes consideraciones:

  • Si un lenguaje admite la recolección de basura (GC) y el otro no, es fundamental asegurarse de que el código del lenguaje sin GC no provoque fallos en la GC del otro. En JNI, por ejemplo, el código C que conserva referencias a objetos recibidas de Java debe comunicar esta información correctamente a la máquina virtual Java o al entorno de ejecución Java (JRE); ​​de lo contrario, Java podría eliminar objetos antes de que C termine de utilizarlos. (El código C también debe liberar explícitamente su vínculo con dichos objetos una vez que ya no los necesite).
  • Los objetos o tipos de datos complejos o no triviales pueden resultar difíciles de mapear de un entorno a otro.
  • Es posible que ambos lenguajes no puedan mantener referencias a la misma instancia de un objeto mutable, debido al problema de mapeo mencionado anteriormente.
  • Es posible que uno o ambos lenguajes se ejecuten en una máquina virtual (VM); además, si ambos lo hacen, a menudo se trata de máquinas virtuales diferentes.
  • La herencia entre lenguajes y otras diferencias, como las que existen entre sistemas de tipos o entre modelos de composición de objetos , pueden resultar especialmente difíciles.
Ejemplo de diagrama UML de un script de Python que se ejecuta dentro del intérprete de Python y llama a una biblioteca compartida a través de FFI.

Muchas FFI se pueden generar automáticamente: por ejemplo, SWIG . Sin embargo, en el caso de un lenguaje de extensión, puede ocurrir una inversión semántica de la relación entre invitado y anfitrión, cuando un cuerpo más pequeño del lenguaje de extensión es el invitado que invoca servicios en el cuerpo más grande del lenguaje anfitrión, como escribir un pequeño complemento [ 8 ] para GIMP. [ 9 ]

Algunas interfaces de funciones externas (FFI) se limitan a funciones independientes , mientras que otras también permiten llamadas a funciones integradas en un objeto o clase (a menudo denominadas llamadas a métodos ); algunas incluso permiten la migración de tipos de datos u objetos complejos a través del límite del lenguaje.

En la mayoría de los casos, una interfaz de funciones externas (FFI) se define mediante un lenguaje de alto nivel , de modo que puede emplear servicios definidos e implementados en un lenguaje de bajo nivel , normalmente un lenguaje de programación de sistemas como C o C++ . Esto se suele hacer para acceder a los servicios del sistema operativo (SO) en el lenguaje en el que se define la API del SO, o bien para optimizar el rendimiento.

Muchas interfaces de funciones externas (FFI) también proporcionan los medios para que el lenguaje llamado pueda invocar servicios en el lenguaje anfitrión.

El término interfaz de función externa (FFI) generalmente no se usa para describir entornos de ejecución multilingües como Microsoft Common Language Runtime (CLR) , donde se proporciona una base común que permite que cualquier lenguaje compatible con CLR utilice servicios definidos en cualquier otro. (Sin embargo, en este caso, CLR incluye una FFI, P/Invoke , para realizar llamadas fuera del entorno de ejecución). Además, muchas arquitecturas de computación distribuida, como la invocación remota de métodos (RMI) de Java, RPC, CORBA , SOAP y D-Bus, permiten que diferentes servicios se escriban en diferentes lenguajes; estas arquitecturas generalmente no se consideran FFI.

Casos especiales

Existen algunos casos especiales en los que los lenguajes se compilan en la misma máquina virtual de bytecode, como Clojure y Java , así como Elixir y Erlang . Dado que no hay interfaz, no se trata estrictamente de una FFI, aunque ofrece las mismas funciones al usuario.

Véase también

Referencias

  1. Borrador propuesto del Estándar Nacional Estadounidense para Sistemas de Información: Lenguaje de Programación: Common Lisp (ed. 15.17R  ). 12 de agosto de 1994. pág.  243.
  2. "Introducción a FFI" . HaskellWiki . Consultado el 19 de junio de 2015. La FFI de Haskell se utiliza para llamar a funciones de otros lenguajes (básicamente C en este punto) y para que C llame a funciones de Haskell.
  3. "std::ffi" . Rust-lang.org . Consultado el 1 de abril de 2021. Este módulo proporciona utilidades para gestionar datos a través de interfaces que no son de Rust, como otros lenguajes de programación y el sistema operativo subyacente. Es útil principalmente para enlaces FFI (Interfaz de Función Foránea) y código que necesita intercambiar cadenas de caracteres similares a C con otros lenguajes.
  4. "Manual de PHP FFI" . Manual de PHP . Consultado el 31 de agosto de 2023. Las variables C definidas se ponen a disposición como propiedades de la instancia FFI.
  5. Mike Pall. "Biblioteca FFI" . Luajit.org . Consultado el 29 de septiembre de 2013 .
  6. Heintz, Joachim; Hofmann, Alex; McCurdy, Iain (2013). Ways Ahead: Proceedings of the First International Csound Conference . Newcastle upon Tyne: Cambridge Scholars Publishing. ISBN 978-1-4438-5122-0OCLC 855505215 
  7. "Documentación de CFFI" . Consultado el 19 de junio de 2015. Interfaz de funciones externas de C para Python . El objetivo es proporcionar una forma práctica y fiable de llamar a código C compilado desde Python mediante declaraciones de interfaz escritas en C.
  8. "4. Un script de ejemplo" . Gimp.org. 4 de febrero de 2001. Archivado del original el 7 de octubre de 2013. Consultado el 29 de septiembre de 2013 .
  9. "Script-Fu y complementos para GIMP" . Gimp.org . Consultado el 29 de septiembre de 2013 .
  • c2.com: Interfaz de funciones externas
  • Interfaz de funciones externas de Haskell 98
  • Allegro Common Lisp FFI

Obtenido de " https://en.wikipedia.org/w/index.php?title=Foreign_function_interface&oldid=1342381426 "