Java Bytecode
Bytový kód Java se nachází uvnitř souboru s příponou .class a je to typ instrukcí, které virtuální stroj Java (JVM) očekává, že obdrží, aby mohl být později zkompilován do strojového jazyka pomocí kompilátoru JIT v době svého provedení. Obvykle je výsledkem použití kompilátoru programovacího jazyka Java (jako je javac), ale může být generován z jiných kompilátorů.
Struktura
Operační kód každé instrukce je jeden bajt dlouhý, ačkoli některé vyžadují parametry, jejichž výsledkem jsou vícebajtové instrukce. Není použito všech 256 možných operačních kódů. Ve skutečnosti Sun Microsystems , původní tvůrce platformy Java, rozdělil tři hodnoty, aby zůstaly trvale neimplementované. [ 1 ]
Pokyny spadají do následujících kategorií:
- Přesun z paměti do registrů a naopak (např. aload_0, istore)
- Aritmetika a logika (např. ladd, fcmpl)
- Převod typu (např. i2b, d2i)
- Vytváření objektů a manipulace s nimi (např. nový, putfield)
- Manipulace se zásobníkem operandů (např. swap, dup2)
- Řízení toku (např. ifeq, goto)
- Vyvolání metod a jejich návrat (např. invokespecial, areturn)
Existuje také několik pokynů pro specializovanější operace, jako je zpracování výjimek , synchronizace atd.
Styl bytecode Java je analogický stylu programovacího jazyka orientovaného na zásobník . Například kód sestavení pro přidání dvou registrů a přesunutí výsledku do třetího pro CPU rodiny x86 vypadá takto:
přidat eax , edx
mov ecx , eax
zatímco srovnatelný kód v jazyce Java assembler by vypadal takto:
iload_1
iload_2
iadd
istore_3
Dvě hodnoty, které se mají přidat, se umístí na zásobník, ze kterého je převezme instrukce pro sčítání. Výsledek sčítání je zasunut zpět do zásobníku a načten poslední instrukcí, která jej přesune do registru.
Práce s dynamickými jazyky
Virtuální stroj Java poskytuje určitou podporu pro práci s dynamicky zadávanými jazyky. Většina instrukcí JVM je staticky typována v tom smyslu, že vyvolání metod kontroluje jejich „podpis" v době kompilace , bez mechanismu, který by toto rozhodnutí zpozdil za běhu nebo zvolil metodu provedení. „odeslání" podle alternativního přístupu. [ 2 ]
JSR 292 ( Podpora dynamicky typovaných jazyků na platformě Java™ ) [ 3 ] obsahuje nový příkaz invokedynamic, který umožňuje vyvolání dynamicky typovaných metod. "Da Vinci machine" je prototyp implementace virtuálního stroje, který hostuje rozšíření JVM, aby zvládl tyto jazyky. Stejně tak oficiální virtuální stroj Java od verze 7 obsahuje také operační kód invokedynamic.
Reference
- ↑ Specifikace VM – vyhrazené operační kódy
- ^ Nutter, Charles (3. ledna 2007). "InvokeDynamic: Opravdu užitečné?" . Získáno 25. 1. 2008 .
- ↑ viz JSR 292