Reklama
Dzisiaj jest 9 stycznia 2025 r.
Chcę dodać własny artykuł
Reklama
Reklama
Reklama

Kod bajtowy

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.

Reklama

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

Do najbardziej znanych języków programowania wykorzystujących kod pośredni zaliczyć można:
* Java (Kod bajtowy Javy),
* Perl (Kod bajtowy Perla),
* Python,
* C#,
* OBA w środowisku .NET
oraz urządzenia z systemem Android, które wykorzystywały do wersji 4.4 KitKat maszynę wirtualną Dalvik

Przykład

Python


>>> 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

Reklama

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 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
Kategoria:Wirtualizacja
Kategoria:Asembler

Reklama
Reklama