El resumen que doy a continuación se basa en "Compiladores, principios, técnicas y herramientas", Aho, Lam, Sethi, Ullman, (Pearson International Edition, 2007), páginas 1, 2, con la adición de algunas ideas propias.
Los dos mecanismos básicos para procesar un programa son la compilación y la interpretación .
La compilación toma como entrada un programa fuente en un idioma dado y genera un programa objetivo en un idioma objetivo.
source program --> | compiler | --> target program
Si el idioma de destino es el código de máquina, se puede ejecutar directamente en algún procesador:
input --> | target program | --> output
La compilación implica escanear y traducir todo el programa de entrada (o módulo) y no implica ejecutarlo.
La interpretación toma como entrada el programa fuente y su entrada, y produce la salida del programa fuente.
source program, input --> | interpreter | --> output
La interpretación generalmente implica procesar (analizar y ejecutar) el programa una declaración a la vez.
En la práctica, muchos procesadores de lenguaje usan una combinación de los dos enfoques. Por ejemplo, los programas Java se traducen primero (compilan) en un programa intermedio (código de bytes):
source program --> | translator | --> intermediate program
La salida de este paso es ejecutada (interpretada) por una máquina virtual:
intermediate program + input --> | virtual machine | --> output
Para complicar aún más las cosas, la JVM puede realizar una compilación justo a tiempo en tiempo de ejecución para convertir el código de bytes a otro formato, que luego se ejecuta.
Además, incluso cuando compila en lenguaje máquina, hay un intérprete que ejecuta su archivo binario que implementa el procesador subyacente. Por lo tanto, incluso en este caso está utilizando un híbrido de compilación + interpretación.
Por lo tanto, los sistemas reales usan una combinación de ambos, por lo que es difícil decir si un procesador de lenguaje dado es un compilador o un intérprete, porque probablemente usará ambos mecanismos en diferentes etapas de su procesamiento. En este caso, probablemente sería más apropiado usar otro término más neutral.
Sin embargo, la compilación y la interpretación son dos tipos distintos de procesamiento, como se describe en los diagramas anteriores,
Para responder las preguntas iniciales.
¿Un compilador crearía un lenguaje de máquina que se ejecuta directamente en el hardware físico?
No necesariamente, un compilador traduce un programa escrito para una máquina M1 a un programa equivalente escrito para una máquina M2. La máquina de destino puede implementarse en hardware o ser una máquina virtual. Conceptualmente no hay diferencia. El punto importante es que un compilador mira un fragmento de código y lo traduce a otro idioma sin ejecutarlo.
Entonces, ¿un intérprete no produce lenguaje de máquina pero un compilador lo hace para su entrada?
Si al producir se está refiriendo a la salida, un compilador produce un programa de destino que puede estar en lenguaje de máquina, un intérprete no.