Portál AbcLinuxu, 23. dubna 2024 19:35

Otevřená Java 1: Přehled, je androidí Dalvik Java?

30. 11. 2010 | Michal Vyskočil
Články - Otevřená Java 1: Přehled, je androidí Dalvik Java?  

Ačkoli je Java jedním z nejpoužívanějších jazyků, (nejen) pro psaní otevřeného software, vlastní otevřené implementace hrály vždy druhé až třetí housle. Následující článek vás zavede do světa otevřených implementací platformy Java, ukážeme si, z jakých částí se skládá a jak s tím souvisí Android Dalvik.

Obsah

Co je to vlastně Java

link

Na úplném začátku je nezbytné si vyjasnit jednu otázku. Co je to vlastně Java? Pojem je to trochu nejednoznačný, jelikož se v dávných dobách, snad v záchvatu čirého nadšení nad šikovnou ochrannou známkou v laboratořích společnosti Sun rozhodli pojmenovat Java úplně vše. Zpátky k původní otázce – co je to vlastně Java? Pokud hovoříme (nejen) o otevřených implementacích, je potřeba specifikovat, o které části vůbec hovoříme. Takže, co všechno je vlastně Java?

Terminologická poznámka

link

Přestože současným vlastníkem společnosti Sun Microsystems je společnost Oracle, podstatná část historie se odehrávala pod taktovkou Sunu, tudíž se budu odkazovat k názvu Sun tam, kde to z hlediska historie má smysl. Navíc, ačkoli si je autor vědom rozdílu mezi svobodným (free) a otevřeným (open source) software, v textu se budu odkazovat pouze na pojem otevřený software.

Takže, co je ta Java vlastně zač.

Programovací jazyk Java

link

Jedná se o staticky typovaný, objektově orientovaný jazyk definovaný Java Language Specification. Ta říká, jak má vypadat příkaz if, jaký význam mají složené, špičaté závorky, středníky a podobně.

Java .class soubor

link

Binární soubor obsahující posloupnosti instrukcí pro virtuální stroj, který je vykonává. Programy v jazyce Java jsou nejčastěji překládány (ale ne nezbytně) právě do tohoto mezikódu. Mezikód je orientován na zásobníkový stroj, tudíž instrukce předpokládají operandy na zásobníku.

Standardní knihovna tříd Java

link

Standardní knihovna definuje základní sadu tříd použitelných v daném programovacím jazyce. Obsahuje třídy pro práci se vstupem a výstupem, řetězci, vlákny, síťováním, grafikou, matematikou a podobně.

Virtuální stroj Java

link

Neboli Java Virtual Machine – JVM – je program vykonávající instrukce nahrávané z Java .class souboru. Ono vykonávání může být od prosté interpretace instrukcí po používání sofistikovaných technik překladu za běhu – Just In Time (JIT). Další významnou úlohou stroje je automatická správa paměti – garbage collecting. A v neposlední řadě pomáhá zakrývat rozdíly mezi platformami. Právě JVM je integrální součástí celého prostředí.

Běhové prostředí

link

Java Runtime Environment – JRE – je tvořeno virtuálním strojem, standardní knihovnou a pár podpůrnými nástroji (keytool) potřebnými pro běh programů v Java.

Vývojové prostředí

link

Java Development Kit – JDK je JRE a další nástroje nezbytné pro překlad kódu, jako překladač javac, nástroj pro tvorbu dokumentace javadoc, nástroj pro práci s Java archívy jar, ladící nástroje, podporu pro JNI a další.

Ostatní

link

Věci jako Java webstart, Java applety, doplňkové knihovny a podobně.

Platforma Java

link

Platforma Java je kombinace běhového či vývojového prostředí spolu se standardní knihovnou. Platforem existuje několik – od "klasické" Java Standard Edition, přes Java EE, což je v podstatě SE verze s obohacenou standardní knihovnou, po Java ME pro mobilní telefony, která používá jiný virtuální stroj, tak i dosti odlišnou standardní knihovnu.

Obchodní značka

link

Poslední právní součást je neméně důležitá – Java je registrovaná známka společnosti Oracle, tudíž ne každý software "náhodou" vypadající jako Java se tak může skutečně nazývat. Společnost Oracle umožňuje používání tohoto názvu pouze v případě, že alternativní implementace projde testy kompatibility.

Právě toto rozdělení (s výjimkou posledního bodu) usnadňuje vývoj opensource implementace – potřebujeme pouštět Java programy na speciální platformě? Napíšeme pouze virtuální stroj. Není nutné psát překladač, nebo podporu pro applety. Většina open source implementací je ve skutečnosti složena z nezávislých částí, protože proč vytvářet standardní knihovnu, když existuje použitelná otevřená verze?

Vztah "Javy" a otevřeného software

link

Zvláštností světa kolem Javy je jeho nejednoznačný postoj k otevřenému kódu. Na jednu stranu existuje ohromné množství otevřeného kódu napsaného v tomto jazyce a vývojáři jsou zvyklí open source kód tvořit i používat. Na straně druhé z hlediska vlastního JDK/JRE existoval a existuje jednoznačný postoj používat výhradně "originál od Sunu", jakožto funkční a referenční implementaci.

Tento stav kritizoval Richard Stallman ve svém článku Java Trap. Cílem FSF (a podle něj i otevřeného software) je vytváření svobodné a otevřené platformy. Tudíž mít otevřený software, závisející na nesvobodném překladači/prostředí, je v rozporu s touto filozofií. Mimochodem stejnou filozofii zastává i většina linuxových distributorů, tudíž neexistence funkčního otevřeného Java prostředí velice ztěžovalo distribuci Java programů.

