Le résumé que je donne ci-dessous est basé sur "Compilateurs, principes, techniques et outils", Aho, Lam, Sethi, Ullman, (Pearson International Edition, 2007), pages 1 et 2, avec l’ajout de certaines de mes idées personnelles.
Les deux mécanismes de base pour le traitement d'un programme sont la compilation et l' interprétation .
La compilation prend en entrée un programme source dans une langue donnée et génère un programme cible dans une langue cible.
source program --> | compiler | --> target program
Si la langue cible est le code machine, il peut être exécuté directement sur un processeur:
input --> | target program | --> output
La compilation implique la numérisation et la traduction de l’ensemble du programme d’entrée (ou du module) et ne nécessite pas son exécution.
L'interprétation prend en entrée le programme source et son entrée et produit la sortie du programme source
source program, input --> | interpreter | --> output
L'interprétation implique généralement le traitement (l'analyse et l'exécution) du programme, une instruction à la fois.
En pratique, de nombreux processeurs de langage utilisent une combinaison des deux approches. Par exemple, les programmes Java sont d'abord traduits (compilés) dans un programme intermédiaire (code octet):
source program --> | translator | --> intermediate program
la sortie de cette étape est ensuite exécutée (interprétée) par une machine virtuelle:
intermediate program + input --> | virtual machine | --> output
Pour compliquer encore les choses, la machine virtuelle Java peut effectuer une compilation juste à temps au moment de l'exécution afin de convertir le code octet dans un autre format, qui est ensuite exécuté.
En outre, même lorsque vous compilez en langage machine, un interpréteur exécutant votre fichier binaire est implémenté par le processeur sous-jacent. Par conséquent, même dans ce cas, vous utilisez un système hybride compilation + interprétation.
Ainsi, les systèmes réels utilisent une combinaison des deux. Il est donc difficile de dire si un processeur de langage donné est un compilateur ou un interprète, car il utilisera probablement les deux mécanismes à différentes étapes de son traitement. Dans ce cas, il serait probablement plus approprié d'utiliser un autre terme plus neutre.
Néanmoins, la compilation et l’interprétation sont deux types de traitement distincts, décrits dans les schémas ci-dessus,
Pour répondre aux questions initiales.
Un compilateur créerait un langage machine qui fonctionne directement sur le matériel physique?
Pas nécessairement, un compilateur traduit un programme écrit pour une machine M1 en un programme équivalent écrit pour une machine M2. La machine cible peut être implémentée matériellement ou être une machine virtuelle. Conceptuellement, il n'y a pas de différence. L'important est qu'un compilateur examine un morceau de code et le traduise dans un autre langage sans l'exécuter.
Donc, un interprète ne produit pas de langage machine, mais un compilateur le fait pour son entrée?
Si, en produisant, vous faites référence à la sortie, un compilateur produit un programme cible qui peut être en langage machine, contrairement à un interprète.