Java bytekode

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 23. juni 2021; checks kræver 2 redigeringer .

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

Instruktioner

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.

Eksempel

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

Generation

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

  • Jikes  - kompilerer Java-kode til Java-bytekode (udviklet af IBM , skrevet i C++ ),
  • Espresso - kompilerer Java-kode til Java-bytekode (for Java 1.0-version),
  • GCJ (GNU Compiler for Java) - kompilerer Java-kode til Java-bytekode, er også i stand til at kompilere til indbygget maskinkode , er en del af GNU Compiler Collection .

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 .

Noter

  1. Peter Haggar, At forstå bytecode gør dig til en bedre programmør Arkiveret 8. december 2008 på Wayback Machine // IBM DeveloperWorks, 1. juli 2001
  2. A Formal Introduction to the Compilation of Java, Stephan Diehl, "Software - Practice and Experience", Vol. 28(3), side 297-327, marts 1998. . Hentet 25. april 2013. Arkiveret fra originalen 25. maj 2013.
  3. Nutter, Charles InvokeDynamic: Faktisk nyttigt? (3. januar 2007). Dato for adgang: 25. januar 2008. Arkiveret fra originalen 30. april 2013.

Se også

  • Java bytecode instruktioner

Links