Il riepilogo che fornisco di seguito si basa su "Compilatori, Principi, Tecniche e strumenti", Aho, Lam, Sethi, Ullman, (Pearson International Edition, 2007), pagine 1, 2, con l'aggiunta di alcune mie idee.
I due meccanismi di base per l'elaborazione di un programma sono la compilazione e l' interpretazione .
La compilazione prende come input un programma sorgente in una determinata lingua e produce un programma target in una lingua target.
source program --> | compiler | --> target program
Se la lingua di destinazione è il codice macchina, può essere eseguito direttamente su alcuni processori:
input --> | target program | --> output
La compilazione comporta la scansione e la traduzione dell'intero programma di input (o modulo) e non comporta l'esecuzione.
L'interpretazione prende come input il programma sorgente e il suo input e produce l'output del programma sorgente
source program, input --> | interpreter | --> output
L'interpretazione di solito implica l'elaborazione (analisi ed esecuzione) del programma un'istruzione alla volta.
In pratica, molti processori di linguaggio usano un mix dei due approcci. Ad esempio, i programmi Java vengono prima tradotti (compilati) in un programma intermedio (codice byte):
source program --> | translator | --> intermediate program
l'output di questo passaggio viene quindi eseguito (interpretato) da una macchina virtuale:
intermediate program + input --> | virtual machine | --> output
Per complicare ulteriormente le cose, JVM può eseguire una compilazione just-in-time in fase di esecuzione per convertire il codice byte in un altro formato, che viene quindi eseguito.
Inoltre, anche durante la compilazione in linguaggio macchina, esiste un interprete che esegue il file binario che viene implementato dal processore sottostante. Pertanto, anche in questo caso si utilizza un ibrido di compilazione + interpretazione.
Quindi, i sistemi reali usano un mix dei due, quindi è difficile dire se un determinato elaboratore di linguaggio sia un compilatore o un interprete, perché probabilmente utilizzerà entrambi i meccanismi nelle diverse fasi della sua elaborazione. In questo caso sarebbe probabilmente più appropriato usare un altro termine più neutro.
Tuttavia, la compilazione e l'interpretazione sono due distinti tipi di elaborazione, come descritto negli schemi sopra,
Per rispondere alle domande iniziali.
Un compilatore creerebbe un linguaggio macchina che gira direttamente sull'hardware fisico?
Non necessariamente, un compilatore traduce un programma scritto per una macchina M1 in un programma equivalente scritto per una macchina M2. La macchina target può essere implementata in hardware o essere una macchina virtuale. Concettualmente non c'è differenza. Il punto importante è che un compilatore guarda un pezzo di codice e lo traduce in un'altra lingua senza eseguirlo.
Quindi un interprete non produce un linguaggio macchina ma un compilatore lo fa per il suo input?
Se producendo ti riferisci all'output, un compilatore produce un programma target che può essere in linguaggio macchina, un interprete no.