O resumo a seguir é 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 idéias minhas.
Os dois mecanismos básicos para processar um programa são compilação e interpretação .
A compilação recebe 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 um 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 a execução.
A interpretação toma como entrada o programa de origem e sua entrada e produz a saída do programa de origem
source program, input --> | interpreter | --> output
A interpretação geralmente envolve o processamento (análise e execução) do programa, uma instrução de cada vez.
Na prática, muitos processadores de linguagem usam uma mistura 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, 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 a linguagem de máquina, há um intérprete executando seu arquivo binário que é implementado pelo processador subjacente. Portanto, mesmo neste caso, você está usando um híbrido de compilação + interpretação.
Portanto, sistemas reais usam uma mistura dos dois, por isso é difícil dizer se um determinado processador de linguagem é um compilador ou um intérprete, porque provavelmente usará os dois 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.
Um compilador criaria uma linguagem de máquina que é executada diretamente no hardware físico?
Não necessariamente, um compilador converte um programa gravado para uma máquina M1 em um programa equivalente gravado 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 analisa um pedaço de código e o traduz para outro idioma sem executá-lo.
Portanto, um intérprete não produz linguagem de máquina, mas um compilador faz isso por sua entrada?
Se, ao produzir uma referência à saída, um compilador produz um programa de destino que pode estar na linguagem de máquina, um intérprete não.