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

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

Python

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

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

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

📚 Artikel Terkait di Wikipedia

GNU Compiler for Java

kompiluje zarówno pliki źródłowe Javy (rozszerzenie .java) jak i kod bajtowy (rozszerzenie .class, ang. bytecode) Javy do postaci kodu maszynowego. Mimo wszystko

Kod bajtowy Javy

przystosowane dla JVM (ang.) Bytecode Visualizer LT – edytor i debugger kodu bajtowego (plugin dla Eclipse) (ang.) Java Class Unpacker – plugin dla Total

HotSpot

: ładowarka klas (ang. class loader) interpreter kodu bajtowego (ang. bytecode interpreter) dwa kompilatory w locie, produkujące kod natywny – Client

Transpilator

napisanego w Pythonie na JavaScript, podczas gdy tradycyjny kompilator tłumaczy z języka takiego jak C na asembler lub Java na bytecode. Przetwarzanie z jednego

Kod bajtowy Perla

Parrot. Wynikiem kompilacji: print "Hello, world!\n"; jest następujący bytecode: OP enter COP nextstate OP pushmark SVOP const PV "Hello, world!\n" LISTOP

BASIC

Basic, Visual Basic .NET, sBasic (dla komunikatorów Nokia), Jabaco (Java Bytecode BASIC; Open Source), PureBasic, KBasic, DarkBasic, FreeBASIC, PowerBASIC

Interpreter (program komputerowy)

technology known as Just-In-Time (JIT) compilation, which compiles JavaScript to executable bytecode just as it is about to run."  (ang.). 3.7 Executing Commands

Dalvik (maszyna wirtualna)

zastąpiony przez ART. Java, która jest domyślnym językiem w przypadku aplikacji systemu Android, wymaga, by jej kod źródłowy (.java) został skompilowany