Programování

Tři typy přenositelnosti Java

Java vyvolala v programátorské komunitě spoustu vzrušení, protože to slibuje přenosný aplikace a applety. Java ve skutečnosti poskytuje tři odlišné typy přenositelnosti: přenositelnost zdrojového kódu, přenositelnost architektury CPU a přenositelnost OS / GUI. Skutečnost, že existují tři odlišné typy přenositelnosti, je zásadní, protože pouze jeden z těchto typů představuje pro Microsoft hrozbu. Dá se očekávat, že Microsoft tento jeden typ přenositelnosti podkope, zatímco obejme ostatní dva - a přitom tvrdí, že podporuje Javu. Pochopení tří typů přenositelnosti a způsobu jejich spolupráce je zásadní pro pochopení ohrožení společnosti Microsoft a možných reakcí společnosti Microsoft.

Než se však pustíme do podrobností o každém z těchto tří typů přenositelnosti, projdeme si několik základních pojmů.

Definování některých pojmů

V tomto článku jsou použity následující výrazy:

Endianismus
Endianismus označuje pořadí ukládání bajtů ve vícebajtovém množství v daném CPU. Například nepodepsaný krátký 256 (desítkově) vyžaduje dva bajty úložiště: 0x01 a 0x00. Tyto dva bajty lze uložit v libovolném pořadí: 0x01, 0x00 nebo 0x00, 0x01. Endianismus určuje pořadí, ve kterém jsou dva bajty uloženy. Z praktických důvodů je endianismus obvykle důležitý pouze tehdy, když CPU různých endianismů musí sdílet data.
Jáva
Java je zabaleno několik různých technologií - programovací jazyk Java, virtuální stroj Java (JVM) a knihovny tříd spojené s tímto jazykem. Tento článek pojednává o všech těchto aspektech.
Virtuální stroj Java (JVM)

JVM je imaginární CPU, pro který většina překladačů Java vydává kód. Podpora tohoto imaginárního CPU je to, co umožňuje běh programů Java bez nutnosti opětovné kompilace na různých CPU. Nic v programovacím jazyce Java nevyžaduje, aby byl zdrojový kód Java kompilován do kódu pro JVM místo do kódu nativního objektu.

Asymetrix a Microsoft ve skutečnosti ohlásili kompilátory Java, které vydávají nativní aplikace Microsoft Windows. (Další informace najdete v části Zdroje tohoto článku.)

J-kód
J-kód je výstup vydávaný většinou kompilátorů Java do souborů třídy. J-kód lze považovat za objektový kód pro virtuální stroj Java.
Přenosnost
Přenositelnost označuje schopnost spouštět program na různých počítačích. Spuštění daného programu na různých počítačích může vyžadovat různé množství práce (například žádná práce, překompilování nebo malé změny ve zdrojovém kódu). Když lidé označují aplikace a applety Java jako přenosné, obvykle to znamená, že aplikace a applety běží na různých typech strojů bez jakýchkoli změn (například rekompilace nebo vylepšení zdrojového kódu).

Nyní, když jsme se zabývali některými základními pojmy, vysvětlíme každý ze tří typů přenositelnosti Java.

Java jako jazyk: přenositelnost zdrojového kódu

Jako programovací jazyk poskytuje Java nejjednodušší a nejznámější formu přenositelnosti - přenositelnost zdrojového kódu. Daný program Java by měl produkují identické výsledky bez ohledu na základní procesor, operační systém nebo kompilátor Java. Tato myšlenka není nová; jazyky jako C a C ++ poskytovaly příležitost pro tuto úroveň přenositelnosti po mnoho let. C a C ++ však také poskytují četné příležitosti k vytvoření nepřenosného kódu. Pokud programy napsané v C a C ++ nejsou od začátku navrženy tak, aby byly přenosné, je schopnost přecházet na různé stroje více teoretická než praktická. C a C ++ nechávají nedefinované podrobnosti, jako je velikost a endianismus atomových datových typů, chování matematiky s plovoucí desetinnou čárkou, hodnota neinicializovaných proměnných a chování při přístupu k uvolněné paměti.

Stručně řečeno, ačkoli syntaxe C a C ++ je dobře definovaná, sémantika tomu tak není. Tato sémantická volnost umožňuje kompilaci jednoho bloku zdrojového kódu C nebo C ++ do programů, které poskytují různé výsledky při spuštění na různých CPU, operačních systémech, kompilátorech a dokonce i na jedné kombinaci kompilátoru / CPU / OS, v závislosti na různých nastaveních kompilátoru. (Viz postranní panel Syntaxe versus sémantika pro diskusi o rozdílech mezi sémantikou a syntaxí.)

Java je jiná. Java poskytuje mnohem přísnější sémantiku a ponechává méně na implementátorovi. Na rozdíl od C a C ++ má Java definované atomové typy a endianismus, stejně jako definované chování s plovoucí desetinnou čárkou.

