close

Kod bajtowy Java

Przejdź do nawigacji Przejdź do wyszukiwania

Kod bajtowy Java znajduje się w pliku z rozszerzeniem .class i jest typem instrukcji, których oczekuje maszyna wirtualna Java (JVM) w celu późniejszego skompilowania do języka maszynowego za pomocą kompilatora JIT w momencie jego wykonanie. Jest to zwykle wynik użycia kompilatora języka programowania Java (takiego jak javac), ale można go wygenerować z innych kompilatorów.

Struktura

Opcode każdej instrukcji ma długość jednego bajta, chociaż niektóre wymagają parametrów, których wynikiem są instrukcje wielobajtowe. Nie wykorzystuje się wszystkich 256 możliwych opkodów. W rzeczywistości Sun Microsystems , pierwotny twórca platformy Java, podzielił trzy wartości, aby pozostać na stałe niewdrożonym. [ 1 ]

Instrukcje dzielą się na następujące kategorie:

  • Przenieś z pamięci do rejestrów i odwrotnie (np. aload_0, istore)
  • Arytmetyka i logika (np. ladd, fcmpl)
  • Konwersja typów (np. i2b, d2i)
  • Tworzenie i manipulowanie obiektami (np. nowy, putfield)
  • Manipulowanie stosem operandów (np. swap, dup2)
  • Kontrola przepływu (np. ifeq, goto)
  • Wywołanie metod i ich zwrot (np. invokespecial, areturn)

Istnieje również kilka instrukcji dotyczących bardziej wyspecjalizowanych operacji, takich jak obsługa wyjątków , synchronizacja itp.

Styl kodu bajtowego Java jest analogiczny do języka programowania zorientowanego na stos . Na przykład kod asemblera, który dodaje dwa rejestry i przenosi wynik na trzeci dla procesora z rodziny x86 , wygląda tak:

 dodaj  eax ,  edx 
 mov  ecx ,  eax

podczas gdy porównywalny kod w asemblerze Java wyglądałby tak:

iload_1
iload_2
iadd
istore_3

Dwie wartości do dodania są umieszczane na stosie, z którego zostaną pobrane przez instrukcję dodawania. Wynik dodawania jest odkładany z powrotem na stos i pobierany przez ostatnią instrukcję, która przenosi go do rejestru.

Obsługa języków dynamicznych

Maszyna wirtualna Java zapewnia pewne wsparcie dla obsługi języków o typach dynamicznych. Większość instrukcji JVM jest typowanych statycznie, w tym sensie, że wywołania metod sprawdzają ich „sygnaturę” w czasie kompilacji , bez mechanizmu opóźniania tej decyzji w czasie wykonywania lub wyboru metody wykonania „wysyłania” zgodnie z alternatywnym podejściem. [ 2 ]

JSR 292 ( Supporting Dynamicly Types Languages ​​on the Java ™ Platform ) [ 3 ] zawiera nową instrukcję invokedynamicumożliwiającą wywoływanie metod opartych na typach dynamicznych. „Maszyna Da Vinci” to prototypowa implementacja maszyny wirtualnej, która obsługuje rozszerzenia JVM w celu obsługi tych języków. Podobnie oficjalna wirtualna maszyna Javy, od wersji 7, zawiera również opcode invokedynamic.

Referencje