Il sommario che riporto di seguito è basato su "Compilatori, principi, tecniche e strumenti", Aho, Lam, Sethi, Ullman, (Pearson International Edition, 2007), pagine 1, 2, con l'aggiunta di alcune idee di mio.
I due meccanismi di base per l'elaborazione di un programma sono compilation e interpretazione .
La compilazione prende come input un programma sorgente in una determinata lingua e genera un programma target in una lingua di destinazione.
source program --> | compiler | --> target program
Se la lingua di destinazione è un codice macchina, può essere eseguita direttamente su qualche processore:
input --> | target program | --> output
La compilazione implica la scansione e la traduzione dell'intero programma di input (o modulo) e non implica 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 comporta l'elaborazione (analisi ed esecuzione) del programma, una dichiarazione alla volta.
In pratica, molti processori linguistici utilizzano un mix dei due approcci. Ad esempio, i programmi Java vengono prima tradotti (compilati) in un programma intermedio (byte code):
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, la JVM può eseguire una compilazione just-in-time in runtime per convertire il codice byte in un altro formato, che viene poi eseguito.
Inoltre, anche quando si compila il linguaggio macchina, c'è un interprete che esegue il file binario implementato dal processore sottostante. Pertanto, anche in questo caso stai utilizzando un ibrido di compilation + interpretazione.
Quindi, i sistemi reali usano un mix dei due, quindi è difficile dire se un determinato processore di linguaggio è 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 tipi distinti di elaborazione, come descritto nei diagrammi sopra,
Per rispondere alle domande iniziali.
A compiler would create machine language which runs on the physical
hardware directly?
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.
So an interpreter doesn't produce machine language but a compiler does
it for its input?
Se per produrre ti riferisci all'output, allora un compilatore produce un programma target che può essere in linguaggio macchina, un interprete no.