Kod bajtowy Java
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
- ↑ Specyfikacja maszyny wirtualnej — zarezerwowane kody operacji
- ^ Orzech, Karol (3 stycznia 2007). „InvokeDynamic: rzeczywiście przydatne?” . Źródło 2008-01-25 .
- ↑ patrz JSR 292