O resumo abaixo é baseado em "Compiladores, Princípios, Técnicas e Ferramentas", Aho, Lam, Sethi, Ullman, (Pearson International Edition, 2007), páginas 1, 2, com a adição de algumas ideias do meu próprio.
Os dois mecanismos básicos para o processamento de um programa são compilação e interpretação .
A compilação leva como entrada um programa de origem em um determinado idioma e gera um programa de destino em um idioma de destino.
source program --> | compiler | --> target program
Se o idioma de destino for código de máquina, ele poderá ser executado diretamente em algum processador:
input --> | target program | --> output
A compilação envolve a varredura e tradução de todo o programa de entrada (ou módulo) e não envolve sua execução.
A interpretação toma como entrada o programa fonte e sua entrada, e produz a saída do programa fonte
source program, input --> | interpreter | --> output
Interpretação geralmente envolve o processamento (análise e execução) do programa, uma declaração de cada vez.
Na prática, muitos processadores de linguagem usam uma combinação das duas abordagens. Por exemplo, os programas Java são primeiro traduzidos (compilados) em um programa intermediário (código de bytes):
source program --> | translator | --> intermediate program
a saída desta etapa é então executada (interpretada) por uma máquina virtual:
intermediate program + input --> | virtual machine | --> output
Para complicar ainda mais as coisas, a JVM pode executar a compilação just-in-time no tempo de execução para converter o código de bytes em outro formato, que é então executado.
Além disso, mesmo quando você compila para a linguagem de máquina, existe um interpretador executando o arquivo binário que é implementado pelo processador subjacente. Portanto, mesmo neste caso, você está usando um híbrido de compilação + interpretação.
Assim, sistemas reais usam uma mistura dos dois, então é difícil dizer se um determinado processador de linguagem é um compilador ou um interpretador, porque ele provavelmente usará ambos os mecanismos em diferentes estágios de seu processamento. Nesse caso, provavelmente seria mais apropriado usar outro termo mais neutro.
No entanto, compilação e interpretação são dois tipos distintos de processamento, conforme descrito nos diagramas acima,
Para responder às perguntas iniciais.
A compiler would create machine language which runs on the physical
hardware directly?
Não necessariamente, um compilador traduz um programa escrito para uma máquina M1 para um programa equivalente escrito para uma máquina M2. A máquina de destino pode ser implementada em hardware ou ser uma máquina virtual. Conceitualmente, não há diferença. O ponto importante é que um compilador olha para um trecho de código e traduz para outro idioma sem executá-lo.
So an interpreter doesn't produce machine language but a compiler does
it for its input?
Se por produzindo você está se referindo à saída, então um compilador produz um programa de destino que pode estar em linguagem de máquina, um interpretador não.