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 donde se realizan llamadas a una biblioteca binaria de vínculos dinámicos .

Nombrar

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 idiomas como tal; [ cita necesaria ] el término también se utiliza 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 dichos servicios.

Operación

La función principal de una interfaz de función externa 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 el 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 aplicaciones de ambos. Esto se puede hacer de varias maneras:

Las FFI pueden verse complicadas por las siguientes consideraciones:

UML ffi.svg

Ejemplos de FFI 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 de 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 [24 ] para GIMP. [25]

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

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++ . Por lo general, esto se hace para acceder a los servicios del sistema operativo (SO) en el idioma en el que está definida la API del sistema operativo o para 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 generalmente no se utiliza para describir tiempos 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 un FFI, P/Invoke , para llamar fuera del tiempo de ejecución). Además, muchas arquitecturas informáticas distribuidas, como la invocación de método remoto Java (RMI), RPC, CORBA , SOAP y D- Los autobuses permiten que diferentes servicios se escriban en diferentes idiomas; Estas arquitecturas generalmente no se consideran FFI.

Casos especiales

Hay algunos casos especiales, en los que los lenguajes se compilan en la misma máquina virtual de código de bytes, como Clojure y Java , así como Elixir y Erlang . Al no tener interfaz, no es un FFI estrictamente hablando, aunque ofrece las mismas funciones al usuario.

Ver también

Referencias

  1. ^ "Introducción a FFI". HaskellWiki . Consultado el 19 de junio de 2015 . El FFI de Haskell se utiliza para llamar funciones de otros lenguajes (básicamente C en este punto), y para que C llame a funciones de Haskell.
  2. ^ "estándar::ffi". Rust-lang.org . Consultado el 1 de abril de 2021 . Este módulo proporciona utilidades para manejar datos a través de interfaces que no son Rust, como otros lenguajes de programación y el sistema operativo subyacente. Se utiliza principalmente para enlaces y códigos FFI (Foreign Function Interface) que necesitan intercambiar cadenas tipo C con otros lenguajes.
  3. ^ "Manual PHP FFI". Manual PHP . Consultado el 31 de agosto de 2023 . Las variables C definidas están disponibles como propiedades de la instancia de FFI.
  4. ^ ab Mike Pall. "Biblioteca FFI". Luajit.org . Consultado el 29 de septiembre de 2013 .
  5. ^ ab Heintz, Joaquín; Hofmann, Alex; McCurdy, Iain (2013). Caminos a seguir: Actas de la Primera Conferencia Internacional 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 manera conveniente y confiable de llamar código C compilado desde Python usando declaraciones de interfaz escritas en C.
  7. ^ "Interfaz con otros idiomas". Adaic.org . Consultado el 29 de septiembre de 2013 .
  8. ^ "Exportación exterior" . Consultado el 25 de mayo de 2020 .
  9. ^ "Llamar a C desde limpio" . Consultado el 25 de abril de 2018 .
  10. ^ "biblioteca dart:ffi" . Consultado el 1 de enero de 2020 .
  11. ^ "'wiki de etiquetas 'fortran-iso-c-binding'". Desbordamiento de pila .
  12. ^ "go". Ir a lenguaje de programación . Consultado el 23 de agosto de 2015 .
  13. ^ "Interfaz de funciones externas | Manual". Deno . Consultado el 8 de febrero de 2023 .
  14. ^ "API de FFI". Documentos de pan .
  15. ^ "Llamar a C y código Fortran". JuliaLang.org . Consultado el 11 de febrero de 2018 .
  16. ^ PyCall.jl: Paquete para llamar a funciones de Python desde el lenguaje Julia, JuliaPy, 2018-02-08 , consultado el 11 de febrero de 2018
  17. ^ "PHP: FFI - Manual". El grupo PHP . Consultado el 13 de junio de 2019 .
  18. ^ Eli Barzilay. "La interfaz exterior de la raqueta". Docs.racket-lang.org . Consultado el 29 de septiembre de 2013 .
  19. ^ "TR600.pdf" (PDF) . Archivado desde el original (PDF) el 2 de septiembre de 2009 . Consultado el 29 de septiembre de 2013 .
  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 un código externo" . Consultado el 1 de junio de 2019 .
  23. ^ "Importar desde archivo de encabezado C". Fundación de software Zig . Consultado el 11 de marzo de 2021 .
  24. ^ "4. Un guión de muestra". Gimp.org. 2001-02-04 . Consultado el 29 de septiembre de 2013 .
  25. ^ "Script-Fu y complementos para The GIMP". Gimp.org . Consultado el 29 de septiembre de 2013 .

enlaces externos