Java -tavukoodi - Java bytecode

Java bytecode on käskykannan ja Java-virtuaalikone (JVM).

Suhde Javaan

Java ohjelmoija ei tarvitse olla tietoinen tai ymmärtää Java bytecode ollenkaan. Kuitenkin, kuten IBM -kehittäjäWorks -lehdessä ehdotetaan , "Tavukoodin ja Java -kääntäjän luoman tavukoodin ymmärtäminen auttaa Java -ohjelmoijaa samalla tavalla kuin kokoonpanotieto auttaa C- tai C ++ -ohjelmoijaa."

Ohjejoukon arkkitehtuuri

JVM on sekä pino- että rekisterikone . Jokaisessa menetelmäkutsun kehyksessä on "operandipino" ja joukko "paikallisia muuttujia". Operandipinoa käytetään operandeihin laskutoimituksiin ja kutsutun menetelmän palautusarvon vastaanottamiseen, kun taas paikalliset muuttujat palvelevat samaa tarkoitusta kuin rekisterit ja niitä käytetään myös menetelmäargumenttien välittämiseen. Kääntäjän laskema operandipinon ja paikallisen muuttujaryhmän enimmäiskoko on osa kunkin menetelmän määritteitä. Kukin niistä voidaan mitoittaa itsenäisesti 0 - 65535 arvoon, joissa kukin arvo on 32 bittiä. longja doubletyypit, jotka ovat 64-bittisiä, käyttävät kahta peräkkäistä paikallista muuttujaa (joiden ei tarvitse olla 64-bittisiä linjassa paikallisten muuttujien matriisissa) tai yhden arvon operandipinossa (mutta ne lasketaan kahdeksi yksiköksi pinon syvyydessä) .

Käyttöohjeet

Jokainen tavukoodi koostuu yhdestä tavusta, joka edustaa opcodea , sekä nolla tai useampia tavuja operandeille.

Vuodesta 2015 lähtien 256 mahdollisesta tavun pituisesta opcodeista 202 on käytössä (~ 79%), 51 on varattu tulevaa käyttöä varten (~ 20%) ja 3 käskyä (~ 1%) on pysyvästi varattu JVM-toteutuksille käyttää. Kaksi näistä ( impdep1ja impdep2) on tarkoitettu tarjoamaan ansoja toteutukseen liittyville ohjelmistoille ja laitteille. Kolmatta käytetään debuggereihin katkaisupisteiden toteuttamiseen.

Ohjeet jakautuvat useisiin laajoihin ryhmiin:

  • Lataa ja säilytä (esim aload_0. istore)
  • Aritmetiikka ja logiikka (esim ladd. fcmpl)
  • Tyypin muuntaminen (esim i2b. d2i)
  • Kohteen luominen ja käsittely ( new, putfield)
  • Operandipinojen hallinta (esim swap. dup2)
  • Ohjauksen siirto (esim ifeq. goto)
  • Menetelmän kutsuminen ja palautus (esim invokespecial. areturn)

Siellä on myös muutamia ohjeita useille erikoistuneille tehtäville, kuten poikkeusheitto, synkronointi jne.

Monissa ohjeissa on etuliitteitä ja/tai jälkiliitteitä, jotka viittaavat siihen, minkä tyyppisiä operandeja ne käyttävät. Nämä ovat seuraavat:

Etuliite/pääte Operandin tyyppi
i kokonaisluku
l pitkä
s lyhyt
b tavu
c merkki
f kellua
d kaksinkertainen
a viite

Esimerkiksi iaddlisää kaksi kokonaislukua ja daddkaksi tuplaa. const, loadJa storeohjeet voivat myös ottaa pääte muotoa , jossa n on luku 0-3 varten ja . Maksimi n varten poikkeaa tyypin. _nloadstoreconst

constOhjeet työntää arvo määritetyn tyyppinen pinoon. iconst_5Työnnä esimerkiksi pinoon kokonaisluvun (32 -bittinen arvo) arvolla 5, kun taas dconst_1kaksinkertaisen (64 -bittinen liukulukuarvo), jonka arvo on 1, pinolle. On myös aconst_null, joka työntää nullviittauksen. N varten loadja storeohjeet määrittää indeksin paikallisen muuttujan array kuorman tai tallentaa. aload_0Ohje työntää esineen paikallisen muuttujan 0 pinoon (tämä on yleensä thisobjekti). istore_1tallentaa pinon yläosassa olevan kokonaisluvun paikalliseksi muuttujaksi 1. Paikallisille muuttujille, jotka ylittävät 3, jälkiliite pudotetaan ja operandit on käytettävä.

