Pregunta

Escuché que algunas personas programan en varios idiomas en un proyecto. No puedo imaginar cómo interactúan los idiomas entre sí.

Quiero decir que no hay un método Java como

myProgram.callCfunction(parameters);

¿nunca sucede o me equivoco?

¿Fue útil?

Solución

Tener múltiples idiomas en un proyecto es bastante común, sin embargo, los principios detrás no siempre son simples.

En el caso simple, se compilan diferentes idiomas en el mismo código. Por ejemplo, el código C y C ++ generalmente se compila en ensamblador de máquina o C # y VB.Net se compila en IL (el lenguaje que entiende el tiempo de ejecución de .NET).

Se vuelve más difícil si los idiomas / compiladores usan un sistema de tipo diferente. Puede haber muchas formas diferentes, los tipos de datos básicos, como enteros, flotantes y dobles, se representan internamente, e incluso hay más formas de representar cadenas. Al pasar tipos entre los diferentes idiomas, debe asegurarse de que ambos lados interpreten el mismo tipo o, si no, los tipos están correctamente asignados. Este tipo de mapeo de tipos también se conoce como marshalling .

Ejemplos clásicos de interoperabilidad entre diferentes lenguajes de programa son (principalmente del mundo de Windows):

  • Los diversos idiomas disponibles para la plataforma .NET. Esto incluye C #, VB.Net, J #, IronRuby, F #, XSLT y muchos otros lenguajes menos populares.
  • Los componentes COM nativos escritos en C ++ o VB se pueden usar con una gran variedad de lenguajes: VBScript, VB, todos los lenguajes .NET, Java
  • Las funciones de la API Win32 se pueden llamar desde .NET o VB
  • IPC (comunicación entre procesos)
  • Corba , probablemente el enfoque más completo (y más complejo)
  • Servicios web y otras arquitecturas orientadas a servicios, probablemente el enfoque más moderno

Otros consejos

Generalmente, cualquier proyecto web de tamaño decente utilizará alrededor de cinco idiomas: HTML, CSS, Javascript, algún tipo de lenguaje de "hacer las cosas" del lado del servidor (ASP, JSP, scripts CGI con Perl, PHP, etc.), y alguna variante de SQL para la conectividad de la base de datos.

(Esto es, por supuesto, descartar el argumento sobre si HTML y CSS cuentan o no como lenguajes de programación; yo soy el campo “son, pero no solo lenguajes completos de Turing”, pero eso es todo otro hilo.)

Algunos ejemplos de cómo funcionan todos juntos:

Si va por la ruta de mejores prácticas, la estructura de una página web está en HTML, y las instrucciones sobre cómo mostrarla están en CSS, que podrían estar en el mismo archivo, pero no es necesario ser. El CSS contiene un montón de clases, a las que se refiere el HTML, y depende del navegador descubrir cómo hacer clic en ellas juntas.

Dando un paso más allá, cualquier script de JavaScript en esa página puede alterar cualquiera de los HTML / CSS que están presentes (cambiar el contenido de las entidades HTML, cambiar una clase CSS por otra, cambiar el comportamiento del CSS y etc.) Hace esto a través de algo llamado Document Object Model, que es esencialmente un lenguaje y una API independiente de la plataforma para manipular páginas HTML de una manera similar a un objeto (en ese punto, retrocederé lentamente y solo proporcionaré un enlace al artículo wiki relevante .)

Pero entonces, ¿de dónde viene todo el HTML / CSS / Javascript? Eso es lo que hace el lenguaje del lado del servidor. En la forma más simple, el lenguaje del lado del seridor es un programa que devuelve una cadena gigante que contiene una página HTML como salida. Esto, obviamente, puede ser mucho más complejo: los formularios HTML y los parámetros de cadena de consulta se pueden usar como entrada para nuestro programa del lado del servidor, y luego tiene todo lo de AJAX donde el javascript también puede enviar datos directamente al idioma del servidor. También puede imaginarse dónde el idioma del servidor puede personalizar el HTML, CSS y Javascript que se escupe, esencialmente, tiene un programa en un idioma escribiendo un programa en otro idioma.

El lenguaje del lado del servidor a la conexión SQL funciona de la misma manera. Hay muchas maneras de hacerlo más complejo y seguro, pero la forma más sencilla es que el lenguaje del servidor cree dinámicamente una cadena con un comando SQL, entregue la base de datos a través de algún tipo de conector y regrese Un conjunto de resultados. (Este es un caso en el que realmente tiene una función que se reduce a someValue = database.executeThisSQLCommand (SQLString)).

Entonces, para concluir, los diferentes idiomas en este caso se comunican escribiendo programas entre sí o entregando datos en formatos muy simples y fáciles de analizar que todos pueden entender. (Cadenas, principalmente.)

Varios idiomas en uso se denominan "interoperabilidad" o "interoperabilidad" para abreviar.

Tu ejemplo es incorrecto. Java puede llamar a funciones C.

El lenguaje proporciona un mecanismo para la interoperabilidad.

En el caso de .NET, los idiomas se compilan en IL como parte de la CLI. Por lo tanto, cualquier lenguaje .NET puede interoperar (métodos de llamada definidos por) módulos definidos en cualquier otro lenguaje .NET.

Como ejemplo:

Puedo definir un método en C #

static void Hello(){ Console.WriteLine("Hello World");}

