Bytový kód Java

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 23. června 2021; kontroly vyžadují 2 úpravy .

Java bytecode  je sada instrukcí prováděných Java Virtual Machine . Každý operační kód bajtového kódu  je jeden bajt; není použito všech 256 možných hodnot operačních kódů, 51 z nich je rezervováno pro budoucí použití.

Pro programování v Javě nebo jiných jazycích kompatibilních s JVM není znalost funkcí bajtkódu nutná, nicméně „pochopení bajtkódu a pochopení mechanismů pro jeho generování kompilátorem Java pomáhá programátorovi v Javě stejným způsobem, jako znalost sestavení jazyk pomáhá programátorovi psát v C nebo C++ » [1] [2] .

Návod

Kód CA 16 je vyhrazen pro použití debuggerem a jazyk jej nepoužívá, stejně jako kódy FE 16 a FF 16 , které jsou vyhrazeny pro použití virtuálním strojem a ladicími programy. Kódy v rozsahu CB 16 -FD 16 se v aktuální verzi JVM nepoužívají a jsou vyhrazeny pro budoucí doplnění.

Pokyny lze rozdělit do několika skupin:

Existuje také několik pokynů, které provádějí specifické úkoly, jako je vyvolání výjimek, synchronizace a tak dále.

Mnoho instrukcí má předpony nebo přípony, které odpovídají jejich operandům:

předpona nebo přípona typ operandu
I celé číslo
L dlouho
S krátký
B byte
C charakter
F plovák
D dvojnásobek
A odkaz

Například operace IADD  je sčítání dvou celých čísel, zatímco FADD  je sčítání čísel s plovoucí desetinnou čárkou.

Příklad

Kód v jazyce Java :

vnější : for ( int i = 2 ; i < 1000 ; i ++ ) { for ( int j = 2 ; j < i ; j ++ ) { if ( i % j == 0 ) pokračovat vnější ; } Systém . ven . println ( i ); }

kompilátor může přeložit do následujícího bajtkódu:

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 iload : 3 i2 : 2 17 25: iinc 2 , 1 28: goto 11 31: getstatic #84 ; //Pole java/lang/System.out:Ljava/io/PrintStream; 34: iload_1 35: invokevirtual #85 ; //Metoda java/io/PrintStream.println:(I)V 38: iinc 1 , 1 41: goto 2 44: return

Generace

Ve většině případů je bajtový kód Java generován pro spuštění na virtuálním stroji Java ze zdrojového kódu Java . Jediným nativním kompilátorem, který převádí kód Java na bajtový kód Java, je Javac , který byl vytvořen společností Sun Microsystems . Ale protože jsou k dispozici všechny specifikace bajtového kódu Java, existují kompilátory třetích stran, které generují tento bajtový kód. Příklady takových kompilátorů:

  • Jikes  - kompiluje Java kód do Java bytecode (vyvinutý společností IBM , napsaný v C++ ),
  • Espresso - kompiluje Java kód do Java bytecode (pro verzi Java 1.0),
  • GCJ (GNU Compiler for Java) - kompiluje kód Java do bajtového kódu Java, je také schopen kompilace do nativního strojového kódu , je součástí GNU Compiler Collection .

Pro některé projekty existují kompilátory, které umožňují generovat bytecode pro JVM ze zdrojového kódu v jiném programovacím jazyce, mezi takové projekty patří:

Většina existujících instrukcí JVM je staticky typována : podpisy metod na jejich místech volání jsou kontrolovány v době kompilace, ale neexistuje žádný mechanismus, který by tuto kontrolu přenesl do běhového prostředí [3] . Pro JVM však byla implementována řada dynamicky typovaných jazyků .

Poznámky

  1. Peter Haggar, Pochopení bytecode z vás udělá lepšího programátora Archivováno 8. prosince 2008 na Wayback Machine // IBM DeveloperWorks, 1. července 2001
  2. A Formal Introduction to the Compilation of Java, Stephan Diehl, "Software - Practice and Experience", sv. 28(3), strany 297-327, březen 1998 . Získáno 25. dubna 2013. Archivováno z originálu 25. května 2013.
  3. Nutter, Charles InvokeDynamic: Opravdu užitečné? (3. ledna 2007). Datum přístupu: 25. ledna 2008. Archivováno z originálu 30. dubna 2013.

Viz také

  • Java bytecode

Odkazy