Ist die JVM ein Compiler oder ein Interpreter?

83

Ich habe eine sehr grundlegende Frage zu JVM: Ist es ein Compiler oder ein Interpreter?

Wenn es sich um einen Interpreter handelt, was ist dann mit dem JIT-Compiler, der in der JVM vorhanden ist?
Wenn nicht, was genau ist dann die JVM? (Ich möchte nicht die grundlegende Definition von jVM für die Konvertierung von Bytecode in maschinenspezifischen Code usw.)

sns
quelle
16
Die JVM ist eine virtuelle Maschine. Bytcode geht ein, die beobachtbaren Effekte des Programms treten auf. Alles andere ist ein Implementierungsdetail.
1
Ja, es gibt keine "die" JVM, es gibt mehrere Implementierungen der Spezifikation.
Paxdiablo
@delnan, bitte schreibe das als Antwort. Ich würde eine solche Antwort wirklich positiv bewerten wollen.
Aioobe
@aioobe: Ich werde nicht. Ich denke nicht, dass es die hier gestellte Frage beantwortet - es ist eine sehr nützliche Perspektive, aber die Frage (klar im Titel und im Beitrag angegeben) fordert diese Implementierungsdetails explizit an.
Meinetwegen. Ich würde sagen, es ist eine Antwort auf die Frage "Wenn beides nicht, was genau ist dann die JVM?" Teil aber. (Da eine Java Virtual Machine eher eine Spezifikation als eine Implementierung ist.)
Aioobe

Antworten:

170

Lassen Sie uns zunächst eine klare Vorstellung von den folgenden Begriffen haben

Javacis Java Compiler - Kompiliert Ihren Java-Code in Bytecode

JVMist Java Virtual Machine - Führt Bytecode aus / interpretiert ihn / übersetzt ihn in nativen Maschinencode

JITis Just In Time Compiler - Kompiliert die angegebene Bytecode-Befehlssequenz zur Laufzeit in Maschinencode, bevor sie nativ ausgeführt wird. Der Hauptzweck besteht darin, die Leistung stark zu optimieren.

Lassen Sie uns nun Antworten auf Ihre Fragen finden.

1) JVM: is it a compiler or an interpreter? - Ans: Dolmetscher

2) what about JIT compiler that exist inside the JVM? - Antwort : Wenn Sie diese Antwort vollständig gelesen haben, wissen Sie sie wahrscheinlich jetzt

3) what exactly is the JVM? - Ans:

  • JVM ist eine virtuelle Plattform, die sich in Ihrem RAM befindet
  • Die Komponente Class Loader lädt die .classDatei in den RAM
  • Die Bytecode Verifier - Komponente in JVM überprüft , ob es irgendwelche Zugriffsbeschränkung Verletzungen in Ihrem Code. (Dies ist einer der Hauptgründe, warum Java sicher ist)
  • Als Nächstes konvertiert die Execution Engine- Komponente den Bytecode in ausführbaren Maschinencode

Hoffe das hat dir geholfen ..

Srikanth Bandaru
quelle
Sie sagen, JVM übersetzt Bytecode in nativen Maschinencode. Ich bin mir nicht sicher, ob der Begriff "Übersetzung" hier korrekt ist.
Koray Tugay
Hoch geschätzt. Sie haben meinen Zweifel am Unterschied zwischen Kompilieren und Interpretieren, Bytecode und M / C-Code fast ausgeräumt. Ihre Antwort sagte mir, dass Bytecode von einem Interpreter in Maschinencode konvertiert wird und der Compiler den Quellcode in Bytecode konvertiert.
Harsimer
2
Können Sie mir bitte auch sagen, was nativer Code ist? Bedeutet das Maschinencode? Ich versuche, diesen ganzen Prozess der Zusammenstellung und Interpretation zu lernen, aber diese Zwischenbegriffe sind sehr verwirrend.
Harsimer
6
Sowohl JVM als auch JIT konvertieren Bytecode in plattformspezifischen Maschinencode. Was ist also der Unterschied zwischen ihnen? Kannst du es allgemein erklären?
Aditya
6
'Läuft / interpretiert / übersetzt Bytecode in nativen Maschinencode' ist Unsinn. Es wird entweder ausgeführt / interpretiert oder Bytecode in nativen Maschinencode übersetzt. Nicht beide gleichzeitig.
Marquis von Lorne
32

Es ist ein bisschen von beidem, aber auch nicht im traditionellen Sinne.

Moderne JVMs nehmen Bytecode und kompilieren ihn bei Bedarf in nativen Code. "JIT" steht in diesem Zusammenhang für "just in time". Es fungiert von außen als Interpreter, aber hinter den Kulissen wird es in Maschinencode kompiliert.

Die JVM sollte nicht mit dem Java-Compiler verwechselt werden, der den Quellcode in Bytecode kompiliert. Es ist also nicht sinnvoll, es als "Compiler" zu betrachten, sondern zu wissen, dass es im Hintergrund eine Kompilierung durchführt.

