¿Es posible crear un programa o software híbrido usando múltiples idiomas?

Lea wikipages sobre Porting (algún software), Conjunto de instrucciones, Convención de llamada, Interfaz binaria de aplicación, Lenguaje de programación, Compilador, Sistema operativo.

Tenga en cuenta que un lenguaje de programación es una especificación escrita en algún documento (un buen ejemplo del cual es R5RS) y la mayoría de las especificaciones [lenguaje de programación] no hablan de interoperabilidad con otros lenguajes de programación, con notables excepciones como C ++ y Ada. Por lo tanto, en principio es difícil codificar un software híbrido de una manera totalmente portátil.

En la práctica, muchos softwares grandes están escritos no solo en contra de un lenguaje estándar, sino para algunas implementaciones de ellos, o al menos para algunas convenciones de llamadas o ABI o sistemas operativos (o especificaciones como POSIX).

Por lo tanto, en la práctica, muchos programas grandes (p. Ej., Líneas de software multimillonarias) están codificados en varios idiomas, para algunas implementaciones específicas de ellos.

El lenguaje C y la convención de llamada (de manera implícita, siguiendo algunos ABI comunes) se usa hoy como una base común, y la mayoría (casi todas) las implementaciones de lenguaje de programación de hoy definen una forma (y convenciones de llamada) para llamar a la función C desde o hacia el otro idioma. Lea la interfaz de la función extranjera.

En realidad, en la práctica, cuando se codifica en un lenguaje de alto nivel como Common Lisp, Haskell, Ocaml, Prolog, … siempre hay algún código C involucrado (al menos generalmente para el tiempo de ejecución y la recolección de basura). Pero la forma práctica de llamar al código C desde alguna otra implementación de lenguaje de programación es a menudo específica.

Absolutamente lo es. Es la única forma de hacer algunas cosas, de hecho.

Si está utilizando algún tipo de entorno de desarrollo razonable, ese entorno y el sistema de lenguaje de programación que está utilizando (suponiendo que no es un desarrollador de Javascript, sino que se está desarrollando en un lenguaje compilado para ejecutarse en iron, no en el navegador) está construido de esa manera.

La clave está en comprender los vínculos, en cómo se transfieren las variables y en los resultados de las llamadas a funciones y procedimientos en los distintos idiomas utilizados.

Por ejemplo, FORTRAN es un lenguaje de llamada por referencia, por lo que solo pasa las direcciones de las variables a llamadas a funciones y procedimientos. Es muy fácil unir el código que te permite llamar a rutinas FORTRAN desde, digamos C.

Pero si pasa en una matriz de más de una dimensión, debe comprender cómo se presenta la memoria para las diversas dimensiones, y luego hacer ajustes a medida que avanza. Si está pasando una matriz almacenada en orden de fila mayor a un idioma donde el tiempo de ejecución opera en columna mayor … sí.

Y hay cosas que son difíciles. Como pasar objetos a lenguajes no orientados a objetos, o viceversa.

Casi todo esto se puede superar con un estudio suficiente de cómo funciona el tiempo de ejecución y cómo el lenguaje construye tanto los objetos de datos como las llamadas a procedimientos, pero lleva tiempo y esfuerzo.

Escribí un gran programa donde la lógica principal estaba en LISP, pero el trabajo pesado de matemática se realizó en FORTAN, y usé C para pegarlo todo junto con una pizca de ensamblador en los lugares donde no podía hacerlo de otra manera camino.

Sí … esto es realmente muy común para los sitios web. Usamos muy a menudo PHP en el servidor y JavaScript en el cliente.

Pero eso podría verse como “trampa” porque esas dos piezas de software se ejecutan en computadoras diferentes.

Un mejor ejemplo podría ser algo así como un videojuego, donde las partes del software que tienen que ejecutarse muy rápidamente, como el código gráfico, están escritas en C ++, pero las funciones de nivel superior como AI o la interfaz de usuario podrían estar escritas en un lenguaje de secuencias de comandos como Lua o Python.

Otros ejemplos son las aplicaciones para teléfonos celulares: en los teléfonos Android, el sistema operativo está diseñado para funcionar mejor con los programas Java, pero cuando necesita más velocidad, puede escribir secciones de código críticas en C ++.

En la informática integrada, es común escribir las funciones de nivel superior en C o C ++ y quizás escribir el código de nivel más bajo que tiene que manejar las interrupciones e interactuar con los pines de E / S individuales y tal en el código de máquina.

Otro ejemplo son los programas gráficos de alto rendimiento que tendrán una parte de su código ejecutándose en la CPU (probablemente en C ++) y otras partes ejecutándose en la GPU, escritas en algo como GLSL o HLSL, que son lenguajes especializados para la programación de gráficos GPU.