Y puedo llamarlo desde Python (IronPython)

 Hello()

Y obtenga el resultado esperado.

Hablando en general, algunos idiomas interoperan mejor que otros, especialmente si los autores del lenguaje específicamente hicieron de la interoperabilidad una característica del idioma.

Varios idiomas pueden interactuar con:

  1. Entrada / salida canalizada (CUALQUIER idioma puede hacer esto porque la entrada y la salida deben implementarse necesariamente en cada no juguete idioma)
  2. Tener el código en un idioma compilar a una biblioteca nativa mientras que el otro admite llamar a código nativo.
  3. Comunicación a través de una conexión de red de bucle invertido. Usted puede tener dificultades con la interferencia del firewall de esta manera.
  4. Bases de datos. Estos pueden considerarse como un "universal". datos formato de almacenamiento y, por lo tanto, la mayoría de los idiomas pueden acceder a él con extensiones de base de datos. Esto generalmente requiere un programa para finalizar la operación antes del siguiente programa puede acceder a la base de datos. Además, todas las 'comunicaciones' son generalmente escrito en el disco.
  5. Si los idiomas involucrados se ejecutan en el mismo tiempo de ejecución (es decir, .NET, JVM), generalmente puede pasar datos de objetos de un idioma directamente al otro con poca impedancia.

En casi todos los casos, debe convertir cualquier comunicación a una común formato antes de que se pueda intercambiar (la excepción son los idiomas en el mismo tiempo de ejecución). Es por eso que raramente se usan múltiples idiomas en uno proyecto.

Trabajo en un proyecto de gran empresa que consta de (en el último recuento) alrededor de 8 idiomas. La mayoría de la comunicación se realiza a través de un bus de mensajes de nivel empresarial que contiene enlaces para múltiples idiomas para aprovechar y pasar datos de un lado a otro. Se llama tibco .

Podría tener una aplicación donde la mayor parte del trabajo se realiza en Java, pero puede haber una parte de ella, como quizás un analizador de datos o algo escrito en Python o lo que sea. En realidad, casi dos aplicaciones separadas, quizás el analizador solo está trabajando en los archivos y luego su aplicación principal en Java las está usando para algo. Si alguien me preguntara qué usé en este proyecto, diría "Java y Python".

Hay muchas formas diferentes de usar diferentes idiomas en un proyecto Hay dos categorías principales que vienen a la mente

  1. Usar diferentes idiomas juntos para construir una aplicación. Por ejemplo, usar Java para construir la GUI y usar JNI para acceder a la API de C (para responder a su pregunta puede llamar a las funciones de C desde Java;))
  2. Usar diferentes idiomas juntos en un proyecto pero no son parte de la misma aplicación. Por ejemplo. Actualmente estoy trabajando en una aplicación para iPhone que utiliza una gran cantidad de texto. Actualmente estoy usando Python en tres idiomas (para trabajar con las fuentes originales del texto), SQL (para poner los resultados de la aplicación python en un formato fácilmente accesible desde la API sqlite3 del iphone) y Objectiv C para construir la aplicación real. Aunque el producto final solo será el Objetivo C, he usado otros dos lenguajes para llegar al producto final

Hay varias formas en que se pueden usar varios idiomas en un proyecto. Algunos ejemplos:

  • Puede escribir una DLL en, digamos, C, y luego usar esa biblioteca desde, digamos, un programa VB.
  • Podría escribir un programa de servidor en, digamos C ++, y tener muchas implementaciones de lenguaje diferentes del cliente.
  • Un proyecto web a menudo usa muchos idiomas; por ejemplo, un programa de servidor, escrito en, digamos, Java (un lenguaje de programación), que obtiene datos de una base de datos usando SQL (un lenguaje de consulta), envía el resultado al navegador en HTML (un lenguaje de marcado), que el usuario puede interactuar con el uso de Javascript (un lenguaje de script) ...

Depende del tipo de proyecto. Si desea experimentar, puede configurar un proyecto web, en .NET, y cambiar el idioma página por página. No funciona como se muestra en su pseudocódigo, pero es de varios idiomas. Por supuesto, el directorio de código real debe ser un solo idioma.

Hay un par de formas en que el código en los idiomas puede interactuar directamente. Mientras los datos que se pasan entre el código estén en el formato correcto, a nivel de bits y bytes, entonces no hay ninguna razón por la cual los diferentes idiomas no puedan interoperar. Este enfoque se utiliza en el desarrollo tradicional de DLL de Windows. Incluso en diferentes plataformas, si puede obtener el formato correcto (mire el endian grande / pequeño si está interesado) funcionará mientras su enlazador (no compilador) sepa cómo unir el código.

Más allá de eso, hay muchas otras formas en que los idiomas pueden comunicarse entre sí. En el mundo .Net, el código se compila en código IL, que es el mismo para todos los idiomas, de esta manera C #, VB.Net son todos iguales y pueden llamarse / trabajar entre sí sin problemas.

Mal. Si no hay una necesidad urgente, manténgase en un solo idioma. Estás aumentando las dependencias y la complejidad. Pero cuando tiene un código existente que proporciona una funcionalidad interesante, puede ser más fácil unirlo que recrearlo.

Solo para agregar a la lista de ejemplos, es bastante común optimizar el código Python en C o C ++ o escribir una biblioteca C para vincular otra biblioteca a Python.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top