Kod bajtowy – Wikipedia, wolna encyklopedia

Kod bajtowy (ang. bytecode) – nazwa reprezentacji kodu używanej przez maszyny wirtualne oraz przez niektóre kompilatory. Kod składa się z ciągu instrukcji (których kody operacji mają zwykle długość jednego bajta, stąd nazwa), które nie odpowiadają bezpośrednio instrukcjom procesora i mogą zawierać instrukcje wysokiego poziomu (takie jak np. stwórz obiekt klasy X, połącz dwa łańcuchy itd.), jednak w przeciwieństwie do kodu źródłowego wymagają analizy tylko pojedynczych poszczególnych operacji.

W przeciwieństwie do maszyn fizycznych, które prawie zawsze są maszynami rejestrowymi, większość (choć nie wszystkie) maszyn wirtualnych to maszyny stosowe.

Języki i środowiska wykorzystujące kod pośredni

[edytuj | edytuj kod]

Do najbardziej znanych języków programowania wykorzystujących kod pośredni zaliczyć można:

oraz urządzenia z systemem Android, które wykorzystywały do wersji 4.4 KitKat maszynę wirtualną Dalvik

Przykład

[edytuj | edytuj kod]
>>> import dis #"dis" - Disassembler of Python byte code into mnemonics. >>> dis.dis('print("Hello, World!")')   1           0 LOAD_NAME                0 (print)               2 LOAD_CONST               0 ('Hello, World!')               4 CALL_FUNCTION            1               6 RETURN_VALUE 

Przykład kodu bajtowego Perla, źródło:

sub hello {     print "Hello, ", $_[0], "\n" } $x = "world!"; hello($x) 

generuje kod pośredniczący funkcji głównej:

OP     (0x815e2b0) enter COP    (0x8168838) nextstate SVOP   (0x81c9e20) const [5] PV (0x8165508) "world!" PADOP  (0x8168950) gvsv  GV (0x814ccd4) *x BINOP  (0x8168810) sassign COP    (0x81688b8) nextstate OP     (0x815e270) pushmark PADOP  (0x81697f8) gvsv  GV (0x814ccd4) *x PADOP  (0x8168d80) gv  GV (0x814cce0) *hello UNOP   (0x815e290) entersub [4] LISTOP (0x8150990) leave [1] 

oraz procedury hello:

COP    (0x8150958) nextstate OP     (0x81508a8) pushmark SVOP   (0x8150998) const [3] PV (0x81654f8) "Hello, " PADOP  (0x8168a00) aelemfast  GV (0x814cbc0) *_ SVOP   (0x8150900) const [4] PV (0x816551c) "\n" LISTOP (0x8168a58) print UNOP   (0x81687b0) leavesub [1] 

Przykład kodu w Javie, źródło:

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

Kompilator Javy generuje następujący kod bajtowy:

 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