stringtranslate.com

Interfaz de función externa

Una interfaz de función externa ( FFI ) es un mecanismo mediante el cual un programa escrito en un lenguaje de programación puede llamar a rutinas o hacer uso de servicios escritos o compilados en otro. Una FFI se utiliza a menudo en contextos en los que se realizan llamadas a una biblioteca de vínculos dinámicos binaria .

Nombramiento

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 tal; [ cita requerida ] el término también se usa a menudo oficialmente en la documentación del intérprete y compilador de Haskell , [1] Rust , [2] PHP , [3] Python y LuaJIT ( Lua ) [4] [5] : 35.  [ 6] Otros lenguajes usan otra terminología: Ada tiene enlaces de lenguaje , mientras que Java tiene Java Native Interface (JNI) o Java Native Access (JNA). La interfaz de función externa se ha convertido en una terminología genérica para los mecanismos que brindan tales servicios.

Operación

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 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 aplicación de ambos. Esto se puede hacer de varias maneras:

Las IFE pueden complicarse por las siguientes consideraciones:

Archivo UML ffi.svg

Algunos ejemplos de IFE incluyen:

Además, 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 el huésped y el anfitrión, cuando un cuerpo más pequeño del lenguaje de extensión es el huésped que invoca servicios en el cuerpo más grande del lenguaje anfitrión, como escribir un pequeño complemento [24] para GIMP. [25]

Algunas FFI están restringidas a funciones independientes , mientras que otras también permiten llamadas de funciones integradas en un objeto o clase (a menudo llamadas llamadas de método ); 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 FFI se define mediante un lenguaje de nivel superior , de modo que puede emplear servicios definidos e implementados en un lenguaje de nivel inferior , normalmente un lenguaje de programación de sistemas como C o C++ . Esto se hace normalmente para acceder a los servicios del sistema operativo (OS) en el lenguaje en el que se define la API del SO o por objetivos de rendimiento.

Muchas FFI también proporcionan los medios para que el idioma llamado invoque servicios también en el idioma anfitrión.

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

Casos especiales

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

Véase también

Referencias

  1. ^ "Introducción a FFI". HaskellWiki . Consultado el 19 de junio de 2015 . FFI de Haskell se utiliza para llamar a funciones de otros lenguajes (básicamente C en este momento) y para que C llame a funciones de Haskell.
  2. ^ "std::ffi". Rust-lang.org . Consultado el 1 de abril de 2021 . Este módulo proporciona utilidades para manejar datos en interfaces que no son de Rust, como otros lenguajes de programación y el sistema operativo subyacente. Se utiliza principalmente para enlaces FFI (Foreign Function Interface) y código que necesita intercambiar cadenas similares a C con otros lenguajes.
  3. ^ "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.
  4. ^ de Mike Pall. "Biblioteca FFI". Luajit.org . Consultado el 29 de septiembre de 2013 .
  5. ^ ab Heintz, Joachim; Hofmann, Alex; McCurdy, Iain (2013). Caminos por delante: Actas de la primera conferencia internacional de Csound. Newcastle upon Tyne: Cambridge Scholars Publishing. ISBN 978-1-4438-5122-0.OCLC 855505215  .
  6. ^ "Documentación CFFI" . Consultado el 19 de junio de 2015 . Interfaz de función externa C para Python. El objetivo es proporcionar una forma conveniente y confiable de llamar código C compilado desde Python utilizando declaraciones de interfaz escritas en C.
  7. ^ "Interfaz con otros idiomas". Adaic.org . Consultado el 29 de septiembre de 2013 .
  8. ^ "Exportación extranjera" . Consultado el 25 de mayo de 2020 .
  9. ^ "Llamando a C desde Clean" . Consultado el 25 de abril de 2018 .
  10. ^ "biblioteca dart:ffi" . Consultado el 1 de enero de 2020 .
  11. ^ "wiki de etiqueta 'fortran-iso-c-binding'". Desbordamiento de pila .
  12. ^ "cgo". Lenguaje de programación Go . Consultado el 23 de agosto de 2015 .
  13. ^ "Interfaz de función externa | Manual". Deno . Consultado el 8 de febrero de 2023 .
  14. ^ "API de FFI". Documentos de Bun .
  15. ^ "Llamando a C y al código Fortran". JuliaLang.org . Consultado el 11 de febrero de 2018 .
  16. ^ PyCall.jl: Paquete para llamar a funciones Python desde el lenguaje Julia, JuliaPy, 2018-02-08 , consultado el 2018-02-11
  17. ^ "PHP: FFI - Manual". The PHP Group . Consultado el 13 de junio de 2019 .
  18. ^ Eli Barzilay. "La interfaz extranjera de la raqueta". Docs.racket-lang.org . Consultado el 29 de septiembre de 2013 .
  19. ^ "TR600.pdf" (PDF) . Archivado desde el original (PDF) el 2009-09-02 . Consultado el 2013-09-29 .
  20. ^ "Implementaciones en línea" . Consultado el 15 de agosto de 2017 .
  21. ^ "Llamada nativa" . Consultado el 15 de agosto de 2017 .
  22. ^ "Uso de funciones externas para llamar a código externo" . Consultado el 1 de junio de 2019 .
  23. ^ "Importar desde archivo de encabezado C". Zig Software Foundation . Consultado el 11 de marzo de 2021 .
  24. ^ "4. Un script de muestra". Gimp.org. 2001-02-04 . Consultado el 2013-09-29 .
  25. ^ "Script-Fu y complementos para The GIMP". Gimp.org . Consultado el 29 de septiembre de 2013 .

Enlaces externos