Kod bajtowy


Kod bajtowy w encyklopedii

Z Wikipedii, wolnej encyklopedii Przejdź do nawigacji Przejdź do wyszukiwania

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.

Spis treści

Języki i środowiska wykorzystujące kod pośredni | 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 wykorzystują maszynę wirtualną Dalvik

Przykład | edytuj kod

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

Perl | edytuj kod

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

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 
Na podstawie artykułu: "Kod bajtowy" pochodzącego z Wikipedii
OryginałEdytujHistoria i autorzy