Java bytekod

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 23 juni 2021; kontroller kräver 2 redigeringar .

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] .

Instruktioner

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.

Exempel

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: return

Generation

I 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:

  • Jikes  - kompilerar Java-kod till Java-bytekod (utvecklad av IBM , skriven i C++ ),
  • Espresso - kompilerar Java-kod till Java-bytekod (för Java 1.0-versionen),
  • GCJ (GNU Compiler for Java) - kompilerar Java-kod till Java-bytekod, kan också kompilera till inbyggd maskinkod , är en del av GNU Compiler Collection .

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 .

Anteckningar

  1. Peter Haggar, Att förstå bytecode gör dig till en bättre programmerare Arkiverad 8 december 2008 på Wayback Machine // IBM DeveloperWorks, 01 juli 2001
  2. En formell introduktion till sammanställningen av Java, Stephan Diehl, "Programvara - övning och erfarenhet", Vol. 28(3), sid 297-327, mars 1998. . Hämtad 25 april 2013. Arkiverad från originalet 25 maj 2013.
  3. Nutter, Charles InvokeDynamic: Faktiskt användbart? (3 januari 2007). Datum för åtkomst: 25 januari 2008. Arkiverad från originalet den 30 april 2013.

Se även

  • Java bytecode instruktioner

Länkar