Kromě toho Java definuje více chování než C a C ++. V Javě se paměť neuvolní, dokud k ní již nelze získat přístup, a jazyk nemá žádné neinicializované proměnné. Všechny tyto funkce pomáhají zmenšit rozdíly v chování programu Java z platformy na platformu a implementace na implementaci. I bez JVM lze očekávat, že programy napsané v jazyce Java budou (po překompilaci) portovat na různé CPU a operační systémy mnohem lépe než ekvivalentní programy C nebo C ++.

Bohužel funkce, díky nimž je Java tak přenosná, mají nevýhodu. Java předpokládá 32bitový stroj s 8bitovými bajty a matematikou s plovoucí desetinnou čárkou IEEE754. Stroje, které tomuto modelu nesedí, včetně 8bitových mikrokontrolérů a superpočítačů Cray, nemohou efektivně spouštět Javu. Z tohoto důvodu bychom měli očekávat, že C a C ++ budou použity na více platformách než jazyk Java. Měli bychom také očekávat, že programy Java budou portovat snadněji než C nebo C ++ mezi platformami, které obě podporují.

Java jako virtuální stroj: přenositelnost CPU

Většina překladačů vytváří objektový kód, který běží na jedné rodině CPU (například rodina Intel x86). Dokonce i překladače, které produkují objektový kód pro několik různých rodin CPU (například x86, MIPS a SPARC), produkují objektový kód pouze pro jeden typ CPU najednou; pokud potřebujete objektový kód pro tři různé rodiny CPU, musíte svůj zdrojový kód kompilovat třikrát.

Aktuální překladače Java se liší. Místo vytváření výstupu pro každou jinou rodinu CPU, na které má program Java běžet, produkují aktuální kompilátoři Java objektový kód (nazývaný J-kód) pro CPU, který ještě neexistuje.

(Slunce oznámila CPU, která bude provádět J-kód přímo, ale naznačuje, že první vzorky Java čipů se objeví až ve druhé polovině tohoto roku; plná výroba těchto čipů začne příští rok. Základní technologie Sun Microelectronics picoJavaI bude jádrem vlastní řady procesorů Sun MicroJava, která bude zaměřena na síťové počítače. Držitelé licence, jako jsou LG Semicon, Toshiba Corp. a Rockwell Collins Inc., také plánují výrobu čipů Java založených na jádru picoJavaI.)

Pro každý skutečný procesor, na kterém mají být spuštěny programy Java, interpret Java nebo virtuální stroj „provádí“ kód J. Tento neexistující CPU umožňuje spuštění stejného objektového kódu na libovolném CPU, pro který existuje interpret jazyka Java.

Produkce výstupu pro imaginární CPU není u Java nová: kompilátoři Pascal UCSD (University of California v San Diegu) před lety vytvořili P-kód; Limbo, nový programovací jazyk vyvíjený ve společnosti Lucent Technologies, produkuje objektový kód pro imaginární CPU; a Perl vytvoří zprostředkující reprezentaci programu a provede tuto zprostředkovanou reprezentaci namísto vytvoření nativního spustitelného kódu. Internetově důvtipný JVM se odlišuje od těchto dalších implementací virtuálních CPU záměrným navržením tak, aby umožňovalo generování prokazatelně bezpečného kódu bez virů. Před internetem nebylo potřeba, aby virtuální stroje dokázaly, že programy jsou bezpečné a neobsahují viry. Tato bezpečnostní funkce v kombinaci s mnohem lepším pochopením toho, jak rychle spouštět programy pro imaginární CPU, vedla k rychlému a širokému přijetí JVM. Dnes má většina hlavních operačních systémů, včetně OS / 2, MacOS, Windows 95 / NT a Novell Netware, zabudovanou podporu pro programy v J-kódu nebo se od nich očekává.

JVM, který je v podstatě imaginárním CPU, je nezávislý na jazyce zdrojového kódu. Jazyk Java může vytvářet J-kód. Ale stejně tak může Ada95. Ve skutečnosti byli tlumočníci hostovaní v J-kódu napsáni pro několik jazyků, včetně BASIC, Forth, Lisp a Scheme, a je téměř jisté, že implementace jiných jazyků budou v budoucnu J-kód vydávat. Jakmile je zdrojový kód převeden na J-kód, překladač jazyka Java nedokáže zjistit, jaký programovací jazyk vytvořil J-kód, který provádí. Výsledek: přenositelnost mezi různými CPU.

Výhodou kompilace programů (v jakémkoli jazyce) do J-kódu je, že stejný kód běží na různých rodinách CPU. Nevýhodou je, že J-kód nefunguje tak rychle jako nativní kód. U většiny aplikací to nebude vadit, ale u nejvyšších špičkových programů - těch, které potřebují každé poslední procento CPU - nebudou náklady na výkon J-kódu přijatelné.

