Byte code

Z Multimediaexpo.cz

Verze z 27. 11. 2013, 15:21; Sysop (diskuse | příspěvky)
(rozdíl) ← Starší verze | zobrazit aktuální verzi (rozdíl) | Novější verze → (rozdíl)

Bytecode (též p-code, anglicky portable code, „přenositelný kód“) je v informatice označení pro různé formy instrukčních sad navržených pro realizaci snadno přenositelných aplikací a jejich efektivní běh na cílové platformě. Zřejmě nejznámějším programovacím jazykem využívajícím bytecode je Java. Na cílovém počítači je nutné nainstalovat běhové prostředí, které zajistí prostředí pro spuštění bytecode.

Obsah

Charakteristika

Název bytecode pochází z instrukčních sad, které mají vyhrazený jeden byte pro instrukci následovaný volitelnými parametry. Co se týče čitelnosti a úrovně abstrakce kódu, je bytecode na hranici mezi kódem vyššího programovacího jazyka a strojovým kódem. Jeho cílem je usnadnit interpretaci kódu interpretem nebo snížit závislost na hardware a operačním systému. Díky tomu může stejný kód běžet na různých platformách často pomocí virtuálních strojů, nebo může být před spuštěním zkompilován do strojového kódu cílové platformy, což umožní rychlejší běh kódu.

Na rozdíl od čitelných kódů je bytecode kompaktní číselný kód konstant a odkazů (číselné adresy) a jako takový kóduje výsledek parsovánísémantické analýzy. Díky tomu je jeho interpretace rychlejší než přímá interpretace původního zdrojového kódu. Různé části kódu se mohou nacházet v různých souborech, které jsou dynamicky načítány za běhu.

Běh kódu

Interpret bytecode nejprve parsuje, čímž získá instrukce, které následně sám jednu po druhé sám vykonává. Tento způsob zajišťuje přenositelnost interpretu. Další možností jsou dynamické překladače nebo Just-in-time kompilátory (JIT), které přeloží bytecode do strojového kódu, který je následně proveden přímo procesorem. Běh takové aplikace je pak velmi rychlý, ale ztrácí se přenositelnost virtuálního stroje (ne však bytecode). Příkladem je jazyk Java, kde kód programu je typicky uložen v bytecode. Při spuštění programu na virtuálním stroji je bytecode přeložen do strojového kódu a následně vykonán. Dojde sice k prodlevě při spouštění aplikace, ale zato zvýšení výkonu za běhu programu. Díky vyššímu výkonu tohoto přístupu je často i kód skriptovacích jazyků prováděn ve dvou krocích. V prvním kroku je kód programu přeložen do bytecode a předán virtuálnímu stroji. V druhém kroku virtuální stroj přeloží bytecode do strojového kódu a spustí program. Tohoto přístupu využívají jazyky Java, Python, PHP a další.

Java bytecode

Bytecode jazyku Java vyžívá prefixové/suffixové konvence v názvu instrukcí pro označení datového typu parametrů (např. i: integer). Instrukce se dají rozdělit do několika skupin podle využití.

  • Načtení a uložení (aload_0, istore, …)
  • Aritmetické a logické (ladd, fcmpl, …)
  • Konverze datových typů (i2b, d2i, …)
  • Vytváření objektů a manipulace (new, putfield, …)
  • Management zásobníku (swap, dup2, …)
  • Přesuny v kódu (ifeq, goto, …)
  • Volání metod a návraty (invokespecial, areturn, …)

Ukázka Java kódu - Java bytecode

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

Kompilátor jazyku Java by mohl výše uvedený kód přeložit do bytecode následovně:

  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; //Pole java/lang/System.out:Ljava/io/PrintStream;
  34:  iload_1
  35:  invokevirtual   #85; //Metoda java/io/PrintStream.println:(I)V
  38:  iinc    1, 1
  41:  goto    2
  44:  return

Příklady