Java bytecode este un set de instrucțiuni executate de Java Virtual Machine . Fiecare opcode bytecode este de un octet; nu sunt folosite toate cele 256 de valori opcode posibile, 51 dintre ele sunt rezervate pentru utilizare ulterioară.
Pentru programarea în Java sau în alte limbaje compatibile cu JVM , nu este necesară cunoașterea caracteristicilor bytecode, totuși, „înțelegerea bytecode-ului și înțelegerea mecanismelor de generare a acestuia de către compilatorul Java ajută programatorul Java în același mod în care cunoașterea ansamblului. limbajul ajută programatorul, scriind în C sau C++ » [1] [2] .
Codul CA 16 este rezervat pentru utilizare de către depanator și nu este folosit de limbaj, la fel ca și codurile FE 16 și FF 16 , care sunt rezervate pentru utilizare de către mașina virtuală și depanatoare. Codurile din gama CB 16 -FD 16 nu sunt utilizate în versiunea curentă a JVM-ului și sunt rezervate pentru adăugări viitoare.
Instrucțiunile pot fi împărțite în mai multe grupuri:
Există, de asemenea, câteva instrucțiuni care efectuează sarcini specifice, cum ar fi aruncarea de excepții, sincronizarea și așa mai departe.
Multe instrucțiuni au prefixe sau sufixe care se potrivesc cu operanzii lor:
prefix sau sufix | tipul de operand |
---|---|
I | întreg |
L | lung |
S | mic de statura |
B | octet |
C | caracter |
F | pluti |
D | dubla |
A | referinţă |
De exemplu, operația IADD este adăugarea a două numere întregi, în timp ce FADD este adăugarea de numere în virgulă mobilă.
Cod în limbajul Java :
exterior : for ( int i = 2 ; i < 1000 ; i ++ ) { for ( int j = 2 ; j < i ; j ++ ) { if ( i % j == 0 ) continua exterior ; } Sistem . afară . println ( i ); }compilatorul se poate traduce în următorul bytecode:
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 22: 16: iload_1 22 : 19 : iload_1 2 2 3 25: iinc 2 , 1 28: goto 11 31: getstatic #84 ; //Câmp 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: returnÎn cele mai multe cazuri, codul octet Java este generat pentru execuție pe mașina virtuală Java din codul sursă Java . Singurul compilator nativ care convertește codul Java în bytecode Java este Javac , care a fost creat de Sun Microsystems . Dar, din moment ce toate specificațiile de bytecode Java sunt disponibile, există compilatoare terțe care generează acest bytecode. Exemple de astfel de compilatoare:
Pentru unele proiecte, există compilatoare care vă permit să generați bytecode pentru JVM din codul sursă într-un alt limbaj de programare, astfel de proiecte includ:
Majoritatea instrucțiunilor JVM existente sunt tipizate static : semnăturile metodelor de pe site-urile lor de apel sunt verificate în timpul compilării, dar nu există niciun mecanism care să ducă această verificare la runtime [3] . Cu toate acestea, o serie de limbaje tip dinamic au fost implementate pentru JVM .