Java jako virtuální OS a GUI: přenositelnost OS

Většina programů Microsoft Windows napsaných v C nebo C ++ se nepřenáší snadno do prostředí Macintosh nebo Unix, ani po překompilaci. I když programátoři věnují zvláštní pozornost řešení sémantických slabin v C nebo C ++, je port obtížný. K tomuto problému dochází, i když port k operačnímu systému mimo Windows probíhá beze změny CPU. Proč potíže?

Po odstranění sémantických problémů v C a C ++ a problémů s portováním CPU musí programátoři stále čelit odlišnému operačnímu systému a různým voláním rozhraní GUI API.

Programy Windows volají do operačního systému velmi odlišně než programy Macintosh a Unix. Tato volání jsou zásadní pro psaní netriviálních programů, takže dokud nebude tento problém s přenositelností vyřešen, portování zůstane obtížné.

Java tento problém řeší poskytnutím sady knihovních funkcí (obsažených v knihovnách dodávaných Javou, jako je awt, util, a jazyk), které mluví s imaginárním OS a imaginárním GUI. Stejně jako JVM představuje virtuální CPU, knihovny Java představují virtuální OS / GUI. Každá implementace Java poskytuje knihovny implementující toto virtuální OS / GUI. Programy Java, které používají tyto knihovny k poměrně snadnému poskytování potřebných portů funkcí OS a GUI.

Používání knihovny přenositelnosti místo nativních volání OS / GUI není nový nápad. Tuto schopnost pro C a C ++ poskytují produkty, jako je Visix Software Galaxy a Protools Software Zinc. Dalším přístupem, který Java nedodržuje, je vybrat jeden OS / GUI jako hlavní a poskytnout obálkové knihovny podporující tento hlavní OS / GUI na všech počítačích, na které chcete portovat. Problém přístupu hlavního operačního systému OS / GUI spočívá v tom, že přenesené aplikace na ostatních počítačích často vypadají jako mimozemšťané. Uživatelé počítačů Macintosh si například stěžovali na nejnovější verzi aplikace Microsoft Word pro Macintosh, protože vypadala a chovala se jako program Windows, nikoli jako program Macintosh. Bohužel přístup, který Java zvolila, má také problémy.

Java poskytla ve svých knihovnách OS / GUI funkcionalitu nejmenšího společného jmenovatele. Byly vynechány funkce dostupné pouze v jednom OS / GUI, například dialogová okna s kartami. Výhodou tohoto přístupu je, že mapování běžných funkcí na nativní OS / GUI je poměrně snadné a s opatrností může poskytovat aplikace, které ve většině OS / GUI fungují podle očekávání. Nevýhodou je, že aplikacím v nativním režimu budou k dispozici funkce, které budou pro aplikace Java nedostupné. Někdy to vývojáři budou moci vyřešit rozšířením AWT; jindy ne. V případech, kdy je požadovaná funkčnost nedosažitelná pomocí zástupných řešení, se vývojáři s největší pravděpodobností rozhodnou psát nepřenosný kód.

Koho zajímá přenositelnost?

O přenositelnost se starají tři hlavní volební obvody: vývojáři, koncoví uživatelé a oddělení MIS.

Vývojáři: Příležitosti a hrozby se rýsují

Vývojáři mají velký zájem na vytváření přenosného softwaru. Na druhé straně jim přenosný software umožňuje podporovat více platforem, což vede k větší základně potenciálních zákazníků. Stejná přenositelnost, která vývojářům umožňuje cílit na nové trhy, však také umožňuje cílit na jejich trh konkurenty.

Stručně řečeno, přenositelnost Java tlačí trh aplikačního softwaru od segregovaných trhů založených na různých OS a GUI a směrem k jednomu velkému trhu. Například na současném trhu se softwarem je síla, s níž je třeba počítat na trzích aplikačního softwaru pro Windows a Macintosh, ale na trzích OS / 2 a Unix nemá téměř žádnou přítomnost. Toto rozdělení umožňuje společnostem na trzích OS / 2 a Unix ignorovat Microsoft jako konkurenta. Java těmto společnostem usnadňuje konkurenci na trhu Windows, ale také umožňuje Microsoftu snadnější vstup na trhy OS / 2 a Unix.

Uživatelé: Nepřímí příjemci přenositelnosti

Uživatelé se nestarají o přenositelnost. Pokud přenositelnost usnadňuje a zpříjemňuje jejich životy, pak jsou všichni za to; pokud ne, nejsou. Přenositelnost má pro uživatele určité pozitivní účinky, ale jsou poněkud nepřímé. Pozitivní účinky:

$config[zx-auto] not found$config[zx-overlay] not found