Ist die JVM ein Compiler oder ein Interpreter?

Lesezeit: 6 Minuten

Benutzer-Avatar
näemgik

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 beides nicht der Fall ist, was genau ist dann die JVM? (Ich möchte nicht die grundlegende Definition von jVM zum Konvertieren von Bytecode in maschinenspezifischen Code usw.)

  • Die JVM ist eine virtuelle Maschine. Bytcode geht hinein, die beobachtbaren Auswirkungen des Programms geschehen. Alles andere ist ein Implementierungsdetail.

    Benutzer395760

    6. Oktober 2011 um 13:27 Uhr


  • Ja, es gibt nicht „die“ JVM, es gibt mehrere Implementierungen der Spezifikation.

    – paxdiablo

    6. Oktober 2011 um 13:32 Uhr


  • @delnan, bitte bitte schreibe das als Antwort. Ich würde diese Antwort wirklich positiv bewerten wollen.

    – aiobe

    6. Oktober 2011 um 13:36 Uhr

  • @aioobe: Das werde ich nicht. Ich glaube 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 ausdrücklich an.

    Benutzer395760

    6. Oktober 2011 um 13:40 Uhr


  • Fair genug. Ich würde es sagen ist eine Antwort auf die “Wenn keines von beiden, was genau ist dann die JVM?” Teil aber. (Da eine Java Virtual Machine eher eine Spezifikation als eine Implementierung ist.)

    – aiobe

    6. Oktober 2011 um 13:43 Uhr

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

Javac ist Java Compiler — Kompiliert Ihren Java-Code in Bytecode

JVM ist Java Virtual Machine — Führt/interpretiert/übersetzt Bytecode in Nativer Maschinencode

JIT ist Just-In-Time-Compiler – Kompiliert die gegebene Bytecode-Befehlssequenz in Maschinencode Laufzeit bevor es 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?Antwort: Dolmetscher

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

3)what exactly is the JVM?Antwort:

  • JVM ist eine virtuelle Plattform, die sich in Ihrem RAM befindet
  • Seine Komponente, Klassenlader lädt die .class Datei in den RAM
  • Das Bytecode-Verifizierer -Komponente in JVM prüft, ob Ihr Code Zugriffsbeschränkungsverletzungen enthält. (Dies ist einer der Hauptgründe, warum Java sicher ist)
  • Als nächstes die Ausführungs-Engine Komponente wandelt den Bytecode in ausführbaren Maschinencode um

Hoffe das hat dir geholfen..

  • Können Sie mir bitte auch sagen, was nativer Code ist? Bedeutet es Maschinencode? Ich versuche, diesen ganzen Prozess der Zusammenstellung und Interpretation zu lernen, aber diese Zwischenbegriffe sind sehr verwirrend.

    – Immer_ein_Lerner

    15. Januar 2016 um 11:41 Uhr

  • Sowohl JVM als auch JIT konvertieren also Bytecode in plattformspezifischen Maschinencode. Was ist also der Unterschied zwischen ihnen? kannst du das grob erklären?

    – Aditya

    1. Dezember 2016 um 11:49 Uhr


  • ‘Läuft/interpretiert/übersetzt Bytecode in nativen Maschinencode’ ist Unsinn. Es entweder ‘läuft/interpretiert’ oder ‘übersetzt Bytecode in nativen Maschinencode’. Nicht beides gleichzeitig.

    – Benutzer207421

    1. August 2017 um 1:16 Uhr

  • @RyuCoder VM ist eine Abstraktionsebene. Auf diese Weise generiert der Java-Compiler auf jeder Plattform, auf der er kompiliert wird, denselben Bytecode, da er auf derselben JVM ausgeführt wird. Die JVM interpretiert diese Anweisungen und optimiert nur die heißen Sequenzen, die häufig ausgeführt werden. Wir können Quellcode in Maschinencode umwandeln. GCC/Clang und andere tun das seit vielen Jahren. Dies ist nur eine andere Art, Dinge zu bauen. Auf diese Weise können wir beispielsweise .jar-Dateien ausführen, die auf einer Architektur (wie x86) kompiliert wurden, und sie auf ARM ausführen, da sie vom nativen Befehlssatz entkoppelt ist (sie ist stattdessen an die JVM gekoppelt).

    – denis631

    22. Januar 2019 um 13:20 Uhr

  • @RyuCoder Sie können, das tun GCJ, Multi-OS Engine, natives Graal-Image und möglicherweise weitere JVM-Implementierungen. Solche Implementierungen sind gültige JVM-Implementierungen. Diese Antwort geht fälschlicherweise davon aus, dass die Interpretation (möglicherweise mit JIT erweitert) der einzige Ansatz zur Implementierung der JVM ist.

    – cubuspl42

    6. Juni 2019 um 10:26 Uhr

