El resumen que doy a continuación se basa en "Compiladores, Principios, Técnicas y Herramientas", Aho, Lam, Sethi, Ullman, (Edición Internacional Pearson, 2007), páginas 1, 2, con algunas ideas adicionales. de mi propia.
Los dos mecanismos básicos para procesar un programa son compilación e interpretación .
La compilación toma como entrada un programa de origen en un idioma determinado y genera un programa de destino en un idioma de destino.
source program --> | compiler | --> target program
Si el idioma de destino es el código de máquina, puede ejecutarse 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 utilizan una combinación de los dos enfoques. Por ejemplo, los programas de Java se traducen (compilan) por primera vez 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 en otro formato, que luego se ejecuta.
Además, incluso cuando compila en lenguaje de máquina, hay un intérprete ejecutando su archivo binario que es implementado por 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 los dos, por lo que es difícil decir si un procesador de lenguaje dado es un compilador o un intérprete, porque probablemente utilizará ambos mecanismos en diferentes etapas de su procesamiento. En este caso, probablemente sería más apropiado utilizar 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 a las preguntas iniciales.
Un compilador crearía un lenguaje de máquina que se ejecute en el físico
hardware directamente?
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.
Por lo tanto, un intérprete no produce lenguaje de máquina, pero sí un compilador
¿Para su entrada?
Si al producir se refiere a la salida, entonces un compilador produce un programa objetivo que puede estar en lenguaje de máquina, un intérprete no.