Ist Java Compiler oder Interpreter?

6 Antworten

Java ist eine Programmiersprache, deren Code von einem Compiler übersetzt wird. Zu diesem Zweck wird ein Zwischencode, der sogenannte Bytecode, erzeugt. Dieser ist unabhängig von dem Betriebssystem und der Hardware, bzw. vor allem der Prozessorachitektur.

Die Laufzeitumgebung (d.h. die JRE) wiederum wandelt den Bytecode dann in Maschinencode um, der vom Zielprozessor verstanden wird. Dieser kann das Programm so ausführen. Die JVM ist auch involviert, aber das würde jetzt zu tief ins Detail gehen.

Allerdings ist weder die JVM noch die JRE in Interpreter. Interpreter und Compiler übersetzen beide Programmcode, sodass der Prozessor versteht, was der Programmierer von ihm will. Der Compiler übersetzt schon zur Designzeit und nach dem eigentlichen Compilieren generiert er eine ausführbare Datei (unter Unix-artigen Systemen wie Linux-basiert, BSD-basiert, macOS ohne Endung und als ausführbar markiert, unter OS/2 und Windows .exe).

Der Interpreter hingegen übersetzt erst zur Laufzeit und ließt nur die aktuelle Datei Zeile für Zeile ein. Dementsprechend erzeugt ein Interpreter keine ausführbare Datei. Programmiersprachen wie Python, Ruby und Perl nutzen einen Interpreter. Java hat einen Compiler, der eine Art ausführbares Zip-Archiv generiert. Die JVM und JRE sind dann dafür da, dies als Programm zu identifizieren. Aber: Ein Interpretieren im Sinne von Interpretern findet hier nicht statt.

Visual Basic for Applications (VBA) ist tatsächlich ein Hybrid aus Compiler und Interpreter. Wenn man in MS Office mit VBA programmiert, übersetzt der Compiler zur Designzeit, um syntaktische Fehler anzuzeigen. Sobald der in VBA geschriebene Code ausgeführt wird, kommt jedoch ein Interpreter zum Einsatz, da Interpreter i.d.R. ein wenig schneller arbeiten, als Compiler (besonders bei sehr großen Programmen).

Fazit: Java ist eine reine Compilersprache. JVM und JRE »interpretieren« zwar den Programmcode (bzw. den Bytecode daraus). Aber interpretieren im Sinne von der technischen Funktionsweise eines Interpreters findet nicht statt.

Ich weiß das alles, weil ich sowohl mit Java als auch mit VBA gearbeitet habe. Besonders als ich während der Berufsausbildung mit VBA für ein einzelnes Projekt konfrontiert wurde, musste ich mich mit der Besonderheit der Hybridsprache auseinandersetzen.

In der Berufsschule habe ich zudem einmal ein Referat zum Thema »Übersetzungsprogramme« gehalten. Da tauchte dann noch zusätzlich der Assembler auf, der hier nicht von Relevanz war. Dementsprechend habe ich mich intensiver mit diesem Thema auseinandergesetzt.

Im Buch »Java ist auch eine Insel« wird die Funktionsweise der Java-Plattform detaillierter beschrieben. Dort findet sich auch nichts über Interpreter. Ab und zu gibt es Vergleiche mit C, C++ und C#, da Java mit ihnen verwandt ist. Das Buch kann ich nur weiterempfehlen. Dort wird bereits im ersten Kapitel über die Funktionsweise der Java-Plattform (JDK, JRE, JVM) ausführlich gesprochen.

Woher ich das weiß:Studium / Ausbildung

Java-Quelltext wird normalerweise in Bytecode kompiliert.

Wird dieser ausgeführt, wird er normalerweise für die aktuelle Plattform (JIT-)kompiliert. Es gibt aber auch die Möglichkeit, ihn interpretieren zu lassen, was früher in den 90ern der Standard war.

Des weiteren gibt es die Möglichkeit, den Quelltext auch direkt in nativen Code zu kompilieren, was aber fast nie gemacht wird, zumindest nicht auf Desktoprechnern.

Fazit: Der Quelltext wird fast immer in portablen Bytecode kompiliert (nur in Ausnahmefällen direkt in nativen Code), bei dessen Ausführung hingegen hat man die Wahl zwischen Interpreter und JIT-Compiler für nativn Code der jeweiligen Plattform.

Woher ich das weiß:Berufserfahrung

Java ist erstmal nur eine Sprache, also weder noch.

Verwendet man die Java VM, dann beides. Es wird kompilierter, plattformunabhängiger Bytecode ausgeführt. In der Regel wird dieser zur Laufzeit interpretiert, aber teilweise (in den sogenannten Hotspots) zur Laufzeit kompiliert ("just in time compilation").

Natürlich kann Java aber auch vor der Laufzeit in Maschinencode kompiliert werden. Siehe etwa Android, siehe GraalVM.

Java wird nach dem Programmieren in der Entwicklungsumgebung beim Builden durch den Compiler in einen Zwischencode umgewandelt. Dieser Zwischencode ist nicht für den Menschen und auch nicht für den Computer lesbar.

Während der Laufzeit des Programmes wird dieser Zwischencode durch den Interpreter (JAVA VM) in Maschinencode übersetzt.

Dementsprechend verwendet Java beides.

Java ist eine der höheren Programmiersprachen.

Ein Compiler übersetzt das ganze bei Ausführungen in Byte-Code. Die Besonderheit besteht bei Java darin, dass Java plattformunabhängig ist, weil der Byte-Code wiederum von einer virtuellen Maschine auf der jeweiligen Plattform/Rechner ausgeführt wird, insofern auf der Plattform eine entsprechende Umgebung installiert ist.