Die folgende Zusammenfassung basiert auf "Compilers, Principles, Techniques, & Tools" von Aho, Lam, Sethi, Ullman (Pearson International Edition, 2007), Seite 1, 2, mit einigen eigenen Ideen.
Die beiden Grundmechanismen zur Abarbeitung eines Programms sind Kompilierung und Interpretation .
Beim Kompilieren wird ein Quellprogramm in einer bestimmten Sprache als Eingabe verwendet und ein Zielprogramm in einer Zielsprache ausgegeben.
source program --> | compiler | --> target program
Wenn es sich bei der Zielsprache um Maschinencode handelt, kann dieser direkt auf einem bestimmten Prozessor ausgeführt werden:
input --> | target program | --> output
Beim Kompilieren wird das gesamte Eingabeprogramm (oder Modul) gescannt und übersetzt, ohne dass es ausgeführt wird.
Die Interpretation nimmt das Quellprogramm und seine Eingabe als Eingabe und erzeugt die Ausgabe des Quellprogramms
source program, input --> | interpreter | --> output
Bei der Interpretation wird das Programm normalerweise einzeln verarbeitet (analysiert und ausgeführt).
In der Praxis verwenden viele Sprachprozessoren eine Mischung aus beiden Ansätzen. Beispielsweise werden Java-Programme zunächst in ein Zwischenprogramm (Bytecode) übersetzt (kompiliert):
source program --> | translator | --> intermediate program
Die Ausgabe dieses Schritts wird dann von einer virtuellen Maschine ausgeführt (interpretiert):
intermediate program + input --> | virtual machine | --> output
Um die Sache noch komplizierter zu machen, kann die JVM zur Laufzeit eine Just-in-Time-Kompilierung durchführen, um Byte-Code in ein anderes Format zu konvertieren, das dann ausgeführt wird.
Auch wenn Sie in Maschinensprache kompilieren, wird Ihre Binärdatei von einem Interpreter ausgeführt, der vom zugrunde liegenden Prozessor implementiert wird. Daher verwenden Sie auch in diesem Fall eine Mischung aus Kompilierung und Interpretation.
Reale Systeme verwenden also eine Mischung aus beidem. Daher ist es schwierig zu sagen, ob ein bestimmter Sprachprozessor ein Compiler oder ein Interpreter ist, da er wahrscheinlich beide Mechanismen in verschiedenen Phasen seiner Verarbeitung verwendet. In diesem Fall wäre es wahrscheinlich sinnvoller, einen anderen, neutraleren Begriff zu verwenden.
Dennoch sind Kompilierung und Interpretation zwei unterschiedliche Arten der Verarbeitung, wie in den obigen Diagrammen beschrieben.
Um die ersten Fragen zu beantworten.
Ein Compiler würde eine Maschinensprache erstellen, die direkt auf der physischen Hardware läuft?
Nicht unbedingt übersetzt ein Compiler ein Programm, das für eine Maschine M1 geschrieben wurde, in ein äquivalentes Programm, das für eine Maschine M2 geschrieben wurde. Die Zielmaschine kann in Hardware implementiert sein oder eine virtuelle Maschine sein. Konzeptionell gibt es keinen Unterschied. Der wichtige Punkt ist, dass ein Compiler einen Teil des Codes betrachtet und in eine andere Sprache übersetzt, ohne ihn auszuführen.
Ein Interpreter erzeugt also keine Maschinensprache, ein Compiler jedoch für seine Eingabe?
Wenn Sie durch das Produzieren auf die Ausgabe verweisen, dann erzeugt ein Compiler ein Zielprogramm, das möglicherweise in Maschinensprache verfasst ist, ein Interpreter jedoch nicht.