Kod bajtowy (ang. bytecode) – nazwa reprezentacji kodu używanej przez maszyny wirtualne oraz przez pewne kompilatory. Kod składa się z ciągu instrukcji (których kody operacji posiadają zwykle długość jednego bajta, stąd nazwa), które nie odpowiadają bezpośrednio instrukcjom procesora oraz potrafią 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 stale są maszynami rejestrowymi, przeważajaca ilość (choć nie wszystkie) maszyn wirtualnych to maszyny stosowe.
Języki oraz środowiska wykorzystujące kod pośredni
Do najbardziej znanych języków programowania wykorzystujących kod pośredni zaliczyć można:
oraz urządzenia z system Android, które wykorzystują maszynę wirtualną Dalvik
Przykład
Perl
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]
Java
Przykład kodu w Javie, źródło:
outer:
for (int oraz = 2; oraz < 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