Interfaz de función externa


Una interfaz de función externa ( FFI ) es un mecanismo por el cual un programa escrito en un lenguaje de programación puede llamar a rutinas o hacer uso de servicios escritos en otro.

El término proviene de la especificación de Common Lisp , que se refiere explícitamente a las características del idioma para las llamadas entre idiomas como tales; [1] el término también es utilizado oficialmente por los lenguajes de programación Haskell , [2] Rust , [3] y Python . [4] Otros lenguajes usan otra terminología: el lenguaje de programación Ada habla de " enlaces de lenguaje ", mientras que Java se refiere a su FFI como JNI ( Java Native Interface ) o JNA ( Java Native Access ).). La interfaz de función externa se ha convertido en una terminología genérica para los mecanismos que brindan dichos servicios.

La función principal de una interfaz de función externa es unir la semántica y las convenciones de llamada de un lenguaje de programación (el lenguaje principal 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/o las interfaces binarias de aplicación de ambos. Esto se puede hacer de varias maneras:

Además, muchos 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 de lenguaje de extensión es el invitado que invoca servicios en el cuerpo más grande del idioma anfitrión, como escribir un pequeño complemento [21]. ] para GIMP. [22]

Algunas FFI están restringidas a funciones independientes , mientras que otras también permiten llamadas de funciones incrustadas en un objeto o clase (a menudo llamadas llamadas a métodos ); algunos incluso permiten la migración de tipos de datos y/u objetos complejos a través del límite del idioma.

En la mayoría de los casos, una FFI se define mediante un lenguaje de "nivel superior", por lo que puede emplear servicios definidos e implementados en un lenguaje de nivel inferior, normalmente un lenguaje de sistemas como C o C++ . Esto generalmente se hace para acceder a los servicios del sistema operativo en el idioma en el que se define la API del sistema operativo o por consideraciones de rendimiento.