Esimerkki

Harkitse seuraavaa Java -koodia:

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);
}

Java -kääntäjä saattaa kääntää yllä olevan Java -koodin tavukoodiksi seuraavasti, olettaen, että yllä oleva menetelmä on lisätty:

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

Sukupolvi

Yleisin Java -virtuaalikoneeseen kohdistettava kieli tuottamalla Java -tavukoodi on Java. Alun perin oli olemassa vain yksi kääntäjä, Sun Microsystemsin javac -kääntäjä , joka kokoaa Java -lähdekoodin Java -tavukoodiksi; mutta koska kaikki Java -tavakoodin tekniset tiedot ovat nyt saatavilla, muut osapuolet ovat toimittaneet Java -tavukoodia tuottavia kääntäjiä. Esimerkkejä muista kääntäjistä ovat:

Jotkut projektit tarjoavat Java -kokoonpanijoita, jotka mahdollistavat Java -tavukoodin kirjoittamisen käsin. Kokoonpanokoodin voi luoda myös kone, esimerkiksi Java -virtuaalikoneeseen kohdistava kääntäjä . Merkittäviä Java -kokoonpanijoita ovat:

  • Jasmin ottaa Java-luokkien tekstikuvaukset, jotka on kirjoitettu yksinkertaisella kokoonpanomaisella syntaksilla käyttäen Java-virtuaalikoneen käskysarjaa ja luo Java-luokkatiedoston
  • Jamaika, joka on makro konekielellä varten Java-virtuaalikone . Java -syntaksia käytetään luokan tai käyttöliittymän määrittelyyn. Menetelmäkappaleet määritetään tavukoodiohjeilla.
  • Krakatau Bytecode Tools sisältää tällä hetkellä kolme työkalua: purkimen ja purkimen Java -luokkatiedostoille ja kokoonpanijan luomaan luokkatiedostoja.
  • Lilac, Java -virtuaalikoneen kokoonpanija ja purkija .

Toiset ovat kehittäneet kääntäjiä eri ohjelmointikielille kohdistamaan Java -virtuaalikoneen, kuten:

Toteutus

Nykyään on saatavana useita Java -virtuaalikoneita Java -tavukoodin suorittamiseen, sekä ilmaisia ​​että kaupallisia tuotteita. Jos tavukoodin suorittaminen virtuaalikoneessa ei ole toivottavaa, kehittäjä voi myös kääntää Java -lähdekoodin tai tavukoodin suoraan alkuperäiseen konekoodiin työkaluilla, kuten GNU Compiler for Java (GCJ). Jotkut prosessorit voivat suorittaa Java -tavukoodin natiivina. Tällaisia ​​suorittimia kutsutaan Java -prosessoreiksi .

Tuki dynaamisille kielille

Java-virtuaalikone tarjoaa jonkin verran tukea dynaamisesti kirjoitettu kielellä . Suurin osa nykyisestä JVM -käskysarjasta on staattisesti kirjoitettu - siinä mielessä, että menetelmäkutsujen allekirjoitukset tarkistetaan käännösaikana ilman mekanismia, joka lykkää tämän päätöksen suorittamisaikaa tai valitse menetelmälähetys vaihtoehtoisella tavalla.

JSR 292 ( Dynaamisesti kirjoitettujen kielten tukeminen Java-alustalla ) lisäsi uuden invokedynamickäskyn JVM-tasolla salliakseen menetelmän kutsumisen, joka perustuu dynaamiseen tyyppitarkistukseen (olemassa olevan staattisesti tyyppitarkistetun invokevirtualkäskyn sijasta ). Da Vinci Machine on prototyyppi virtuaalikone täytäntöönpanoa, että isännät JVM laajennuksia, joilla pyritään tukemaan dynaamisia kieliä. Kaikki JSE 7: ää tukevat JVM: t sisältävät myös optikoodin invokedynamic.

Katso myös

Viitteet

Ulkoiset linkit