¿Es posible combinar lenguajes de programación?

27

He estado programando durante un tiempo, he escrito algunos programas rudimentarios y quiero seguir aprendiendo. Llegué a ese punto en el que simplemente no sabes qué aprender a continuación, y me gustaría hacer una pregunta por mi propia curiosidad.

La pregunta, en pocas palabras, es si puede combinar múltiples lenguajes de programación en 1 resultado. Por ejemplo, ¿puede ser posible este código?

<html>
cout << "Hello world!";
</html>

o

import java.util.Scanner;
cout << "Insert a number from 1 to 10";
Scanner n = new Scanner(System.in);
System.out.println("The value you entered was" +n.newLine());

Esto parece una pregunta tonta, pero no puedo saber si es posible o no, así que por eso lo hago. En esta pregunta, noto que está usando el código Python en el código html, si mi ejemplo anterior no es posible, ¿qué hizo?

Bugster
fuente
12
Para que esto funcione (sin hacer que las personas se vuelvan locas), uno necesita al menos reglas estrictas con respecto a cómo interactúan y qué partes deben procesarse y en qué idioma.
66
Tomaría un hellova lexer / parser.
Chad Harrison
2
@Brian Lua está incrustado porque el intérprete está vinculado a algún código C o C ++ y se utiliza para ejecutar código Lua almacenado en cadenas o archivos externos, posiblemente exponiendo objetos C / C ++ al código Lua. Lua no está (no es frecuente, si es que lo está) "incrustado" en el sentido de esta pregunta.
2
Es como hacer cinco alfabetos con diferentes símbolos para las 26 letras y mezclarlos en un solo libro: sin sentido, irritante y redundante.
ThomasX
77
Creo que la gente está olvidando claramente el caso de uso más común (y solo válido en la vida real que se me ocurre) de "combinación de lenguajes": fragmentos ASM en programas C / C ++ , generalmente por razones de rendimiento.
TC1

Respuestas:

43

Tu primer ejemplo es más o menos posible. Por lo general, tales cosas suceden en PHP (y otros lenguajes de programación web relacionados) como este:

<HTML>
<?PHP
call_some_php_function(1,2,"a","b"); /* This is may return nothing, a text string, or actual HTML markup code */
?>
</HTML>

Algunos puntos importantes a tener en cuenta sobre este ejemplo:

  • HTML NO es un lenguaje de programación, es un lenguaje de marcado.
  • El PHP y HTML no se ejecutan / interpretan en el mismo lugar: el código PHP lo ejecuta un intérprete PHP que se ejecuta en el servidor y el resultado se "inyecta" en el HTML circundante. Luego, todo el blob se envía al cliente / navegador que representa el HTML completo.

Su segundo ejemplo parece una especie de mash-up de C ++ y Java. Es posible que los módulos compilados escritos en diferentes idiomas se comuniquen entre sí, pero combinar Java y C ++ en el mismo archivo fuente sería extremadamente confuso y difícil: ¿cómo podría saber el compilador qué declaraciones son Java y cuáles son C ++?

Supongo que en teoría podrías escribir un compilador / preprocesador especial con indicadores de "lenguaje" como:

Java
{
    import java.util.Scanner;
}
C++
{
   cout << "Insert a number from 1 to 10";
}
Java
{
    Scanner n = new Scanner(System.in); //Actually, this line *could* be a C++ line - it's hard for me to tell just by looking at it.
    System.out.println("The value you entered was" +n.newLine());
}

Pero honestamente no estoy seguro de que ganarías algo útil al hacer esto.

Además, ¿cómo manejaría este entorno de lenguaje híbrido las características del lenguaje que son incompatibles entre los dos?

