2010-02-04 5 views
13

Ich habe oft gehört, dass Java JIT (Just-in-Time) -Kompilierung implementiert und seine Bytecodes, die plattformübergreifend übertragbar sind, von JVM "interpretiert" werden. Ich weiß jedoch nicht wirklich, was die Bytecodes sind und was die JVM tatsächlich in der Java-Spracharchitektur bedeutet; Ich würde gerne mehr über sie wissen.Was sind Bytecodes und wie behandelt die JVM sie?

+3

hoffe http://en.wikipedia.org/wiki/Bytecode würde helfen. – Jichao

Antwort

36

Die JVM (Java Virtual Machine) hat einen Befehlssatz genau wie eine echte Maschine. Der Name dieses Befehlssatzes ist Java Bytecode. Es ist in der Java Virtual Machine Specification beschrieben. Andere Sprachen werden vor der Ausführung in einen Bytecode übersetzt, zum Beispiel Ruby und Python. Javas Bytecode ist auf einem ziemlich niedrigen Niveau, während Pythons viel höher ist.

Interpretation und JIT-Kompilierung sind zwei verschiedene Strategien zum Ausführen von Bytecode. Die Interpretation verarbeitet nacheinander Bytecodes, die die Änderungen am Zustand der virtuellen Maschine vornehmen, die in jeder Anweisung codiert sind. Die JIT-Kompilierung übersetzt den Bytecode in Anweisungen, die für die Hostplattform nativ sind und gleichwertige Operationen ausführen.

Interpretation ist in der Regel schnell zu starten, aber langsam während der Ausführung, während JIT mehr Startup-Overhead hat, aber danach schneller läuft. Moderne JVMs verwenden eine Kombination aus Interpretations- und JIT-Techniken, um beide zu nutzen. Der Bytecode wird zuerst interpretiert, während der JIT ihn im Hintergrund übersetzt. Sobald die JIT-Kompilierung abgeschlossen ist, schaltet die JVM diesen Code anstelle des Interpreters ein. Manchmal kann die JIT-Kompilierung bessere Ergebnisse liefern als die vorzeitige Kompilierung für C und C++, da sie dynamischer ist.Die JVM kann verfolgen, wie oft Code aufgerufen wird und wie die typischen Pfade durch den Code aussehen, und diese Informationen verwenden, um effizienteren Code zu erzeugen, während das Programm läuft. Die JVM kann zu diesem neuen Code genauso wechseln, wie wenn sie anfänglich vom Interpreter zum JIT-Code wechselt.

Genau wie es andere Sprachen gibt, die auf nativen Code kompilieren, wie C, C++, Fortran; Es gibt Compiler für andere Sprachen, die JVM-Bytecode ausgeben. Ein Beispiel ist die Scala-Sprache. Ich glaube, dass groovy und jruby auch in Java-Bytecode konvertieren können.

+1

+1 sehr gut erklärt – stacker

+1

_Der Bytecode wird zuerst interpretiert, während das JIT es im Hintergrund übersetzt. Ist das ein vielschichtiges Konzept oder ein sequentieller Prozess? – jmishra

+2

@ LadiesMan217 das ist natürlich, bis zu der bestimmten Implementierung; aber ich erwarte, dass moderne JVMs den JIT-Compiler in einem parallelen Thread –

13

Bytecode ist ein Schritt zwischen Ihrem Quellcode und dem tatsächlichen Maschinencode. Die JVM nimmt den Bytecode und übersetzt ihn in Maschinencode.

JIT bezieht sich auf die Tatsache, dass die JVM erledigt diese Übersetzung on the fly, wenn das Programm ausgeführt wird, anstatt in einem einzigen Schritt (wie in einem traditionell kompilierte/verknüpften Sprache wie C oder C++)

Der Punkt von Bytecode ist, dass Sie bessere Leistung als eine streng interpretierte Sprache (wie PHP zum Beispiel) bekommen, weil der Bytecode bereits teilweise kompiliert und optimiert ist. Da der Bytecode nicht direkt von der CPU interpretiert werden muss, muss er auch nicht an irgendeine spezifische CPU-Architektur gebunden sein, die ihn portabler macht.

Der Nachteil ist natürlich, dass es im Allgemeinen ein bisschen langsamer als eine nativ kompilierte Anwendung ist, da die JVM noch einige Arbeit bei der Übersetzung des Bytecodes in den Maschinencode leisten muss.

+0

"Die JVM nimmt den Bytecode und übersetzt ihn in Maschinencode." Nicht immer, oder? –

0

Wenn Sie etwas in Java kompilieren, generiert der Compiler Bytecode. Dies ist systemeigener Code für die Java Virtual Machine. Die JVM übersetzt dann den Bytecode in nativen Code für Ihren Prozessor/Ihre Architektur, hier findet die JIT statt. Ohne JIT würde die JVM das Programm eine Anweisung nach der anderen übersetzen, was sehr langsam ist.

0

jcyang bereitgestellt bereits einen Link zu Wikipedia, aber dies ist eine bessere Abstimmung auf Ihre Frage:

Java Bytecode

Die Java-Compiler kompiliert Java-Quellcode zu Klassendateien. Die Methoden der Klasse werden in Bytecode übersetzt, und die Java Virtual Machine (JVM) interpretiert diesen Bytecode. Ein Just-In-Time-Compiler (JIT) kann verwendet werden, um den Byte-Code in Maschinencode zu übersetzen, um die Ausführung von Klassenmethoden zu beschleunigen.

0

Bytecode ist das JVM-Äquivalent von Maschinensprachanweisungen.

0

JVM ist eine virtuelle Maschine, die zum Ausführen von Java-Code verwendet wird. Wir können JVM mit einem Compiler vergleichen, da wir ohne sie keinen Java-Code kompilieren und Anwendungen erstellen können. JVM ist nichts anderes als ein Code, der Ihren Java-Code belegt. Die Hauptaufgabe von JVM besteht darin, den Java-Code in Java-Bytecode zu konvertieren und ihn zu kompilieren. Dies erleichtert die Java-Entwicklung. Sehen Sie sich this article an, wenn Sie mehr darüber erfahren möchten, wie Java Virtual Machine funktioniert?

0

Oracle jdk

Programmiercode, der, einmal kompiliert, wird anstelle des Computer-Prozessor über eine virtuelle Maschine ausgeführt werden. Mithilfe dieses Ansatzes kann Quellcode auf jeder Plattform ausgeführt werden, nachdem sie kompiliert und durch die virtuelle Maschine ausgeführt wurde.

Bytecode ist das kompilierte Format für Java-Programme. Sobald ein Java-Programm in Bytecode konvertiert wurde, kann es über ein Netzwerk übertragen und von Java Virtual Machine (JVM) ausgeführt werden. Bytecode-Dateien haben in der Regel die Erweiterung .class.

Verwandte Themen