Cod octet Java
Codul de octeți Java se găsește în interiorul fișierului cu extensia .class și este tipul de instrucțiuni pe care mașina virtuală Java (JVM) se așteaptă să le primească pentru a fi compilate ulterior în limbajul mașinii prin intermediul unui compilator JIT la momentul efectuării sale. execuţie. Este de obicei rezultatul utilizării unui compilator de limbaj de programare Java (cum ar fi javac), dar poate fi generat din alte compilatoare.
Structură
Codul operațional al fiecărei instrucțiuni are o lungime de un octet, deși unele necesită parametri care au ca rezultat instrucțiuni pe mai mulți octeți. Nu sunt folosite toate cele 256 de opcode posibile. De fapt, Sun Microsystems , creatorul original al platformei Java, a împărțit trei valori pentru a rămâne permanent neimplementate. [ 1 ]
Instrucțiunile se încadrează în următoarele categorii:
- Mutați din memorie în registre și invers (de ex. aload_0, store)
- Aritmetică și logică (de ex. ladd, fcmpl)
- Conversie de tip (de ex. i2b, d2i)
- Crearea și manipularea obiectelor (de exemplu, new, putfield)
- Manipularea stivei de operanzi (de ex. swap, dup2)
- Controlul fluxului (de ex. ifeq, goto)
- Invocarea metodelor și returnarea lor (de ex. invokespecial, areturn)
Există, de asemenea, câteva instrucțiuni pentru operațiuni mai specializate, cum ar fi gestionarea excepțiilor , sincronizarea etc.
Stilul bytecode Java este analog cu cel al unui limbaj de programare orientat spre stivă . De exemplu, codul de asamblare pentru a adăuga două registre și a muta rezultatul la un al treilea pentru un procesor al familiei x86 arată astfel:
adauga eax , edx
mov ecx , eax
în timp ce codul comparabil în limbajul de asamblare Java ar arăta astfel:
iload_1
iload_2
iadd
istore_3
Cele două valori de adăugat sunt plasate pe o stivă, din care vor fi luate prin instrucțiunea de adăugare. Rezultatul adunării este împins înapoi pe stivă și preluat de ultima instrucțiune, care îl mută în registru.
Manipularea limbilor dinamice
Mașina virtuală Java oferă suport pentru manipularea limbilor tipizate dinamic. Majoritatea instrucțiunilor JVM sunt tipizate static, în sensul că invocările metodei își verifică „semnătura” în momentul compilării , fără un mecanism care să întârzie această decizie în timpul execuției sau să aleagă metoda de execuție „dispecer” conform unei abordări alternative. [ 2 ]
JSR 292 ( Sprijinirea limbilor tipizate dinamic pe platforma Java™ ) [ 3 ] include o nouă instrucțiune invokedynamicpentru a permite invocarea metodelor bazate pe tastare dinamică. „Mașina Da Vinci” este o implementare prototip de mașină virtuală care găzduiește extensiile JVM pentru a gestiona aceste limbaje. De asemenea, mașina virtuală oficială Java, începând cu versiunea sa 7, include și opcode-ul invokedynamic.
Referințe
- ↑ VM Spec - Opcodes rezervate
- ^ Nutter, Charles (3 ianuarie 2007). „InvokeDynamic: De fapt util?” . Consultat 2008-01-25 .
- ↑ vezi JSR 292