Cod octet Java

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 23 iunie 2021; verificările necesită 2 modificări .

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

Instrucțiuni

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

Exemplu

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

Generație

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

  • Jikes  - compileazã codul Java în bytecode Java (dezvoltat de IBM , scris în C++ ),
  • Espresso - compilează codul Java în bytecode Java (pentru versiunea Java 1.0),
  • GCJ (GNU Compiler for Java) - compilează codul Java în bytecode Java, este, de asemenea, capabil să compileze în codul mașină nativ , face parte din colecția de compilatori GNU .

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 .

Note

  1. Peter Haggar, Understanding bytecode makes you a better programar Arhivat 8 decembrie 2008 la Wayback Machine // IBM DeveloperWorks, 01 iulie 2001
  2. A Formal Introduction to the Compilation of Java, Stephan Diehl, „Software – Practice and Experience”, Vol. 28(3), paginile 297-327, martie 1998. . Consultat la 25 aprilie 2013. Arhivat din original pe 25 mai 2013.
  3. Nutter, Charles InvokeDynamic: De fapt util? (3 ianuarie 2007). Data accesului: 25 ianuarie 2008. Arhivat din original la 30 aprilie 2013.

Vezi și

  • instrucțiuni Java bytecode

Link -uri