close

Java-Bytecode

Zur Navigation gehen Zur Suche gehen

Der Java-Bytecode befindet sich in der Datei mit der Erweiterung .class und ist die Art von Anweisungen, die die Java Virtual Machine (JVM) erwartet, um später mit einem JIT -Compiler in Maschinensprache kompiliert zu werden Hinrichtung. Es ist normalerweise das Ergebnis der Verwendung eines Java -Programmiersprachen- Compilers (z. B. javac), kann aber auch von anderen Compilern generiert werden.

Struktur

Der Opcode jeder Anweisung ist ein Byte lang, obwohl einige Parameter erfordern, was zu Multibyte-Anweisungen führt. Nicht alle 256 möglichen Opcodes werden verwendet. Tatsächlich hat Sun Microsystems , der ursprüngliche Schöpfer der Java-Plattform, drei Werte aufgeteilt, um dauerhaft nicht implementiert zu bleiben. [ 1 ]

Anweisungen fallen in die folgenden Kategorien:

  • Bewegen Sie sich vom Speicher zu den Registern und umgekehrt (z. B. aload_0, istore)
  • Arithmetik und Logik (z. B. ladd, fcmpl)
  • Typkonvertierung (z. B. i2b, d2i)
  • Objekterstellung und -manipulation (z. B. new, putfield)
  • Manipulation des Operandenstacks (z. B. swap, dup2)
  • Flusskontrolle (z. B. ifeq, goto)
  • Aufruf von Methoden und deren Rückgabe (zB invokespecial, areturn)

Es gibt auch ein paar Anweisungen für speziellere Operationen, wie z. B. Ausnahmebehandlung , Synchronisation usw.

Der Java-Bytecode-Stil ist analog zu dem einer Stack-orientierten Programmiersprache . Beispielsweise sieht der Assembler-Code zum Hinzufügen von zwei Registern und Verschieben des Ergebnisses in ein drittes für eine CPU der x86 - Familie wie folgt aus:

 füge  eax ,  edx 
 mov  ecx ,  eax hinzu

während vergleichbarer Code in der Java - Assemblersprache so aussehen würde:

iload_1
iload_2
iadd
istore_3

Die beiden zu addierenden Werte werden auf einen Stapel gelegt, von dem sie durch den Additionsbefehl genommen werden. Das Ergebnis der Addition wird auf den Stapel zurückgeschoben und von der letzten Anweisung abgerufen, die es in das Register verschiebt.

Umgang mit dynamischen Sprachen

Die Java Virtual Machine bietet eine gewisse Unterstützung für den Umgang mit dynamisch typisierten Sprachen. Die meisten JVM-Anweisungen sind statisch typisiert, in dem Sinne, dass Methodenaufrufe ihre "Signatur" zur Kompilierzeit prüfen , ohne einen Mechanismus, um diese Entscheidung zur Laufzeit zu verzögern oder die Ausführungsmethode zu wählen. "Dispatch" gemäß einem alternativen Ansatz. [ 2 ]

JSR 292 ( Supporting Dynamically Typed Languages ​​​​on the Java™ Platform ) [ 3 ] enthält eine neue Anweisung invokedynamic, um dynamisch typisierte Methodenaufrufe zu ermöglichen. „Da Vinci-Maschine“ ist eine Prototypimplementierung einer virtuellen Maschine, die die JVM-Erweiterungen hostet, um diese Sprachen zu handhaben. Ebenso enthält die offizielle Java Virtual Machine seit ihrer Version 7 auch den Opcode invokedynamic.

Referenzen

  1. VM-Spezifikation – Reservierte Opcodes
  2. ^ Nutter, Charles (3. Januar 2007). "InvokeDynamic: Wirklich nützlich?" . Abgerufen am 25.01.2008 . 
  3. siehe JSR 292