Hlavní navigace

Používáme Javu na Linuxu, kompilujeme

binary runner

V dnešním dílu našeho volného seriálu o Javě na Linuxu se podíváme na dva nástroje pro kompilaci Javy. V jednom případě půjde o kompilátor Javy do bytecodu a v druhém o kompilaci do nativního kódu.

Jikes

Pokud jste pracovali s překladačem javac ze Sun JDK, pravděpodobně jste byli dříve či později rozladěni jeho rychlostí. Důvodem je, že sám překladač je napsaný v Javě, což sice eliminuje potřebu jeho portace, ale překladu to na rychlosti nepřidá – natažení JVM, natažení a instanciace tříd,interpretace, to vše něco stojí.

Náplastí na tyto bolístky je populární kompilátor Javy Jikes. Oblíbenost tohoto kompilátoru má dva důvody – rychlost a striktní dodržování standardů. Vysoká rychlost je výsledkem implementace kompilátoru v C++, vestavěné analýzy závislostí a inkrementální kompilace.

Vzhledem k tomu, že je Jikes šířen pod IBM Public License, můžete se s ním setkat i ve volně šiřitelných verzích distribucí. Pokud si chcete práci s Jikesem usnadnit a nastavili jste si proměnné prostředí podle předchozího dílu seriálu, můžete si přidáním aliasu do .bash_profile, případně /etc/profile, ušetřit práci při psaní příkazů a umožnit hladší spolupráci Jikesu s JDK: alias jikes="jikes -bootclasspath $BOOTSTRAP_CLASSPATH -extdirs $EXTENSION_CLASSPATH".

Jikes je i zajímavý pro pokročilejší Java programátory, zabývající se psaním Java Server Pages (JSP) pod Servlet/JSP containerem Tomcat z projektu Jakarta. Jikes totiž může být s výhodou použit jeho součástí, JSP kompilátorem Jasper. Stačí jen změnit nastavení proměnné _RUNJAVA v souboru setclasspath.sh obdobně jako v předchozím případě na: _RUNJAVA=jikes -bootclasspath $BOOTSTRAP_CLASSPATH -extdirs $EXTENSION_CLASSPATH. Pokud jste instalovali Tomcat z RPM balíku, najdete ho v adresáři /var/tomcat4/bin.

GCJ

Projekt GCJ vznikl jako součást projektu GNU GCC a je tedy součástí každé novější distribuce. Nabízí atraktivní možnost kompilace Javy do nativního kódu hostitelské platformy. Atraktivita tohoto přístupu spočívá v rychlejším spouštění aplikací z důvodu absence potřeby zavádět do paměti JVM, svou roli hraje i značný nárůst výkonu aplikace získaný odbouráním režie JVM a další optimalizací na úrovni assembleru. Poměrně uspokojivá je i stále se rozrůstající řada portů, v současnosti zahrnující IA-32, IA-64, Sparc Solaris, Tru64 Unix, Alpha a PowerPC Linux.

GCJ pro svou práci využívá dvě sdílené knihovny, libgcj a libgcjgc. Knihovna libgcjgc obsahuje garbage collector, tj. automatické uvolňování objektů, na které se už nikdo neodkazuje. V distribuce Mandrake je knihovna libgcjgc obsažena v balíku libgcj2.96, balík libgcj3.0-devel obsahuje pouze symbolický odkaz na ni.

O něco zajímavější je knihovna libgcj obsahující nativní implementace základních aplikačních rozhraní Javy. Její vývoj postupuje rychle, a tak se snad v dohledné době dočkáme možnosti spolehlivě kompilovat Javové programy do nativního kódu. Experimentováním s verzí z GCC 3.0.4 lze snadno narazit na to, že GCJ nezná definici třídy, případně se přeložený program chová trochu jinak než původní. Nová verze z GCC 3.1 přináší podporu Unicode 3.0, některá nová zlepšení výkonosti, pokroky v portaci na další platformy (např. Windows) a lepší interakci s C/C++. Výrazným pokrokem jsou i nově zahrnutá podpora API Remote Method Invocation (RMI), java.lang.ref.*, javax.naming, javax.transaction, org.w3c.dom a org.xml.sax. Změn je samozřejmě víc, zájemce o podrobnější informace odkazuji na oficiální seznam změn v GCC 3.1. Licence libgcj je GPL s výjimkou, že připojení (linking) libgcj nevyžaduje, aby výsledný program byl také pod GPL.

Kompilovat můžete buď zdojový kód v Javě (.java), nebo bytecode (.class). Ke kompilaci ze zdrojového kódu přitom nepotřebujete JDK ani při ní nevzniká bytecode a v obou případech příkaz pro kompilaci vypadá podobně: gcj --main=<main_class> -o <output_file> <source_files>, kde za --main je název třídy obsahující metodu main a <source_files> seznam souborů obsahujících zdrojový kód v Javě nebo přeložené (do bytecodu) třídy. Vlastní překlad pak probíhá ve třech krocích:

  1. převod zdrojového kódu nebo bytecodu do assembleru
  2. kompilace assembleru
  3. slinkování s libgcj

Samotné GCJ může být doprovázeno sadou několika utilit zvanou GCJ Tools. Běžně použitelná je zřejmě pouze utilita jv-scan, která umí vypsat všechny třídy v daném zdrojovém souboru a může posloužit i k vyhledání třídy obsahující metodu main. Dále zde najdete interpret bytecodu gij, gcjh generátor C++ hlaviček pro .class soubory a program jcf-dump vypisující z nich užitečné informace.

příště: ant

Našli jste v článku chybu?