A Java bájtkód a Java virtuális gép által végrehajtott utasítások halmaza . Minden bájtkód műveleti kód egy bájt; nem használja mind a 256 lehetséges opkód értéket, közülük 51 van lefoglalva későbbi használatra.
Java vagy más JVM -kompatibilis nyelveken történő programozáshoz nem szükséges a bájtkód jellemzőinek ismerete, azonban „a bájtkód megértése és a Java fordító általi generálási mechanizmusok megértése ugyanúgy segíti a Java programozót, mint az összeállítás ismerete. nyelv segíti a programozót, C vagy C++ nyelven ír » [1] [2] .
A CA 16 kód a hibakereső számára van fenntartva, és a nyelv nem használja, ahogy az FE 16 és FF 16 kódok is, amelyek a virtuális gép és a hibakeresők számára vannak fenntartva. A CB 16 -FD 16 tartományba tartozó kódok nem használatosak a JVM jelenlegi verziójában, és a jövőbeni kiegészítések számára vannak fenntartva.
Az utasítások több csoportra oszthatók:
Van néhány utasítás is, amelyek meghatározott feladatokat hajtanak végre, például kivételek dobása, szinkronizálás stb.
Sok utasítás előtagja vagy utótagja megegyezik az operandusukkal:
előtag vagy utótag | operandus típus |
---|---|
I | egész szám |
L | hosszú |
S | rövid |
B | byte |
C | karakter |
F | úszó |
D | kettős |
A | referencia |
Például az IADD művelet két egész szám összeadása, míg a FADD a lebegőpontos számok összeadása.
Java nyelvű kód :
külső : for ( int i = 2 ; i < 1000 ; i ++ ) { for ( int j = 2 ; j < i ; j ++ ) { if ( i % j == 0 ) tovább külső ; } Rendszer . ki . println ( i ); }a fordító a következő bájtkódra tudja lefordítani:
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 _ _ 25: iinc 2 , 1 28: goto 11 31: getstatic #84 ; //Java/lang/System.out:Ljava/io/PrintStream mező; 34: iload_1 35: invokevirtual #85 ; //Java/io/PrintStream.println módszer:(I)V 38: iinc 1 , 1 41: goto 2 44: returnA legtöbb esetben Java bájtkód jön létre a Java virtuális gépen történő végrehajtáshoz Java forráskódból . Az egyetlen natív fordító, amely a Java kódot Java bájtkóddá alakítja, a Javac , amelyet a Sun Microsystems hozott létre . De mivel az összes Java bájtkód specifikáció elérhető, vannak harmadik féltől származó fordítók, amelyek ezt a bájtkódot állítják elő. Példák az ilyen fordítókra:
Egyes projektek esetében vannak olyan fordítók, amelyek lehetővé teszik a JVM bájtkódjának generálását egy másik programozási nyelv forráskódjából. Ilyen projektek a következők:
A legtöbb létező JVM-utasítás statikusan van beírva : a hívási helyükön lévő metódus-aláírásokat a fordításkor ellenőrzik, de nincs olyan mechanizmus, amely ezt az ellenőrzést a futási időre továbbítaná [3] . A JVM-hez azonban számos dinamikusan tipizált nyelvet implementáltak .