Java bytekode - Java bytecode
Java bytekode er instruksjonssettet til den virtuelle Java -maskinen (JVM).
Forholdet til Java
En Java -programmerer trenger ikke å være klar over eller forstå Java -bykode i det hele tatt. Imidlertid, som foreslått i IBM developerWorks -journal, "Å forstå bytecode og hvilken bytecode som sannsynligvis vil bli generert av en Java -kompilator, hjelper Java -programmereren på samme måte som kunnskap om montering hjelper C- eller C ++ -programmereren."
Instruksjonssett arkitektur
JVM er både en stabelmaskin og en registermaskin . Hver ramme for et metodeanrop har en "operandstabel" og en rekke "lokale variabler". Operandstakken brukes til operander til beregninger og til å motta returverdien for en kalt metode, mens lokale variabler tjener samme formål som registre og også brukes til å sende metodeargumenter. Maksimal størrelse på operandstakken og den lokale variabelgruppen, beregnet av kompilatoren, er en del av attributtene til hver metode. Hver kan være uavhengig størrelse fra 0 til 65535 verdier, hvor hver verdi er 32 bits. longog doubletyper, som er 64 bits, tar opp to påfølgende lokale variabler (som ikke trenger å være 64-biters justert i den lokale variabelen) eller en verdi i operandstakken (men regnes som to enheter i dybden av stabelen) .
Instruksjonssett
Hver bytekode består av en byte som representerer opoden , sammen med null eller flere byte for operander.
Av de 256 mulige byte-lange opkodene , fra 2015, er 202 i bruk (~ 79%), 51 er reservert for fremtidig bruk (~ 20%), og 3 instruksjoner (~ 1%) er permanent reservert for JVM-implementeringer til bruk. To av disse ( impdep1og impdep2) skal gi feller for henholdsvis implementeringsspesifikk programvare og maskinvare. Den tredje brukes for debuggere for å implementere breakpoints.
Instruksjonene faller inn i en rekke brede grupper:
- Last og lagre (f.eks
aload_0.istore) - Aritmetikk og logikk (f.eks
ladd.fcmpl) - Type konvertering (f.eks
i2b.d2i) - Objektopprettelse og manipulering (
new,putfield) - Operand stack management (f.eks
swap.dup2) - Kontrolloverføring (f.eks
ifeq.goto) - Metodeinnkallelse og retur (f.eks
invokespecial.areturn)
Det er også noen få instruksjoner for en rekke mer spesialiserte oppgaver som unntakskasting, synkronisering, etc.
Mange instruksjoner har prefikser og/eller suffikser som refererer til typer operander de opererer på. Disse er som følger:
| Prefiks/suffiks | Operand type |
|---|---|
i |
heltall |
l |
lang |
s |
kort |
b |
byte |
c |
karakter |
f |
flyte |
d |
dobbelt |
a |
henvisning |
For eksempel iaddvil legge til to heltall, mens daddvil legge til to dobler. Den const, loadog storeinstruksjoner kan også ta et suffiks av formen , hvor n er et tall fra 0-3 og . Maksimum n for er forskjellig etter type.
_nloadstoreconst
De constinstruksjoner presse en verdi av den angitte typen på stakken. For eksempel, iconst_5skyver et heltall (32 biters verdi) med verdien 5 på bunken, mens dconst_1det skyver en dobbel (64 bit flytende verdi) med verdien 1 på bunken. Det er også en aconst_null, som skyver en nullreferanse. Den n for loadog storeinstruksjoner spesifiserer indeksen i den lokale variable array til last fra eller lagre til. Den aload_0instruksjon skyver gjenstanden i lokal variabel 0 over stabelen (dette er vanligvis det thisobjekt). istore_1lagrer heltallet på toppen av stabelen i lokal variabel 1. For lokale variabler utover 3 slippes suffikset og operander må brukes.
Eksempel
Vurder følgende Java -kode:
outer:
for (int i = 2; i < 1000; i++) {
for (int j = 2; j < i; j++) {
if (i % j == 0)
continue outer;
}
System.out.println (i);
}
En Java -kompilator kan oversette Java -koden ovenfor til bytekode som følger, forutsatt at ovennevnte ble satt i en metode:
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
17: iload_2
18: irem
19: ifne 25
22: goto 38
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
Generasjon
Det vanligste språket som er rettet mot Java virtuell maskin ved å produsere Java bytecode er Java. Opprinnelig eksisterte bare en kompilator, javac -kompilatoren fra Sun Microsystems , som kompilerer Java -kildekoden til Java -bytekoden; men fordi alle spesifikasjonene for Java bytecode nå er tilgjengelige, har andre parter levert kompilatorer som produserer Java bytecode. Eksempler på andre kompilatorer inkluderer:
- Eclipse -kompilator for Java (ECJ)
- Jikes , kompilerer fra Java til Java bytecode (utviklet av IBM , implementert i C ++ )
- Espresso, kompilerer fra Java til Java bytecode (bare Java 1.0)
- GNU Compiler for Java (GCJ), kompilerer fra Java til Java bytecode; den kan også kompilere til opprinnelig maskinkode og var en del av GNU Compiler Collection (GCC) frem til versjon 6.
Noen prosjekter gir Java -montører for å gjøre det mulig å skrive Java -bytekode for hånd. Monteringskode kan også genereres av maskinen, for eksempel av en kompilator som er rettet mot en virtuell Java -maskin . Bemerkelsesverdige Java -montører inkluderer:
- Jasmin , tar tekstbeskrivelser for Java-klasser, skrevet i en enkel montering-lignende syntaks ved hjelp av Java virtuell maskin instruksjonssett og genererer en Java-klassefil
- Jamaica, en makro assembly for Java virtuell maskin . Java -syntaks brukes for klasse- eller grensesnittdefinisjon. Metodelegemer er spesifisert ved hjelp av bytecode -instruksjoner.
- Krakatau Bytecode Tools, inneholder for øyeblikket tre verktøy: en dekompilator og demonterer for Java -klassefiler og en assembler for å lage klassefiler.
- Lilac, en montør og demonterer for den virtuelle Java -maskinen .
Andre har utviklet kompilatorer for forskjellige programmeringsspråk for å målrette mot den virtuelle Java -maskinen, for eksempel:
- Kald fusjon
- JRuby og Jython , to skriptspråk basert på Ruby og Python
- Apache Groovy , valgfritt skrevet og dynamisk generell språk, med funksjoner for statisk skriving og statisk kompilering
- Scala , et typesikkert programmeringsspråk for alle formål som støtter objektorientert og funksjonell programmering
- JGNAT og AppletMagic, kompiler fra språket Ada til Java bytecode
- C til Java byte-kode kompilatorer
- Clojure , et funksjonelt, uforanderlig, generelt programmeringsspråk i Lisp- familien med stor vekt på samtidighet
- Kawa , en implementering av programmeringsspråket Scheme , også en dialekt av Lisp .
- MIDletPascal
- JavaFX Script -kode er kompilert til Java bytecode
- Kotlin , et statisk skrevet generell programmeringsspråk med type slutning
- Object Pascal kildekoden er kompilert til Java bytekode ved hjelp av Free Pascal 3.0+ kompilatoren.
Henrettelse
Det er flere virtuelle Java -maskiner tilgjengelig i dag for å kjøre Java -bytekode, både gratis og kommersielle produkter. Hvis kjøring av bytekode i en virtuell maskin er uønsket, kan en utvikler også kompilere Java -kildekoden eller bytekoden direkte til den opprinnelige maskinkoden med verktøy som GNU Compiler for Java (GCJ). Noen prosessorer kan kjøre Java bytekode innfødt. Slike prosessorer kalles Java -prosessorer .
Støtte for dynamiske språk
Den virtuelle Java -maskinen gir støtte for dynamisk tastede språk . Det meste av det eksisterende JVM -instruksjonssettet er statisk skrevet - i den forstand at metodeanrop får sine signaturer typekontrollert ved kompileringstidspunktet , uten en mekanisme for å utsette denne beslutningen om kjøretid , eller for å velge metodeforsendelse ved en alternativ tilnærming.
JSR 292 ( Støtter dynamisk typede språk på Java-plattformen ) la til en ny invokedynamicinstruksjon på JVM-nivå, for å tillate metodekalling avhengig av dynamisk typekontroll (i stedet for den eksisterende statisk typekontrollerte invokevirtualinstruksjonen). The Da Vinci Machine er en prototype virtuell maskin implementering som verter JVM utvidelser sikte på å støtte dynamiske språk. Alle JVM -er som støtter JSE 7 inkluderer også invokedynamicopcode.
Se også
- Java bytecode instruksjonsoppføringer
- Java -klassefil
- Liste over JVM -språk
- Java backporting verktøy
- C til Java Virtual Machine -kompilatorer
- JStik
- Common Intermediate Language (CIL), Microsofts rival til Java bytecode
- ObjectWeb ASM
- Byte Code Engineering Library
Referanser
Eksterne linker
- Oracles spesifikasjon for Java Virtual Machine
- Programmeringsspråk for Java Virtual Machine
- Bytecode Visualizer - bytecode viewer og debugger (gratis Eclipse -plugin)
- AdaptJ StackTrace - feilsøking på bytekode -nivå med full kontroll over stabelen, de lokale variablene og utførelsesflyten
- Java Class Unpacker - plugin for Total Commander, lar den åpne klassefiler som komprimerte arkiver og se felt og metoder som filer. Bytekoden kan sees som tekst ved hjelp av F3