En programación y diseño de software, un enlace es una interfaz de programación de aplicaciones (API) que proporciona código de conexión específicamente diseñado para permitir que un lenguaje de programación utilice una biblioteca externa o un servicio del sistema operativo (uno que no es nativo de ese lenguaje).
Características
El término "binding" generalmente se refiere a una correspondencia entre dos elementos. En el contexto de las bibliotecas de software, los enlaces son bibliotecas envolventes que conectan dos lenguajes de programación, de modo que una biblioteca escrita para un lenguaje pueda utilizarse en otro. [ 1 ] Muchas bibliotecas de software están escritas en lenguajes de programación de sistemas como C o C++ . Para utilizar dichas bibliotecas desde otro lenguaje, generalmente de nivel superior, como Java , Common Lisp , Scheme , Python o Lua , se debe crear un enlace a la biblioteca en ese lenguaje, lo que posiblemente requiera recompilar el código del lenguaje, dependiendo de la cantidad de modificaciones necesarias. [ 2 ] Sin embargo, la mayoría de los lenguajes ofrecen una interfaz de funciones externas , como los ctypes de Python y OCaml , y los cffi y uffi de Embeddable Common Lisp. [ 3 ] [ 4 ] [ 5 ]
Por ejemplo, se utilizan enlaces de Python cuando se necesita usar desde Python una biblioteca C existente, escrita para algún propósito. Otro ejemplo es libsvn, que está escrita en C para proporcionar una API para acceder al repositorio de software Subversion . Para acceder a Subversion desde código Java, se puede usar libsvnjavahl, que depende de que libsvn esté instalado y actúa como un puente entre el lenguaje Java y libsvn, proporcionando así una API que invoca funciones de libsvn para realizar el trabajo. [ 6 ]
Entre los principales motivos para crear enlaces de biblioteca se incluyen la reutilización de software, la reducción de la necesidad de reimplementar una biblioteca en varios lenguajes y la dificultad de implementar algunos algoritmos de manera eficiente en algunos lenguajes de alto nivel.
Entorno de ejecución
Una interfaz de lenguaje debe conciliar los entornos de ejecución de los dos lenguajes que conecta, ya que cada lenguaje suele gestionar la memoria, el ciclo de vida de los objetos y la representación de datos de forma diferente. Dos problemas comunes son la gestión del ciclo de vida de los objetos entre los lenguajes y la serialización de datos entre los sistemas de tipos de ambos lenguajes.
En la Interfaz Nativa de Java (JNI), por ejemplo, el código nativo (normalmente C o C++) que recibe una referencia a un objeto Java recibe una referencia local o global . Las referencias locales se eliminan automáticamente cuando el método nativo que las creó regresa a la máquina virtual de Java, mientras que las referencias globales persisten hasta que el código nativo las libera explícitamente; si una referencia global no se libera, el recolector de basura no puede recuperar el objeto al que hace referencia , lo que provoca una fuga de memoria. [ 7 ] [ 8 ]
Un enfoque diferente es el que utiliza Platform Invocation Services (P/Invoke), el mecanismo que Common Language Runtime proporciona para que el código .NET llame a funciones en bibliotecas no administradas. En lugar de exponer funciones explícitas de administración de referencias al programador, P/Invoke serializa automáticamente los argumentos y los valores de retorno entre los tipos administrados de .NET y los tipos no administrados de la biblioteca nativa en el punto de la llamada, basándose en la firma del método y cualquier atributo de serialización proporcionado por el programador; las conversiones de tipo más complejas o ambiguas se pueden controlar explícitamente mediante atributos como MarshalAsAttribute. [ 9 ] [ 10 ]
Modelos de objetos
- Arquitectura común de intermediación de solicitudes de objetos (CORBA): modelo de lenguaje multiplataforma
- Modelo de objetos componentes (COM): modelo multilingüe exclusivo de Microsoft Windows
- Modelo de objetos de componentes distribuidos (DCOM): extensión que permite que COM funcione a través de redes.
- Modelo de objetos de componentes multiplataforma (XPCOM): modelo multiplataforma de las aplicaciones de Mozilla
- Infraestructura de lenguaje común : modelo de lenguaje multiplataforma de .NET Framework
- Freedesktop.org D-Bus : modelo de lenguaje multiplataforma abierto
Máquinas virtuales
Una máquina virtual utilizada para la interoperabilidad de lenguajes proporciona un entorno de ejecución compartido al que se compilan varios lenguajes fuente diferentes, generalmente apuntando a un formato de código de bytes común e independiente del lenguaje . [ 11 ] Los lenguajes que apuntan a la misma máquina virtual pueden interoperar de forma más directa que los lenguajes vinculados a través de una interfaz de función externa, porque comparten el modelo de memoria, la representación de objetos y el recolector de basura de la máquina virtual, lo que permite que una biblioteca escrita en un lenguaje sea llamada desde otro sin una capa de enlace explícita. [ 12 ]
La máquina virtual de Java (JVM) fue diseñada originalmente para ejecutar Java, pero su formato de bytecode ha sido adoptado posteriormente por otros lenguajes, como Kotlin , Scala y Clojure , lo que permite que los programas escritos en estos lenguajes llamen a las bibliotecas de Java, y viceversa, sin necesidad de una vinculación independiente. [ 13 ] [ 14 ] De manera similar, el Common Language Runtime (CLR), la máquina virtual subyacente al .NET Framework , compila el código fuente de cualquier lenguaje .NET compatible a un Common Intermediate Language compartido , lo que permite que lenguajes como C# , Visual Basic .NET y F# interactúen a nivel de objeto. [ 15 ]
Este enfoque difiere de los modelos de objetos independientes del lenguaje, como CORBA o COM, en que se basa en un único motor de ejecución compartido en lugar de un protocolo para que se comuniquen implementaciones separadas; los trabajos académicos sobre máquinas virtuales multilingües han señalado que, a pesar de esto, la interoperabilidad real entre lenguajes que comparten una máquina virtual generalmente requiere que cada implementación de lenguaje aborde individualmente las diferencias en las convenciones de llamada, el orden de los argumentos y la representación de datos. [ 16 ]
Portabilidad
- Objeto portátil : definición de modelo de objetos para lenguajes multiplataforma
Véase también
- Interfaz de programación de aplicaciones (API)
- Interfaz binaria de la aplicación (ABI)
- Convención de llamadas
- SQL incrustado
- Deformación de nombres
- Generador de interfaces y envoltorios simplificado (SWIG): generador de enlaces de interfaz de múltiples lenguajes a múltiples lenguajes, de código abierto.
- Función de envoltura
Referencias
- ↑ "Apéndice A. Creación de una vinculación de lenguaje para cairo". Cairographics.org.
{{cite web}}:|access-date=requiere|url=( ayuda ) ; Falta o está vacío|url=( ayuda ) - ↑ "Estándares, API, interfaces y enlaces". Acm.org.
{{cite web}}:|access-date=requiere|url=( ayuda ) ;|archive-url=está mal formado: flag ( ayuda ) ; Falta o está vacío|url=( ayuda ) - ↑ "ctypes – Una biblioteca de funciones externas para Python". Documentación de Python v3.8.3 . Docs.python.org.
{{cite web}}:|access-date=requiere|url=( ayuda ) ; Falta o está vacío|url=( ayuda ) - ↑ Hickey, Jason; Madhavapeddy, Anil; Minsky, Yaron (2013). "OCaml en el mundo real, capítulo 19. Interfaz de funciones externas" . Recuperado el 19 de julio de 2015 .
{{cite web}}:|archive-date=requiere|archive-url=( ayuda ) - ↑ "Introducción – Manual de usuario de CFFI". Common-lisp.net.
{{cite web}}:|access-date=requiere|url=( ayuda ) ; Falta o está vacío|url=( ayuda ) - ↑ "Preguntas frecuentes sobre Subversion JavaHL". Subclipse.tigris.org. 18 de junio de 2013.
{{cite web}}:|access-date=requiere|url=( ayuda ) ;|archive-date=requiere|archive-url=( ayuda ) ; Falta o está vacío|url=( ayuda ) - ↑ "Capítulo 2: Descripción general del diseño" . Especificación de la interfaz nativa de Java . Oracle . Consultado el 17 de julio de 2026 .
- ↑ "Capítulo 4: Funciones JNI" . Especificación de la interfaz nativa de Java . Oracle . Consultado el 17 de julio de 2026 .
- ↑ "Invocación de plataforma (P/Invoke)" . .NET . Microsoft Learn . Consultado el 17 de julio de 2026 .
- ↑ "Serialización de datos con Platform Invoke" . .NET Framework . Microsoft Learn . Consultado el 17 de julio de 2026 .
- ↑ "Descripción general del entorno de ejecución de .NET" . dotnet/runtime . Microsoft . Consultado el 17 de julio de 2026 .
- ↑ "Una visión general de los lenguajes de la JVM" . Baeldung . Consultado el 17 de julio de 2026 .
- ↑ "Una visión general de los lenguajes de la JVM" . Baeldung . Consultado el 17 de julio de 2026 .
- ↑ "Más allá de Java: lenguajes de programación en la JVM" . InfoWorld . Consultado el 17 de julio de 2026 .
- ↑ "Descripción general del entorno de ejecución de .NET" . dotnet/runtime . Microsoft . Consultado el 17 de julio de 2026 .
- ↑ Brunklaus, Thorsten; Kornstaedt, Lars. "Una máquina virtual para la ejecución en varios lenguajes" (PDF) . Universidad de Saarland . Consultado el 17 de julio de 2026 .
Enlaces externos
- JTC1/SC22/WG11 - Técnicas de vinculación , una norma ISO para la vinculación de lenguajes
- ¿Qué es una vinculación lingüística?
- Compiladores
- Bibliotecas informáticas