Es ist ein bisschen von beidem, aber keines 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 als Interpreter von außen, aber wirklich hinter den Kulissen kompiliert es in Maschinencode.

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

  • @NaeemShah: Ich fühle mich geschmeichelt, dass Ihnen diese Antwort so gut gefallen hat, dass Sie sie fast wörtlich in einen Blogbeitrag unter Ihrem eigenen Namen kopiert haben. Und 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. Siehe die Fußzeile dieser Website, die auf die folgende Lizenz verweist: creativecommons.org/licenses/by-sa/3.0. Siehe auch diesen Blogbeitrag: blog.stackoverflow.com/2009/06/attribution-required

    – Markus Peters

    28. November 2013 um 16:44 Uhr


Wie @delnan bereits im Kommentarbereich angegeben hat, ist es weder.

JVM ist eine abstrakte laufende Maschine Java-Bytecode.

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.

  • ART ist auch Dolmetscher: „Android kann das tatsächlich ausführen .dex Code direkt über Interpretation oder Just-In-Time (JIT) Kompilierung …” (source.android.com/devices/tech/ota/ab/…)

    – Irfan Latif

    29. Februar 2020 um 22:38 Uhr

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

Es ist beides. Es kann Bytecode interpretieren und in nativen Code kompilieren.

Benutzer-Avatar
Sarth

Javac ist ein Compiler, aber kein herkömmlicher Compiler. Ein Compiler wandelt normalerweise den Quellcode zur Ausführung in eine Maschinensprache um, und das geschieht in einem einzigen Schritt, dh der gesamte Code wird EINMAL genommen und in eine Maschinensprache konvertiert. (mehr dazu weiter unten). Während JavaC es in Bytecode anstelle von Sprache auf Maschinenebene konvertiert.

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, die JIT enthält, hat mehrere Implementierungen. Hotspot ist einer der wichtigsten für die Java-Programmierung. Durch die Hotspot-Implementierung optimiert JIT die Ausführung, indem Codeabschnitte, die sich wiederholen, auf einmal in Maschinensprache konvertiert werden (wie ein Compiler, wie oben erwähnt), sodass sie schneller ausgeführt werden können, anstatt jede Codezeile 1 nach 1 zu konvertieren Antwort ist nicht schwarz und weiß 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, können Sie diese gerne vorschlagen.

Benutzer-Avatar
Der Fuchs

JVM hat sowohl einen Compiler als auch einen Interpreter. Denn der Compiler kompiliert den Code und generiert Bytecode. Danach wandelt der Interpreter Bytecode in maschinenverständlichen Code um.

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

  • Sie haben vergessen, Caps auszuschalten 🙂

    – Aleksej Wasinow

    1. Mai 2012 um 7:58 Uhr

  • Falsch, Sie kompilieren zuerst den Quellcode in Bytecode (hat nichts mit JVM zu tun), dann interpretiert die JVM den Bytecode und kompiliert ihn in nativen Code (aber vielleicht nicht jeden Teil).

    – Der Fuchs

    1. Mai 2012 um 8:32 Uhr

1246340cookie-checkIst die JVM ein Compiler oder ein Interpreter?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy