Java-bytekod är en uppsättning instruktioner som exekveras av Java Virtual Machine . Varje bytekod opcode är en byte; inte alla 256 möjliga opcode-värden används, 51 av dem är reserverade för framtida användning.
För programmering i Java eller andra JVM -kompatibla språk är kunskap om funktionerna i bytecode inte nödvändig, men "att förstå bytecode och förstå mekanismerna för att generera den av Java-kompilatorn hjälper Java-programmeraren på samma sätt som kunskap om monteringen språket hjälper programmeraren att skriva i C eller C++ » [1] [2] .
Koden CA 16 är reserverad för användning av debuggern och används inte av språket, liksom koderna FE 16 och FF 16 , som är reserverade för användning av den virtuella maskinen och debuggers. Koder i intervallet CB 16 -FD 16 används inte i den aktuella versionen av JVM och är reserverade för framtida tillägg.
Instruktioner kan delas in i flera grupper:
Det finns också några instruktioner som utför specifika uppgifter som att kasta undantag, synkronisera och så vidare.
Många instruktioner har prefix eller suffix som matchar deras operander:
prefix eller suffix | operandtyp |
---|---|
I | heltal |
L | lång |
S | kort |
B | byte |
C | karaktär |
F | flyta |
D | dubbel |
A | referens |
Till exempel är operationen IADD addition av två heltal, medan FADD är addition av flyttal.
Kod på Java-språk :
yttre : för ( int i = 2 ; i < 1000 ; i ++ ) { for ( int j = 2 ; j < i ; j ++ ) { if ( i % j == 0 ) fortsätt yttre ; } System . ut . println ( i ); }kompilatorn kan översätta till följande bytekod:
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_1_21 : iload_1_21 9 : iload_1_21 : iload_1 21 9 : iload_1_21 9 25: iinc 2 , 1 28: goto 11 31: getstatic #84 ; //Fält java/lang/System.out:Ljava/io/PrintStream; 34: iload_1 35: invokevirtual #85 ; //Method java/io/PrintStream.println:(I)V 38: iinc 1 , 1 41: goto 2 44: returnI de flesta fall genereras Java-bytekod för exekvering på Java Virtual Machine från Java -källkod . Den enda inbyggda kompilatorn som konverterar Java-kod till Java-bytekod är Javac , som skapades av Sun Microsystems . Men eftersom alla Java-bytekodspecifikationer är tillgängliga finns det kompilatorer från tredje part som genererar denna bytekod. Exempel på sådana kompilatorer:
För vissa projekt finns det kompilatorer som låter dig generera bytekod för JVM från källkod på ett annat programmeringsspråk, sådana projekt inkluderar:
De flesta befintliga JVM-instruktioner är statiskt skrivna : metodsignaturer på deras anropsplatser kontrolleras vid kompilering, men det finns ingen mekanism för att överföra denna kontroll till körningstid [3] . Ett antal dynamiskt typade språk har dock implementerats för JVM .