Java bytekode
Java - bytekoden findes inde i filen med filtypenavnet .class og er den type instruktioner, som den virtuelle Java-maskine (JVM) forventer at modtage for senere at blive kompileret til maskinsprog ved hjælp af en JIT -kompiler på tidspunktet for dens udførelse. Det er normalt resultatet af at bruge en Java -programmeringssprog- kompiler (såsom javac), men kan genereres fra andre compilere.
Struktur
Opkoden for hver instruktion er en byte lang, selvom nogle kræver parametre, der resulterer i multibyte-instruktioner. Ikke alle 256 mulige opkoder bruges. Faktisk har Sun Microsystems , den oprindelige skaber af Java-platformen, opdelt tre værdier for at forblive permanent uimplementeret. [ 1 ]
Instruktioner falder i følgende kategorier:
- Flyt fra hukommelse til registre og omvendt (f.eks. aload_0, istore)
- Aritmetik og logik (f.eks. ladd, fcmpl)
- Typekonvertering (f.eks. i2b, d2i)
- Objektoprettelse og -manipulation (f.eks. nyt, putfield)
- Manipulering af operandstakken (f.eks. swap, dup2)
- Flowkontrol (f.eks. ifeq, goto)
- Påberåbelse af metoder og deres tilbagevenden (f.eks. påberåbelse af special, areturn)
Der er også et par instruktioner til mere specialiserede operationer, såsom undtagelseshåndtering , synkronisering osv.
Java-bytekode-stilen er analog med den for et stack-orienteret programmeringssprog . For eksempel ser assemblykoden til at tilføje to registre og flytte resultatet til en tredje for en x86 - familie CPU sådan her:
tilføj eax , edx
mov ecx , eax
mens sammenlignelig kode i Java assemblersprog ville se sådan ud:
iload_1
iload_2
iadd
istore_3
De to værdier, der skal tilføjes, placeres på en stak, hvorfra de vil blive taget af additionsinstruktionen. Resultatet af tilføjelsen skubbes tilbage på stakken og hentes af den sidste instruktion, som flytter det til registret.
Håndtering af dynamiske sprog
Den virtuelle Java-maskine giver en vis støtte til håndtering af dynamisk indtastede sprog. De fleste JVM-instruktioner er statisk skrevet, i den forstand, at metodeanrop kontrollerer deres "signatur" ved kompileringstidspunktet , uden en mekanisme til at forsinke denne beslutning under kørsel eller til at vælge udførelsesmetoden "afsendelse" ifølge en alternativ tilgang. [ 2 ]
JSR 292 ( understøtter dynamisk indtastede sprog på Java™-platformen ) [ 3 ] indeholder en ny sætning invokedynamic, der tillader dynamisk typebaseret metodekald. "Da Vinci-maskine" er en prototype af virtuel maskine-implementering, der er vært for JVM-udvidelserne for at håndtere disse sprog. Ligeledes inkluderer den officielle Java virtuelle maskine, siden dens version 7, også opkoden invokedynamic.
Referencer
- ↑ VM Spec - Reserverede Opcodes
- ^ Nutter, Charles (3. januar 2007). "InvokeDynamic: Faktisk nyttigt?" . Hentet 2008-01-25 .
- ↑ se JSR 292