Java bytecode er et sæt instruktioner, der udføres af Java Virtual Machine . Hver bytekode opcode er én byte; ikke alle 256 mulige opcode-værdier bruges, 51 af dem er reserveret til fremtidig brug.
For programmering i Java eller andre JVM -kompatible sprog er kendskab til funktionerne i bytekode ikke nødvendigt, men "forståelse af bytekode og forståelse af mekanismerne til at generere den af Java-kompileren hjælper Java-programmøren på samme måde som viden om samlingen sprog hjælper programmøren ved at skrive i C eller C++ » [1] [2] .
Koden CA 16 er reserveret til brug af debuggeren og bruges ikke af sproget, ligesom koderne FE 16 og FF 16 , som er reserveret til brug af den virtuelle maskine og debuggere. Koder i området CB 16 -FD 16 bruges ikke i den nuværende version af JVM og er forbeholdt fremtidige tilføjelser.
Instruktioner kan opdeles i flere grupper:
Der er også et par instruktioner, der udfører specifikke opgaver, såsom at smide undtagelser, synkronisere og så videre.
Mange instruktioner har præfikser eller suffikser, der matcher deres operander:
præfiks eller suffiks | operand type |
---|---|
I | heltal |
L | lang |
S | kort |
B | byte |
C | Karakter |
F | flyde |
D | dobbelt |
A | reference |
For eksempel er operationen IADD tilføjelsen af to heltal, mens FADD er tilføjelsen af flydende kommatal.
Kode på Java sprog :
ydre : for ( int i = 2 ; i < 1000 ; i ++ ) { for ( int j = 2 ; j < i ; j ++ ) { if ( i % j == 0 ) fortsæt ydre ; } System . ud . println ( i ); }compileren kan oversætte til følgende bytekode:
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 : iload_1 21 : iload_1 21 : iload_1 21 : iload_1 21 : got 25: iinc 2 , 1 28: goto 11 31: getstatic #84 ; //Field 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 fleste tilfælde genereres Java-bytekode til udførelse på Java Virtual Machine fra Java -kildekode . Den eneste native compiler, der konverterer Java-kode til Java-bytekode, er Javac , som blev skabt af Sun Microsystems . Men da alle Java-bytekode-specifikationer er tilgængelige, er der tredjeparts-kompilere, der genererer denne bytekode. Eksempler på sådanne compilere:
For nogle projekter er der compilere, der giver dig mulighed for at generere bytekode til JVM'en fra kildekode i et andet programmeringssprog, sådanne projekter inkluderer:
De fleste eksisterende JVM-instruktioner er statisk skrevet : metodesignaturer på deres opkaldssteder kontrolleres på kompileringstidspunktet, men der er ingen mekanisme til at overføre denne kontrol til runtime [3] . Der er dog implementeret en række dynamisk indtastede sprog til JVM .