Java bytecode je sada instrukcí prováděných Java Virtual Machine . Každý operační kód bajtového kódu je jeden bajt; není použito všech 256 možných hodnot operačních kódů, 51 z nich je rezervováno pro budoucí použití.
Pro programování v Javě nebo jiných jazycích kompatibilních s JVM není znalost funkcí bajtkódu nutná, nicméně „pochopení bajtkódu a pochopení mechanismů pro jeho generování kompilátorem Java pomáhá programátorovi v Javě stejným způsobem, jako znalost sestavení jazyk pomáhá programátorovi psát v C nebo C++ » [1] [2] .
Kód CA 16 je vyhrazen pro použití debuggerem a jazyk jej nepoužívá, stejně jako kódy FE 16 a FF 16 , které jsou vyhrazeny pro použití virtuálním strojem a ladicími programy. Kódy v rozsahu CB 16 -FD 16 se v aktuální verzi JVM nepoužívají a jsou vyhrazeny pro budoucí doplnění.
Pokyny lze rozdělit do několika skupin:
Existuje také několik pokynů, které provádějí specifické úkoly, jako je vyvolání výjimek, synchronizace a tak dále.
Mnoho instrukcí má předpony nebo přípony, které odpovídají jejich operandům:
předpona nebo přípona | typ operandu |
---|---|
I | celé číslo |
L | dlouho |
S | krátký |
B | byte |
C | charakter |
F | plovák |
D | dvojnásobek |
A | odkaz |
Například operace IADD je sčítání dvou celých čísel, zatímco FADD je sčítání čísel s plovoucí desetinnou čárkou.
Kód v jazyce Java :
vnější : for ( int i = 2 ; i < 1000 ; i ++ ) { for ( int j = 2 ; j < i ; j ++ ) { if ( i % j == 0 ) pokračovat vnější ; } Systém . ven . println ( i ); }kompilátor může přeložit do následujícího bajtkódu:
0: iconst_2 1: istore_1 2: iload_1 3: sipush 1000 6: if_icmpge 44 9: iconst_2 10: istore_2 11: iload_2 12 : iload_1 13 : if_icmpge 31 16 : iload iload : 3 i2 : 2 17 25: iinc 2 , 1 28: goto 11 31: getstatic #84 ; //Pole java/lang/System.out:Ljava/io/PrintStream; 34: iload_1 35: invokevirtual #85 ; //Metoda java/io/PrintStream.println:(I)V 38: iinc 1 , 1 41: goto 2 44: returnVe většině případů je bajtový kód Java generován pro spuštění na virtuálním stroji Java ze zdrojového kódu Java . Jediným nativním kompilátorem, který převádí kód Java na bajtový kód Java, je Javac , který byl vytvořen společností Sun Microsystems . Ale protože jsou k dispozici všechny specifikace bajtového kódu Java, existují kompilátory třetích stran, které generují tento bajtový kód. Příklady takových kompilátorů:
Pro některé projekty existují kompilátory, které umožňují generovat bytecode pro JVM ze zdrojového kódu v jiném programovacím jazyce, mezi takové projekty patří:
Většina existujících instrukcí JVM je staticky typována : podpisy metod na jejich místech volání jsou kontrolovány v době kompilace, ale neexistuje žádný mechanismus, který by tuto kontrolu přenesl do běhového prostředí [3] . Pro JVM však byla implementována řada dynamicky typovaných jazyků .