Pregunta ¿Cómo funcionan las vinculaciones de idiomas?


¿Cómo funcionan las vinculaciones de idiomas?

Por ejemplo, ¿cómo se pueden hacer enlaces de una biblioteca escrita en un idioma a otro? ¿Las encuadernaciones se escribirían en el mismo idioma que la biblioteca o el idioma para el que están las vinculaciones?

¿Es posible hacer enlaces desde y hacia todos los idiomas o el lenguaje tiene que admitir enlaces de alguna manera? Si ese es el caso, ¿cómo funciona ese soporte?


32
2017-12-28 14:59


origen


Respuestas:


En su mayor parte, la mayoría de los idiomas están escritos en C (Perl, Python, Ruby, Tcl ...) o son compatibles con C (C ++, C #, Objective-C). Por lo tanto, para la mayoría de los idiomas, es fácil usar una biblioteca de C escribiendo algunas funciones de envoltura para convertir las estructuras de datos en ese lenguaje en estructuras de datos de C nativas. Incluso hay una herramienta automática (o semiautomática que depende de la complejidad) para esto: TRAGO.

Esta es una de las principales razones por las que la mayoría de las bibliotecas están escritas en C. Simplemente hace que sea fácil transferir el código de bajo nivel a múltiples idiomas de destino. Los ejemplos de bibliotecas que utilizan esta estrategia incluyen SQLite, Tk y wxWidgets.

Otra estrategia es usar las características del sistema operativo para exportar la biblioteca a una biblioteca compartida de idioma neutral. En Windows esto sería DLL y en Unixen serían bibliotecas compartidas. La mayoría de los productos de Microsoft utilizan esta estrategia, por lo que no importa en qué se escriba el código original, puede acceder fácilmente a la biblioteca, siempre que esté compilada como una DLL. Ejemplos de bibliotecas que no son de Microsoft que usan esta estrategia incluyen libpurple y gtk.

La tercera opción es usar IPC. El método más común es usar sockets porque es familiar para la mayoría de las personas y muy cruzado. Los códigos que usan este método no son, estrictamente hablando, bibliotecas. Son servidores y su "API" son servicios técnicos. Pero para el programador promedio que utiliza los servicios, se parece a las API habituales porque la mayoría de los enlaces de lenguaje abstraen el código de red y presentan llamadas a función / método simples. Los ejemplos de "bibliotecas" que utilizan esta estrategia incluyen Xwindows, scripting Gimp y la mayoría de las bases de datos como MySQL y Oracle.

Existen otras formas más intrincadas de proporcionar acceso a bibliotecas escritas en otro idioma, incluida la incorporación del intérprete de ese idioma, pero las 3 anteriores son las más comunes.


Aclaración

Siento que debo aclarar un poco entre la diferencia de la primera y la segunda aproximación.

En el primer enfoque, la biblioteca aún se compila en un dll o .so como el segundo enfoque, pero la principal diferencia es que el dll debe cumplir con un estándar / protocolo de nivel superior. Tcl, por ejemplo, no puede cargar ningún dll arbitrario porque espera que todos los valores que entran y salen de una función sean un puntero a un struct Tcl_Obj. Por lo tanto, para usar una biblioteca compilada como un archivo dll viejo y simple necesitaría compilar otro dll que acceda al primer dll a través de funciones de contenedor que conviertan todas las variables y parámetros de funciones en struct Tcl_Obj*.

Pero algunos lenguajes como VB pueden cargar CD dlls antiguos. Entonces ese sería un ejemplo del segundo enfoque.


25
2017-12-28 16:13



En teoría, se podría construir un marco vinculante que podría tomar un enfoque independiente del lenguaje, pero más a menudo, entonces, las características vinculantes no se construyen dentro del lenguaje (marco) dado.

Aumentar un conjunto de características sería notoriamente difícil cuando se toma un enfoque agnóstico. Esto se ve a menudo cuando se intenta desarrollar código agnóstico de base de datos, por ejemplo, sin aprovechar el conjunto de características que proporciona el motor de base de datos ya que se debe usar el denominador más común.

La base de enlaces se reduce a la notificación; notificación de que algo ha cambiado. Esto generalmente se puede manejar a través de un patrón de publicación / suscripción que, por definición, es independiente del idioma.


1
2017-12-28 15:11