Unterschied kompilieren und interpretieren?

4 Antworten

Der Compiler ist ein Programm (das selbst entweder in nativem Code vorliegt oder aber interpretiert wird), der den Quelltext liest und in eine Zielsprache (in der Regel Maschinensprache) übersetzt.

Ein Interpreter enthält, einfach ausgedrückt, für jeden Befehl bereits Routinen, die ihn abarbeiten können, z. B. eine "addiere"-Routine, eine "multipliziere"-Routine, eine "lade Wert aus Variable", eine "speichere Wert in Variable", und so weiter und so fort. Der Interpreter liest dann den Quelltext des Programms und springt die Routinen an, die notwendig sind, um das durchzuführen, was das Programm beschreibt. Der Interpreter selbst liegt, einschließlich der Routinen, die die einzelnen Befehle abarbeiten, in Maschinensprache vor. (Wurde in der Regel zunächst in einer Hochsprache, in der Regel in C, verfasst und dann selbst durch einen Compiler in Maschinensprache übersetzt.)

Es gibt auch "hybride Ansätze". Insbesondere ist es gängig, dass ein Programm zunächst durch einen Compiler aus dem Quellcode in eine Zwischendarstellung, entweder einen abstrakten Syntaxbaum (abstract syntax tree - AST) oder in Code für eine virtuelle Maschine (häufig als "Bytecode" bezeichnet) übersetzt wird, der dann anschließend interpretiert wird. Java ist ein Beispiel für letzteres. Der Java-Compiler ("javac") liest Java-Quelcode (".java"-Dateien) und übersetzt ihn in Java-Bytecode (".class"-Dateien), wobei es sich um Code für eine virtuelle Maschine handelt. Dieser Bytecode wird anschließend von der "Java Virtual Machine" (JVM) interpretiert. Der Vorteil ist, dass während des Interpretierens der Quellcode nicht analysiert werden muss, was einen Haufen Stringverarbeitung mit sich bringt, sondern gleich auf binären, einfach zu interpretierenden Daten operiert werden kann.

Ein anderer "hybrider Ansatz" liegt in der so genannten "just-in-time compilation" (JIT). Hierbei wird nativer Maschinencode erzeugt, allerdings erst, wenn der entsprechende Befehl ausgeführt werden soll, das heißt wie bei einem Interpreter wird der Quellcode eingelesen und auf Basis des Quellcodes bestimmte Routinen "angesprungen". Allerdings enthalten diese Routinen nicht bereits den Code, der die entsprechende Operation ausführt, und werden beim Übersetzen des Interpreters/JITs mitübersetzt, sondern sie enthalten Code, der Maschinencode generiert, um die entsprechende Operation auszuführen. Das ist zunächst langsamer, als die "reine" Interpretation. Der Vorteil liegt darin, dass man diesen Maschinencode "zwischenspeichern" (cachen) kann und dann bei erneutem Durchlaufen desselben Programmcodes nicht noch einmal den Quellcode analysieren und übersetzen muss. Auch dieses Verfahren ist inzwischen in der JVM integriert. Da der JIT relativ hohe konstante Kosten für den initialen Übersetzungsvorgang hat, führt die JVM eine statistische Analyse durch, welche Codeabschnitte wie häufig durchlaufen werden und übersetzt anschließend nur die am häufigsten durchlaufenen Abschnitte mit dem JIT, während die übrigen Abschnitte weiterhin interpretiert werden.


PerfectMuffin  13.07.2015, 07:18

.class ist eigentlich schon hybrid, weil's kein Maschinencode ist, JIT ist auch hybrid. Java ist also doppelt hybrid.

1
NoHumanBeing  13.07.2015, 08:50
@PerfectMuffin

Jep. Und zusätzlich wird durch die "Hotspot-Compilierung" teilweise interpretiert und teilweise just-in-time-compiliert. Die JVM ist wirklich eine komplexe Angelegenheit. ;-)

0

Ja aber das Kompilat wird auch als ausführbare Datei gespeichert. Der Interpreter speichert nichts, er liest den Befehl und führt ihn aus.

Kompilieren: Quellcode wird in Programmiersprache geschrieben -> Quellcode wird vom Compiler in Maschinensprache übersetzt -> übersetztes Programm wird ausgeführt.

In der Reihenfolge läuft das dort (vereinfacht gesagt) ab.

Beim Interpretieren wird das Programm, während es ausgeführt wird, in Maschinensprache übersetzt. Näheres verraten auch die Wikipedia-Artikel https://de.wikipedia.org/wiki/Interpreter

Beim Kompilieren wird der Quellcode analysiert und eine ausführbare Datei erstellt. Beim Interpretieren wird der Quellcode analysiert und direkt ausgeführt ohne zuvor eine ausführbare Datei zu erstellen.