Proč vůbec vytvářet open source implementace

link

Proč vlastně vytvářet open source implementaci, když ta oficiální je zcela zdarma a funguje? Těch důvodů může být více

GNU Java Compiler

link

GNU Compiler Colection zahrnuje i podporu pro jazyk Java. Tato implementace se liší od ostatních, protože umožňuje překlad Java kódu jak do bytekódu, tak i do nativního kódu. Sada zahrnuje mimo jiné parser z ecj (Eclipse Java compiler), vlastní překladač gcj, interpret gij, a také běhové prostředí pro nativní programy a knihovny libgcj.so. GCJ se obvykle doplňuje o externí nástroje fastjar a gjdoc tak, aby vytvořilo kompletní JDK.

Běhová knihovna tohoto projektu se nazývá GNU Classpath – je to implementace Java SE 1.4.2 a 5.0 pod licencí GNU GPLv2 s takzvanou Classpath výjimkou. Ta umožňuje překlad a běh neGPL Java kódu nad GNU Classpath. Tato výjimka je nezbytná, protože každá třída v jazyce Java je odvozena od java.lang.Object, čímž by se každý kód přeložený pod touto knihovnou musel považovat za dílo odvozené od GNU GPL.

CNI (Compiled Native Interface)

link

Pohled projektu GCJ na jazyk Java je odlišný – jeho autoři jej berou jako každý jiný jazyk přeložitelný do binárního kódu. Doslova jako podmnožinu C++. Rozhraní CNI potom zachovává binární kompatibilitu kódu napsaného v jazyce Java, který je po překladu kompatibilní s kódem v C++. Dále definuje typy pro zachování kompatibility, jako třeba jint v C++ == Integer v Javě.

Apache Harmony

link

Ambiciózní projekt Harmony pod křídly Apache Software Foundation, jednoho z největších producentů open source Java software vůbec. Jedním z cílů projektu bylo spojit existující implementace do jedné, nicméně z důvodu licenční nekompatibility mezi GNU GPLv2 a Apache licencí nebylo možné využít největší část existujícího kódu, knihovnu GNU Classpath. Projekt od počátku počítal s masivní podporou od společností jako IBM, Intel, nebo Google, které se do projektu skutečně zapojily.

CACAO

link

Virtuální stroj napsaný na Vídeňské univerzitě. První verze byla vydána už v roce 1997 a v té době již zvládal kompilaci do nativního kódu. Pro zajímavost, JVM od jisté společnosti Sun Microsystems zvládalo podobné techniky až od roku 1999 díky HotSpot. Později byl uvolněn pod GNU GPL a používá se ve spojitosti s GNU Classpath.

Kaffe

link

Virtuální stroj poprvé vydaný v roce 1996 byl od počátku open source. Ačkoli je pomalejší než jeho konkurence, jeho výhodou je menší velikost a snadná portabilita, díky které se využívá především v embedded světě. Rovněž používá GNU Classpath.

SableVM

link

Další z free software implementací. Ačkoli co do JIT schopností zaostává za konkurenty, jako jedna z mála alternativních implementací zvládá JVMDI (Java Virtual Machine Debugging Interface) a JDWP (Java Debug Wire Protocol).

Android (Dalvik)

link

Dalvik je virtuální stroj pro programy napsané v jazyce Java pro platformu Google Android. Velice často je kladena na roveň platformě Java a právní část otázky je předmětem aktuálně probíhajícího soudního sporu. Čistě technicky se má situace takto. Celá platforma se sestává z těchto částí:

Formát dex a celý stroj Dalvik jsou navíc registrově orientované, na rozdíl od zásobníkového Java. Android je trošku jako chytrá horákyně, nicméně "Java" to není. Jako nejlepší popis je možné uvést: platforma inspirovaná (sice možná o trochu více než třeba .NET) Javou. Není možné vzít libovolný Java program a spustit jej na platformě Android, a to jak z důvodu nekompatibility na úrovni bytekódu, tak i na úrovni standardní knihovny.

IKVM.NET

link

Na rozdíl od výše uvedené Android platformy je IKVM.NET skutečně Javou. Jedinou odlišností je, že celý framework je napsán v .NET a navíc obsahuje nástroje pro překlad Java kódu i do Common Intermediate Language, který pak může být přeložen do standardní .dll knihovny této platformy.

Závěrem

link

Nahlédli jsme do světa otevřených implementací platformy Java – opravdu jen nahlédli, těch implementací existuje mnohem více. Ukázali jsme si, že neexistuje pouze klasická JIT cesta (gcj) nebo že alternativní implementace mohou obsahovat zajímavé vlastnosti. V následujícím díle se zaměříme na projekty OpenJDK, Icedtea, jejich vztah k Oracle Java SE a navíc poodhalíme zákoutí Java Wars.

Odkazy a zdroje

Java Language Specification
Class file format
Java platform Standard Edition
Java platform Enterprise Edition
Java platform Micro Edition
RMS: Java Trap
GNU Compiler for Java
GNU Classpath
GNU Classpath license
About CNI
Apache Harmony
CACAO
Kaffe
SableVM
Dalvik
Android
IKVM.NET

Další články z této rubriky

Týden na ITBiz: Fotonické čipy ze stolní tiskárny
Týden na ScienceMag.cz: Model Lambda CDM celkem sedí, ale kosmologická konstanta se může měnit
Týden na ITBiz: Vysokoteplotní supravodivá dioda
Týden na ScienceMag.cz: V kvantovém materiálu objevili částici podobnou gravitonu
Týden na ITBiz: Efektivní podnikání se bez edge computingu neobejde

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.