Pero sí, es muy común que los programas empleen una combinación de dos idiomas.

Claro, es bastante común. Algunos ejemplos:

  • El núcleo de su sistema operativo probablemente tenga algunos segmentos escritos en lenguaje ensamblador nativo, pero la mayor parte del resto probablemente esté escrito en C.
  • Muchos programas comunes de Lisp, Perl, Python, C ++, Ruby, COBOL, etc. se basan en bibliotecas escritas en C.
  • Las aplicaciones más grandes pueden tener una sección central o de motor que está escrita en un lenguaje de mayor rendimiento que puede ser más difícil de depurar, con un lenguaje de script más flexible que, por ejemplo: Firefox está escrito en C y C ++ con mucho XUL y JavaScript para la interfaz de usuario. Los videojuegos a menudo tienen la mayor parte del contenido del juego escrito en un motor de secuencias de comandos más liviano sobre el núcleo compilado.
  • En la misma línea, muchos programas contienen intérpretes para sus propios “mini” idiomas para cosas como archivos de configuración.
  • Las aplicaciones “apiladas” o de varios niveles pueden comunicarse a través de varios flujos de comunicación entre procesos, por ejemplo, TCP / IP o canalizaciones locales o mediante la transferencia de archivos entre los componentes. Puede tener fácilmente un conjunto de procedimientos almacenados SQL que devuelven datos a un programa CL que a su vez se comunica con un script Ruby que escribe un informe a través de un programa Perl.
  • El sistema de “niveles múltiples” más común hoy en día es tener un núcleo de servidor que está escrito en un idioma (o más) que se conecta a través de una red con un programa cliente JavaScript que se ejecuta en un navegador.

En la mayoría de los sistemas, existen esencialmente tres “puentes” principales entre idiomas:

  • El C ABI. Llamar a un programa en C está extremadamente estandarizado. La mayoría de los otros lenguajes pueden llamar a un programa C a través de la interfaz binaria local de la aplicación C. En C ++ se llama una llamada “C” externa , en CL es una FFI (Interfaz de función externa), Perl tiene XS para vincular a funciones de C, & c. La mayoría de estos lenguajes también proporcionan una forma de exportar algunas de sus propias funciones al C ABI, que será llamado por otro programa. Aunque estas llamadas usan el C ABI, no necesariamente llaman a un programa C, por ejemplo, uno podría llamar a una función escrita en FORTRAN desde un programa Perl usando el C ABI.
  • Dentro de la máquina virtual Java. Los lenguajes JVM generalmente pueden llamarse entre sí utilizando las convenciones de llamadas Java.
  • Sobre flujos: archivos, tuberías, FIFO, sockets de red o similares.

Editar: en realidad olvidé citar la décima regla de Greenspun:

Cualquier programa C o Fortran suficientemente complicado contiene una implementación ad hoc, especificada informalmente, llena de errores y lenta de la mitad de Common Lisp.

La mayoría de los lenguajes de programación (¿todos?) Tienen funciones / comandos / clases que permiten la inclusión de código de otros lenguajes. Lo he usado para escribir varios programas, incluido uno que descarga contenido de Internet para poblar bases de datos de Access.

SQL se usa en todos los lenguajes que tratan con bases de datos. Hay muchos ejemplos

Creo que es raro encontrar un sistema significativo escrito en un solo idioma en estos días. Es muy probable que sea múltiple de bibliotecas escritas en C / C ++ vinculadas a programas en Go Haskell. Los sistemas tienen intérpretes integrados como Lua. Configuración escrita en JSON, YAML, XML o UCL; acceso a la base de datos usando SQL. Front-end en UI en QML o una combinación de HTML / CSS y JavaScript. Creo que tenemos una gran caja de herramientas para trabajar en una aplicación grande en lugar de tratar de introducirla en un solo idioma.

Incluso si intenta escribir en un solo idioma, necesitará crear scripts.

Si. Incluso es bastante común.

Algunos programas en C pueden llamar a una rutina de lenguaje ensamblador. Algunos programas Java o Python pueden llamar a una rutina C (o varias). Un motor de juego se puede escribir en C o C ++, y la lógica del juego en sí se puede codificar en un lenguaje de script como Lua. Y así.

Claro, la mayoría de los sitios web HTML utilizan PHP, Javascript y CSS. Los juegos pueden tener un motor en un idioma y en realidad hacerse en otro. Estoy bastante seguro de que Unity funciona así. Ahora no puedo tener dos idiomas dentro de un documento, que yo sepa.

Es mas que posible. Dependiendo de sus circunstancias, el tamaño del proyecto y los requisitos, puede ser aconsejable utilizar varios idiomas para ubicarlos para resolver los problemas que son mejores para el desarrollo de soluciones.

Si. Muchos sitios web y juegos usan varios idiomas.