Mark Peters
quelle
8
@NaeemShah: Ich bin geschmeichelt, dass Ihnen diese Antwort genug gefallen hat, um sie fast wörtlich in einen Blog-Beitrag unter Ihrem eigenen Namen zu kopieren. Sie haben das Recht dazu, aber im Rahmen des Lizenzierungsschemas von StackOverflow sind Sie gesetzlich verpflichtet, die Zuordnung hierher zurückzugeben, und Sie müssen Ihren Blog-Beitrag unter derselben Lizenz lizenzieren. Weitere Informationen finden Sie in der Fußzeile dieser Website, die auf die folgende Lizenz verweist: creativecommons.org/licenses/by-sa/3.0 . Siehe auch diesen Blog-Beitrag: blog.stackoverflow.com/2009/06/attribution-required
Mark Peters
8

Wie @delnan bereits im Kommentarbereich angegeben hat, ist es keines von beiden .

JVM ist eine abstrakte Maschine, auf der Java-Bytecode ausgeführt wird .

JVM hat mehrere Implementierungen:

... und viele andere .

Die meisten anderen Antworten, wenn es um JVM geht, beziehen sich entweder auf HotSpot oder auf eine Mischung der oben genannten Ansätze zur Implementierung der JVM.

cubuspl42
quelle
1
ART ist auch ein Interpreter: "Android kann den .dexCode tatsächlich direkt über Interpretation oder Just-In-Time (JIT) -Kompilierung ausführen ..." ( source.android.com/devices/tech/ota/ab/… )
Irfan Latif
5

Es ist beides. Es beginnt mit der Interpretation des Bytecodes und kann (falls es sich lohnt) den Bytecode dann in nativen Maschinencode kompilieren.

Paul Cager
quelle
Sie beziehen sich wahrscheinlich auf HotSpot
cubuspl42
5

Es ist beides. Es kann Bytecode interpretieren und zu nativem Code kompilieren.

Matte
quelle
0

Wie andere gesagt haben, ist es beides! Wenn Sie detailliert darauf verweisen möchten, sehen Sie: Diese IBM Beschreibung

DDC
quelle
0

Javac ist ein Compiler, aber kein traditioneller Compiler. Ein Compiler konvertiert normalerweise Quellcode zur Ausführung in die Sprache auf Maschinenebene. Dies erfolgt in einem einzigen Schuss, dh der gesamte Code wird EINMAL in die Sprache auf Maschinenebene konvertiert. (mehr dazu weiter unten). Währenddessen konvertiert JavaC es in Bytecode anstelle der Sprache auf Maschinenebene.

JIT ist ein Java-Compiler, fungiert aber auch als Interpreter. Ein typischer Compiler konvertiert den gesamten Code auf einmal vom Quellcode in die Sprache auf Maschinenebene. Stattdessen geht JIT Zeile für Zeile (die zeilenweise Ausführung ist eine Funktion von Interpretern) und konvertiert den von JavaC generierten Bytecode in eine Sprache auf Maschinenebene und führt ihn aus. JVM mit JIT verfügt über mehrere Implementierungen. Hotspot ist einer der wichtigsten für die Java-Programmierung. Durch die Hotspot-Implementierung optimiert JIT die Ausführung, indem Codeblöcke, die sich wiederholen, sofort in die Sprache auf Maschinenebene konvertiert werden (wie ein Compiler wie oben erwähnt), sodass sie schneller ausgeführt werden können, anstatt jede Codezeile 1 um 1 zu konvertieren Die Antwort lautet nicht Schwarzweiß in Bezug auf die typischen Definitionen von Compiler und Interpreter.

Dies ist mein Verständnis, nachdem ich mehrere Online-Antworten, Blogs usw. gelesen habe. Wenn jemand Vorschläge zur Verbesserung dieses Verständnisses hat, kann er dies gerne vorschlagen.

Sarth
quelle
-5

JVM hat sowohl Compiler als auch Interpreter. Weil der Compiler den Code kompiliert und Bytecode generiert. Danach konvertiert der Interpreter Bytecode in maschinenverständlichen Code.

Beispiel: Schreiben und kompilieren Sie ein Programm, das unter Windows ausgeführt wird. Bringen Sie die .class-Datei auf ein anderes Betriebssystem (Unix) und sie wird aufgrund eines Interpreters ausgeführt, der den Bytecode in maschinenverständlichen Code konvertiert.

M SANEDEEP KUMAR
quelle
1
Sie haben vergessen, Caps auszuschalten :)
Aleksej Vasinov
7
Falsch, Sie kompilieren zuerst den Quellcode zu Bytecode (hat nichts mit JVM zu tun), dann interpretiert die JVM den Bytecode und kompiliert ihn zu nativem Code (aber möglicherweise nicht zu jedem Teil).
The_Fox