FrustratedWithFormsDesigner
fuente
Un ejemplo todo el mundo se olvidó de (incluido yo mismo), por lo que no dude en agregarlo a su respuesta: CUDA. Es una mezcla de dos lenguajes C muy diferentes, con algunas funciones compiladas para un dispositivo (GPU), y algunas restantes en un host, con la capa de comunicación que se infiere.
SK-logic
77
No es raro tener JavaScript, así como HTML y PHP en una página. Horrible, pero no infrecuente.
Michael Borgwardt
1
No está tan familiarizado con PHP, pero el código ASP.NET (ya sea C # o VB.NET) genera HTML y JavaScript, y el JavaScript a menudo está incrustado allí en la página .aspx. La separación total a menudo se cita como un ideal, pero una descripción general rápida de las preguntas en ASP.NET con etiqueta SO le dará una idea de lo complejo que puede ser.
sq33G
@ sq33G: ASP.NET genera código HTML. Puede incluir JavaScript si lo desea. ASP.NET ciertamente NO es lo que el autor describe como querer hacer.
Ramhound
Iba a mostrar PHP / HTML / JS en un documento si nadie más lo había hecho.
Ben Brocka
19

Respuesta corta

Realmente no.


Respuesta larga

Incrustación

Generalmente, un solo archivo fuente contiene código para exactamente un lenguaje de programación. Es poco común que varios idiomas se combinen en un solo archivo por un par de razones:

  • Analizar varios idiomas sintácticamente diferentes a la vez es extremadamente difícil (si no imposible).
  • Diferentes lenguajes tratan la programación de manera diferente . La noción de Haskell de una función es diferente a la de C ++.

Enlace

Se pueden combinar diferentes lenguajes de programación que comparten una interfaz binaria de aplicación común para formar un único ejecutable o biblioteca. Obtener las firmas de los dos idiomas disponibles entre sí a menudo requiere un poco de trabajo, pero existen herramientas para facilitar el proceso.

Políglotas

El código Polyglot es válido y equivalente en más de un idioma. La página 404 de Stack Overflow presenta uno de estos programas:

Stack Overflow 404 polyglot

Esto imprime "404" en Python, Perl, Ruby, C, Brainfuck y Befunge.

Conclusión

Los idiomas rara vez se mezclan dentro de los archivos, y cuando lo son, es para reír . La gente incluso trata de evitar mezclar idiomas dentro de los proyectos debido a la molestia adicional que presenta. Entonces, si bien puede ser técnicamente posible, mezclar diferentes idiomas no es común ni pragmático.

desconocido
fuente
No veo a Ruby aquí ...
Jason Lewis
@JasonLewis No conozco a Ruby, pero esta publicación dice que evalúa la línea # 4.
Maxpm
99
Los idiomas no siempre se mezclan para reír. La mayoría de los compiladores de C le permiten mezclar ensamblaje y C, y también lo hacen muchos Forths. En los años ochenta, uno de los mejores dialectos BÁSICOS del juego, Acorn's BBC Basic, le permitía mezclar el ensamblaje 6502 y esa era una característica muy deseable en ese momento. Ciertamente hizo reír a los usuarios de la BBC, pero casi todos los demás lloraron, especialmente aquellos que tuvieron que armar el código de máquina 6502 a mano y pegar códigos de operación sin procesar en sus programas en las DATAdeclaraciones. No es que esté amargado ni nada. Noooo
Alexios
1
@ SK-logic SQL es un lenguaje de consulta estructurado, no un lenguaje de programación.
Maxpm
1
Una de las cosas tristes sobre el desarrollo de software moderno es que las aplicaciones de múltiples idiomas son mucho más difíciles ahora. En los días de DOS, casi todo se compilaba en el mismo archivo de objeto y usaba las mismas convenciones de paso de parámetros. Fue realmente fácil vincularlos. Hoy en día, no tanto ...
Brian Knoblauch
7

Sí, es posible de hecho. No de la forma en que lo has imaginado, por supuesto. Existen algunos idiomas creados específicamente para este propósito.

En la práctica, puede ser muy útil mezclar varios idiomas específicos de dominio en un solo idioma de host. Rara vez es necesario mezclar dos o más lenguajes igualmente "de propósito general" en un solo archivo de código fuente, aunque a menudo encontrará proyectos escritos en ambos, por ejemplo, VB.NET y C #, con diferentes componentes de lenguaje compilados por separado.

En cuanto a HTML, es solo un lenguaje de marcado. A menudo puede encontrar un código del lado del servidor (por ejemplo, en VB.NET), marcado HTML y código Javascript del lado del cliente mezclados en un solo archivo fuente, aunque muchos lo consideran una mala práctica.

SK-logic
fuente
7

Esto a menudo se llama código políglota : hay algunos ejemplos divertidos / locos si sigues el enlace o en varios otros lugares de la web. La mayoría de estos son solo por diversión / para demostrar que es posible.

Más en serio, hay varios ejemplos de la vida real donde dos o más idiomas diferentes se pueden combinar de manera útil:

  • Plantillas web : lenguajes como los archivos PHP o JSP mezclan código en HTML. Las opiniones difieren ampliamente sobre si esta es una buena idea o no.
  • Lenguajes de macro : a menudo, un lenguaje de macro se mezcla en el archivo de origen, como las macros de preprocesador C / C ++. También hay casos interesantes como Lisp donde el lenguaje macro es el propio Lisp (la única diferencia es si el código se ejecuta en tiempo de compilación o tiempo de ejecución)
  • DSL : a menudo se define un lenguaje específico de dominio para ayudar a resolver un problema particular de manera efectiva, que está incrustado en el código fuente de otro idioma. Aquí hay un ejemplo de un hermoso DSL para SQL que se puede incrustar en el código Clojure.
  • Scripting : algunos lenguajes dinámicos son particularmente útiles para scripts cortos y están diseñados para integrarse en el software escrito en otro idioma. Las secuencias de comandos Groovy, por ejemplo, son muy fáciles de integrar en una aplicación Java.
  • Proyectos políglotas : a veces tiene sentido usar varios idiomas solo para explotar las diferentes capacidades de cada uno. Por ejemplo, la JVM admite varios idiomas que pueden interactuar de manera bastante transparente, por lo que puede mezclar Java (para velocidad y OOP estáticamente tipada) con Clojure (para desarrollo interactivo, concurrencia y programación funcional). Dichos proyectos aún suelen separar los diferentes idiomas en archivos / carpetas de origen separados, pero se compilan al mismo tiempo para producir una sola aplicación.
revs mikera
fuente
6

Es posible hacer una combinación de idiomas usando Perl Inline que permite escribir un script de Perl e insertar secciones de código escritas en un idioma diferente:

Inline tiene soporte para C, C ++, Java, Python, Ruby, Tcl, Assembler, Basic, Guile, Befunge, Octave, Awk, BC, TT (Template Toolkit), WebChat e incluso PERL

JohnTESlade
fuente
Nunca había oído hablar de Perl Inline. Es una idea interesante, pero ¿ofrece alguna ventaja sobre cuál es probablemente el enfoque habitual de tener módulos separados para código que no sea PERL?
FrustratedWithFormsDesigner
1
@FrustratedWithFormsDesigner: Inline Perl es un gran módulo, pero tiene algunos defectos. Funciona bien, pero solo en la medida de un código bastante básico. Aunque se ha trabajado durante un tiempo, no lo usaría en ningún tipo de producción.
Dinámico
3

El SQL incorporado era una forma común de incrustar sentencias SQL en programas de otros lenguajes.

En estos días, ha sido reemplazado casi por completo por un acceso a la base de datos basado en API más fácil de compilar que no necesita modificar el idioma del host, sino que usa sus habilidades normales.

Joachim Sauer
fuente
1
En estos días, un SQL incorporado regresó en forma de LINQ, y llegó para quedarse.
SK-logic
@ SK-logic: ¿cómo es LINQ algo parecido al SQL incorporado? No es un idioma diferente, es simplemente la aplicación de construcciones de lenguaje adicionales en el idioma del host.
Joachim Sauer
LINQ es un DSL incrustado muy típico, semánticamente ajeno a su idioma anfitrión. Y, en el caso de LINQ2SQL, se comporta exactamente de la misma manera que el antiguo SQL incorporado, se traduce literalmente a SQL.
SK-logic
Pero el SQL incorporado no se "traduce a SQL". Usted escribe el SQL literal dentro de su código C (y generalmente tampoco dentro de las constantes de cadena). A pesar de que LINQ usa características de lenguaje que (hasta donde yo sé) se desarrollaron específicamente para LINQ, es "solo" una API dentro de su idioma anfitrión.
Joachim Sauer
1
Pro C y Pro Fortran tradujeron un poco las declaraciones SQL. Y LINQ no es "solo" una API, es una API con azúcar de sintaxis y un montón de back-end de compiladores intercambiables. Lo que lo convierte en un ejemplo perfecto de un DSL incorporado completo.
SK-logic
2

Se pueden usar varios lenguajes de programación para formar 1 exe. Una forma es usar archivos DLL. Por supuesto, hay varias preocupaciones sobre esto. Por ejemplo, compatibilidad de parámetros, compatibilidad COM y demás. De hecho, si piensa en cómo llama a un sistema de base de datos para hacer su trabajo, es posible que el DBMS no siempre esté escrito en un idioma que usted conoce. Probablemente ni siquiera te importe mientras se conozca la interfaz.

Este concepto se lleva más allá cuando su solución utiliza servicios web, que es incluso una forma más limpia de combinar múltiples componentes de software.

En el mundo .NET, todo lo anterior se aplica, más aún, en el nivel de interfaz Las interfaces XAML y HTML pueden vivir juntas en Silverlight.

En el mundo UNIX, en algún momento, utilizamos scripts de KShell para lanzar programas C ++ y COBOL para que la solución pudiera funcionar.

Ninguna posibilidad
fuente
2

Creo que valdría la pena mencionar Cython aquí. Es un superconjunto de Python para escribir extensiones C y, aunque en realidad es un lenguaje único en sí mismo, prácticamente le permite usar el código C en el código Python, si cumple con la sintaxis de estilo Python de Cython

Magnus
fuente
0

Ejemplos de combinación de lenguajes: Jython (python en Java), Cog (python usado como generador de código incrustado en casi cualquier cosa). A menudo he usado código Perl para generar C ++, si cuenta la generación de código.

Michael Kohne
fuente
0

El marco .NET está diseñado para permitir que varios idiomas participen en una solución. Funciona siempre que el lenguaje pueda producir código de bytes compatible con CLR.

http://www.geekinterview.com/question_details/1047

Jalayn
fuente
No creo que eso sea lo que significó el póster original. El bytecode resultante tiene muy poco que ver con la forma en que se escribió en el idioma desde el que se compiló.
perdian
No creo que hayas entendido la pregunta. El autor habla de combinar varios idiomas en un archivo oscuro.
Craige
0

Es muy difícil, muy feo y a menudo inútil combinar múltiples lenguajes de programación en 1 archivo.

Sin embargo, es posible tener un gran proyecto escrito en más de 1 idioma. Por ejemplo, tanto Mozilla Firefox como MySQL tienen código C y C ++ en ellos. Cuando se trata de grandes proyectos, esta práctica se usa a menudo porque un lenguaje en particular proporciona algunas características que otro no. En PHP, por ejemplo, puede solicitar la ejecución de un ejecutable binario, tomar su resultado y usarlo en su código PHP a partir de ese momento.

Si tiene curiosidad acerca de qué idiomas se utilizan para algunos de los proyectos de código abierto más importantes del mundo, puede consultar Ohloh.net. Las estadísticas sobre el código fuente de muchos proyectos se pueden encontrar allí.

Radu Murzea
fuente
-1

Puede "mezclar" idiomas en HTML. En realidad, es importante para la forma en que funcionan muchos sitios web que pueda insertar JavaScript en HTML. Pero, por supuesto, HTML es marcado, no un lenguaje de programación.

Creo que hacer lo que propones implicaría escribir un nuevo idioma de todos modos. O tendría que crear un intérprete / compilador que hablara todos esos idiomas y pudiera enmarcarlos de manera consistente, o necesitaría alguna forma de evaluar línea por línea explícitamente en lo que sería un metalenguaje. Esas dos opciones son básicamente las mismas, excepto por lo que el programador tiene que hacer para que los idiomas funcionen juntos.

Markw
fuente
+1 en mezclar idiomas en HTML, pero personalmente creo que es más limpio mantener separados el HTML / CSS y el JS. Los diseñadores web pueden hacer lo suyo sin tratar de atravesar JavaScript que está incrustado en todo el sitio.
jmort253
Puede mezclar idiomas en HTML, pero no muchos de ellos son lenguajes de programación , que es el tema en cuestión.
Alexios
Eh? ¿Javascript no es un lenguaje de programación? PHP? También he visto inyecciones de Perl y Python, aunque eso fue con los módulos de Apache.
markw
-1

El lenguaje es una herramienta. Antes de elegir una herramienta (además, hacer una combinación extraña de hummer-PC-espectroscopio) uno debería preguntarse: ¿qué es exactamente lo que quiero hacer? Una vez que se da la respuesta, descubrirá que este tipo de mezcla de idiomas rara vez es necesaria.

Hamo
fuente
-3

Sí, es posible mezclar lenguajes de programación siempre que su intérprete / compilador pueda entenderlo. Por ejemplo, mezclar javascript, PHP, python en HTML o C ++ en C #.

Sin embargo, mezclar idiomas puede dificultar la lectura y modificación del código, por lo que debe hacerse con precaución. Una forma de evitar esto es crear archivos separados para el código en el idioma que necesita llamar e importarlo en lugar de incrustarlo.

Garrett Hall
fuente