2011-07-20 20 views
6

Estoy sin preguntar acerca de CUANDO para vincular diferentes lenguajes de programación.Cómo combinar diferentes lenguajes de programación

Esta es una pregunta bastante general, pero personalmente estoy trabajando en Linux.

Lo que yo quiero entender es el proceso por el cual los diferentes lenguajes de programación pueden ser combinados , me encontré con un buen artículo sobre la combinación de C/C++/Fortran: http://www-h.eng.cam.ac.uk/help/tpl/languages/mixinglanguages.html.

Por lo que entiendo la mayoría de los compiladores realizan dos etapas: (¿posiblemente nombres de función)

  1. traducir los archivos de idioma en archivos de objetos que contienen código máquina, pero aún contienen algunos símbolos

  2. Vinculación los archivos de objeto juntos, solo en esta etapa, el Vinculador verifica que las funciones en los archivos de objeto sean invocables.

creo que el problema con la combinación de diferentes idiomas es renombrado de nombres que significa que los nombres de las funciones se cambian cuando se convierten en código objeto.

Las preguntas son:

  1. No se puede de alguna manera descubrir los nombres de las funciones destrozados de antemano y que especifique de forma explícita en el lenguaje de programación o mejor, no hay un software que ya se hace eso?

  2. No entiendo completamente cómo están vinculadas las bibliotecas dinámicas, pero ¿pueden los diferentes lenguajes interactuar con los mismos que los programas interactúan con las bibliotecas dinámicas?

p.s El objetivo principal es llamar a las funciones escritas en otro idioma.

Respuesta

6

El problema de vincular diferentes archivos de objetos juntos generalmente se reduce a convenciones de llamadas de subrutina. Básicamente, cuando realiza una llamada a una rutina ubicada en otro archivo de objeto, su compilador tendrá que saber qué nombre tendrá ese otro archivo de objeto internamente, cómo pasar todos sus parámetros y qué (si hay) configuración y código de limpieza la rutina requerirá. Todo esto se agrupa generalmente bajo el encabezado de calling convention s.

Cada compilador tiene sus propias convenciones de llamada que le gusta usar para las subrutinas. Nota: dije "compilador", no el lenguaje. La convención de llamadas de C en Linux es diferente de la convención de llamadas de C en Windows.

Así que cuando se mezclan idiomas, se necesita alguna manera de decirle al compilador que la llamada o la subrutina llamada utilicen la convención de llamadas del otro idioma. La convención de C es popular para usar como una especie de "lingua franca", ya que casi todas las plataformas tienen un compilador de C. Sin embargo, algunas plataformas (p. Ej .: Windows) tienen varias convenciones de llamadas populares.

Así que ahora hacemos la pregunta que pidió en los comentarios:

¿Hay una forma común de "decirle al compilador que utilice el convenio de llamada de la otra lengua"?

Y la respuesta es: "No, en realidad no". Algunos lenguajes tienen formas definidas de utilizar convenciones específicas de llamadas de otro idioma. Por ejemplo, C++ le permite poner extern "C" en las declaraciones para decirle al compilador que la (s) declaración (es) en cuestión usan la convención de llamada C. Ada logra lo mismo con pragma Convention (X,...), donde X es el nombre de la convención. C, Fortran y Cobol están definidos por el idioma, pero cualquier otra cosa admitida (p. Ej .: Windows 'Stdcall) es la implementación definida.

Sin embargo, si tiene un par de idiomas cuyos compiladores nunca pensaron el uno en el otro, entonces no tiene más remedio que decirles a los dos que utilicen una tercera convención que ambos conozcan (normalmente las C). Por ejemplo, para obtener estándar C++ y Ada para interoperar, debe hacer que el código del servidor exporte sus rutinas usando la convención C, y decirle al código del cliente que las rutinas a las que llama usan la convención C.

+0

Gracias por la respuesta, ¿hay alguna manera común de "decirle al compilador que use la convención de llamadas del otro idioma? "¿?" – fiftyeight

+0

Esta es una gran respuesta, para aclarar, le agradecería si pudiera decirme si lo siguiente es correcto: solo la Convención ABI/Calling importa si puede unir diferentes objetos, si deseo tener un alto - lenguaje de nivel como Perl o PHP (que están escritos en C) pueden llamar a mi función, siempre que la función use el C ABI, funcionará. Solo necesito agregar el objeto compartido al archivo de configuración (como php.ini) o vincularlo de alguna otra manera. – fiftyeight

+1

@fiftyeight, para Perl, eche un vistazo a ['Inline :: C'] (http://search.cpan.org/~sisyphus/Inline-0.48/C/C.pod). Siempre que use el C ABI, habrá una forma u otra de hacerlo funcionar para un determinado lenguaje de scripting en la mayoría de los casos. Las formas de hacerlo funcionar dependerán de los detalles de la situación. Pero tenga en cuenta que la mayoría de los lenguajes de scripting están escritos en C. Para los implementados en la parte superior de la JVM, tendrá que recurrir a las instalaciones de la JVM para la interoperación de código nativo (JNI y otras cosas). – Lumi

0

El "estándar" consiste en utilizar nombres no dañados cuando se combinan programas de diferentes idiomas. El cambio de nombre puede desactivarse para símbolos específicos en C++ al declararlos con extern "C". C no destruye los nombres.

0

Todos los archivos ejecutables de la biblioteca contienen algún tipo de interfaz. Si no lo hicieran, ningún software podría trabajar con ellos. Es más probable que los métodos internos cambien para ser más eficientes. Además, muchos idiomas le permiten desactivar el "mapeo" en el nivel del compilador.

Vinculación, como una explicación simple (probablemente me dinked para esto?), Es el empaquetado en un solo archivo. Las clases conservan la misma interfaz que las bibliotecas no vinculadas, al menos desde un punto de vista de programación externo.

1

Diferentes idiomas definitivamente pueden usar las mismas bibliotecas. En el viejo Windows Visual Basic era bastante común cargar dinámicamente las funciones de la API de Windows, por ejemplo.

Todo lo que necesita para la vinculación entre idiomas es un acuerdo sobre las convenciones de llamada de la función, junto con el conocimiento de los nombres de las funciones.Lo primero tiene que hacerse buscando la documentación; este último tiene que buscarse en el compilador que creó los objetos o las bibliotecas. Por ejemplo, gcc compilará C sin nombres manipulables, por lo que puede consultar directamente los nombres de las funciones en su fuente C, mientras que g++ compilará el código C++ con nombres mutilados y será mejor que exponga las funciones C a través de declaraciones extern "C".

Básicamente, siempre que sus objetos o librerías expongan solo la C ABI, debería haber un amplio soporte para enlazar a otros lenguajes. Es mucho más difícil si quiere usar una biblioteca nativa de C++, por ejemplo, ya que en ese caso sus idiomas extranjeros tienen que implementar el ABI de C++ correcto. Es similar para exportar código de, digamos, Fortran, pero creo que se puede hacer que uno solo use el C ABI.

+0

No entiendo muy bien la última parte, ¿qué quiere decir con "sus objetos o bibliotecas exponen solo la C ABI" – fiftyeight

+0

Bueno, sus bibliotecas podrían estar utilizando todo tipo de cosas internas (como C++) que no podría tener sentido externamente, pero mientras las funciones que desea exponer a otros sigan el C ABI, otros programas pueden vincularlas dinámicamente. –

+0

¿Cómo puedo saber si el compilador/idioma que uso es compatible con C ABI, hay alguna manera de saber esto? – fiftyeight

Cuestiones relacionadas