Java bájtkód

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2021. június 23-án felülvizsgált verziótól ; az ellenőrzések 2 szerkesztést igényelnek .

A Java bájtkód a Java virtuális gép által  végrehajtott utasítások halmaza . Minden bájtkód műveleti kód  egy bájt; nem használja mind a 256 lehetséges opkód értéket, közülük 51 van lefoglalva későbbi használatra.

Java vagy más JVM -kompatibilis nyelveken történő programozáshoz nem szükséges a bájtkód jellemzőinek ismerete, azonban „a bájtkód megértése és a Java fordító általi generálási mechanizmusok megértése ugyanúgy segíti a Java programozót, mint az összeállítás ismerete. nyelv segíti a programozót, C vagy C++ nyelven ír » [1] [2] .

Útmutató

A CA 16 kód a hibakereső számára van fenntartva, és a nyelv nem használja, ahogy az FE 16 és FF 16 kódok is, amelyek a virtuális gép és a hibakeresők számára vannak fenntartva. A CB 16 -FD 16 tartományba tartozó kódok nem használatosak a JVM jelenlegi verziójában, és a jövőbeni kiegészítések számára vannak fenntartva.

Az utasítások több csoportra oszthatók:

Van néhány utasítás is, amelyek meghatározott feladatokat hajtanak végre, például kivételek dobása, szinkronizálás stb.

Sok utasítás előtagja vagy utótagja megegyezik az operandusukkal:

előtag vagy utótag operandus típus
I egész szám
L hosszú
S rövid
B byte
C karakter
F úszó
D kettős
A referencia

Például az IADD művelet  két egész szám összeadása, míg a FADD  a lebegőpontos számok összeadása.

Példa

Java nyelvű kód :

külső : for ( int i = 2 ; i < 1000 ; i ++ ) { for ( int j = 2 ; j < i ; j ++ ) { if ( i % j == 0 ) tovább külső ; } Rendszer . ki . println ( i ); }

a fordító a következő bájtkódra tudja lefordítani:

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 _ _ 25: iinc 2 , 1 28: goto 11 31: getstatic #84 ; //Java/lang/System.out:Ljava/io/PrintStream mező; 34: iload_1 35: invokevirtual #85 ; //Java/io/PrintStream.println módszer:(I)V 38: iinc 1 , 1 41: goto 2 44: return

Generáció

A legtöbb esetben Java bájtkód jön létre a Java virtuális gépen történő végrehajtáshoz Java forráskódból . Az egyetlen natív fordító, amely a Java kódot Java bájtkóddá alakítja, a Javac , amelyet a Sun Microsystems hozott létre . De mivel az összes Java bájtkód specifikáció elérhető, vannak harmadik féltől származó fordítók, amelyek ezt a bájtkódot állítják elő. Példák az ilyen fordítókra:

Egyes projektek esetében vannak olyan fordítók, amelyek lehetővé teszik a JVM bájtkódjának generálását egy másik programozási nyelv forráskódjából. Ilyen projektek a következők:

A legtöbb létező JVM-utasítás statikusan van beírva : a hívási helyükön lévő metódus-aláírásokat a fordításkor ellenőrzik, de nincs olyan mechanizmus, amely ezt az ellenőrzést a futási időre továbbítaná [3] . A JVM-hez azonban számos dinamikusan tipizált nyelvet implementáltak .

Jegyzetek

  1. Peter Haggar, A bájtkód megértése jobb programozóvá tesz. Archiválva : 2008. december 8. a Wayback Machine -nél // IBM DeveloperWorks, 2001. július 1.
  2. Formális bevezetés a Java összeállításába, Stephan Diehl, "Szoftver - Gyakorlat és tapasztalat", Vol. 28(3), 297-327 oldal, 1998. március . Letöltve: 2013. április 25. Az eredetiből archiválva : 2013. május 25..
  3. Nutter, Charles InvokeDynamic: Valóban hasznos? (2007. január 3.). Hozzáférés dátuma: 2008. január 25. Az eredetiből archiválva : 2013. április 30.

Lásd még

  • Java bájtkód utasítások

Linkek