Programovanie

Tri typy prenositeľnosti Java

Java vyvolala v programátorskej komunite veľa vzrušenia, pretože to sľubuje prenosný aplikácie a applety. Java v skutočnosti poskytuje tri odlišné typy prenosnosti: prenosnosť zdrojového kódu, prenosnosť architektúry procesora a prenosnosť OS / GUI. Skutočnosť, že existujú tri odlišné typy prenosnosti, je kritická, pretože iba jeden z týchto typov predstavuje hrozbu pre spoločnosť Microsoft. Dá sa očakávať, že Microsoft tento jeden typ prenositeľnosti podlomí, zatiaľ čo ďalšie dva objíma - a pritom tvrdí, že podporuje Javu. Pochopenie troch typov prenosnosti a toho, ako spolupracujú, je zásadné pre pochopenie hrozby pre spoločnosť Microsoft a možných reakcií spoločnosti Microsoft.

Predtým, ako sa však pozrieme na podrobnosti o každom z týchto troch typov prenosnosti, prečítajme si niekoľko základných pojmov.

Definovanie niektorých pojmov

V tomto článku sú použité nasledujúce výrazy:

Endianizmus
Endianizmus označuje poradie ukladania bajtov vo viacbajtovom množstve v danom CPU. Napríklad nepodpísaný krátky 256 (desatinný) vyžaduje dva bajty pamäte: 0x01 a 0x00. Tieto dva bajty je možné uložiť v ľubovoľnom poradí: 0x01, 0x00 alebo 0x00, 0x01. Endianizmus určuje poradie, v ktorom sú dva bajty uložené. Z praktických dôvodov je endianizmus obvykle dôležitý iba vtedy, keď CPU iného endianizmu musia zdieľať údaje.
Java
Java je zoskupených niekoľko rôznych technológií - programovací jazyk Java, virtuálny stroj Java (JVM) a knižnice tried spojené s týmto jazykom. Tento článok pojednáva o všetkých týchto aspektoch.
Virtuálny stroj Java (JVM)

JVM je imaginárny CPU, pre ktorý väčšina kompilátorov Java vydáva kód. Podpora tohto imaginárneho procesora je to, čo umožňuje spustenie programov Java bez toho, aby boli znova kompilované na rôznych procesoroch. Nič v programovacom jazyku Java nevyžaduje, aby bol zdrojový kód Java kompilovaný do kódu pre JVM namiesto do kódu natívneho objektu.

Spoločnosti Asymetrix a Microsoft v skutočnosti ohlásili kompilátory Java, ktoré vydávajú natívne aplikácie systému Microsoft Windows. (Ďalšie informácie nájdete v časti Zdroje tohto článku.)

J-kód
J-kód je výstup emitovaný väčšinou kompilátorov Java do súborov triedy. J-kód možno považovať za objektový kód pre virtuálny stroj Java.
Prenosnosť
Prenosnosť predstavuje schopnosť spustiť program na rôznych strojoch. Spustenie daného programu na rôznych strojoch môže vyžadovať rôzne množstvo práce (napríklad žiadna práca, opätovná kompilácia alebo malé zmeny zdrojového kódu). Keď ľudia označujú aplikácie a applety Java ako prenosné, zvyčajne to znamená, že aplikácie a applety bežia na rôznych typoch strojov bez akýchkoľvek zmien (ako je napríklad kompilácia alebo vylepšenia zdrojového kódu).

Teraz, keď sme prebrali niektoré základné pojmy, vysvetlíme každý z troch typov prenositeľnosti Java.

Java ako jazyk: prenosnosť zdrojového kódu

Ako programovací jazyk poskytuje Java najjednoduchšiu a najznámejšiu formu prenosnosti - prenosnosť zdrojového kódu. Daný program Java by mal produkujú identické výsledky bez ohľadu na základný procesor, operačný systém alebo kompilátor Java. Táto myšlienka nie je nová; jazyky ako C a C ++ poskytovali túto úroveň prenosnosti už mnoho rokov. C a C ++ však tiež poskytujú početné príležitosti na vytvorenie neprenosného kódu. Pokiaľ nie sú programy napísané v jazykoch C a C ++ od začiatku navrhnuté tak, aby boli prenosné, je schopnosť prechádzať na rôzne stroje viac teoretická ako praktická. C a C ++ ponechávajú nedefinované podrobnosti, ako je veľkosť a endianizmus atómových dátových typov, správanie matematiky s pohyblivou rádovou čiarkou, hodnota neinicializovaných premenných a správanie pri prístupe k uvoľnenej pamäti.

Stručne povedané, hoci syntax C a C ++ je dobre definovaná, sémantika nie je. Táto sémantická voľnosť umožňuje, aby sa jeden blok zdrojového kódu C alebo C ++ kompiloval do programov, ktoré poskytujú rôzne výsledky pri spustení na rôznych procesoroch CPU, operačných systémoch, kompilátoroch a dokonca aj na jednej kombinácii kompilátora / CPU / OS, v závislosti od rôznych nastavení kompilátora. (Pozri bočný panel Syntax verzus sémantika pre diskusiu o rozdieloch medzi sémantikou a syntaxou.)

Java je iná. Java poskytuje oveľa prísnejšiu sémantiku a ponecháva menej na implementátorovi. Na rozdiel od C a C ++ má Java pre atómové typy definované veľkosti a endianizmus, ako aj definované správanie s pohyblivou rádovou čiarkou.

Okrem toho Java definuje viac správania ako C a C ++. V prostredí Java sa pamäť neuvoľní, až kým k nej nebude možné získať prístup, a jazyk nemá žiadne neinicializované premenné. Všetky tieto funkcie pomáhajú zmenšiť variácie v chovaní programu Java z platformy na platformu a implementácie do implementácie. Aj bez JVM sa dá očakávať, že programy napísané v jazyku Java sa budú (po prekompilovaní) portovať na rôzne CPU a operačné systémy oveľa lepšie ako ekvivalentné programy v C alebo C ++.

Bohužiaľ, funkcie, vďaka ktorým je Java tak prenosná, majú nevýhodu. Java predpokladá 32-bitový stroj s 8-bitovými bajtmi a matematikou IEEE754 s pohyblivou rádovou čiarkou. Stroje, ktoré sa nehodia pre tento model, vrátane 8-bitových mikrokontrolérov a superpočítačov Cray, nedokážu efektívne prevádzkovať Javu. Z tohto dôvodu by sme mali očakávať, že C a C ++ sa budú používať na viacerých platformách ako jazyk Java. Mali by sme tiež očakávať, že programy Java sa budú ľahšie prenášať ako C alebo C ++ medzi tie platformy, ktoré obe podporujú.

Java ako virtuálny stroj: prenosnosť procesora

Väčšina prekladačov produkuje objektový kód, ktorý beží na jednej rodine CPU (napríklad na rade Intel x86). Dokonca aj kompilátory, ktoré produkujú objektový kód pre niekoľko rôznych radov CPU (napríklad x86, MIPS a SPARC), produkujú objektový kód iba pre jeden typ CPU súčasne; ak potrebujete objektový kód pre tri rôzne rodiny CPU, musíte svoj zdrojový kód skompilovať trikrát.

Súčasné kompilátory Java sú odlišné. Namiesto vytvárania výstupu pre každú inú rodinu CPU, na ktorej má program Java bežať, produkujú súčasní kompilátori Java objektový kód (nazývaný J-kód) pre CPU, ktorý ešte neexistuje.

(Slnko oznámil procesor, ktorý bude vykonávať J-kód priamo, ale naznačuje, že prvé vzorky Java čipov sa objavia až v druhej polovici tohto roka; plná výroba týchto čipov sa začne budúci rok. Základná technológia picoJavaI spoločnosti Sun Microelectronics bude jadrom vlastnej rady procesorov microJava spoločnosti Sun, ktorá bude zameraná na sieťové počítače. Držitelia licencie ako LG Semicon, Toshiba Corp. a Rockwell Collins Inc. taktiež plánujú vyrábať Java čipy založené na jadre picoJavaI.)

Pre každý skutočný procesor, na ktorom majú byť spustené programy Java, interpret Java alebo virtuálny stroj „vykoná“ J-kód. Tento neexistujúci CPU umožňuje spustenie rovnakého objektového kódu na ľubovoľnom CPU, pre ktorý existuje interpret Java.

Produkcia výstupu pre imaginárny CPU nie je v prostredí Java nová: kompilátory Pascal UCSD (University of California v San Diegu) vyrobili P-kód už pred rokmi; Limbo, nový programovací jazyk vyvíjaný v Lucent Technologies, produkuje objektový kód pre imaginárny CPU; a Perl vytvorí sprostredkovanú reprezentáciu programu a namiesto vytvorenia natívneho spustiteľného kódu vykoná túto sprostredkovanú reprezentáciu. Internetovo zdatný JVM sa odlišuje od týchto ďalších implementácií virtuálnych CPU zámerným navrhnutím tak, aby umožňoval generovanie preukázateľne bezpečného kódu bez vírusov. Pred internetom nebolo potrebné, aby virtuálne stroje preukazovali bezpečnosť programov a neobsahovali vírusy. Táto bezpečnostná funkcia v kombinácii s oveľa lepším pochopením toho, ako rýchlo spustiť programy pre imaginárne CPU, viedla k rýchlemu a rozsiahlemu prijatiu JVM. V súčasnosti väčšina hlavných operačných systémov, vrátane OS / 2, MacOS, Windows 95 / NT a Novell Netware, má alebo sa od nej očakáva, že bude mať zabudovanú podporu programov J-code.

JVM, ktorý je v podstate imaginárnym CPU, je nezávislý od jazyka zdrojového kódu. Jazyk Java môže vytvárať J-kód. Ale tak môže aj Ada95. V skutočnosti boli tlmočníci hosťovaní v J-kóde napísaní pre niekoľko jazykov, vrátane BASIC, Forth, Lisp a Scheme, a je takmer isté, že implementácie iných jazykov budú v budúcnosti J-kód vydávať. Po prevedení zdrojového kódu na J-kód nemôže interpret jazyka Java zistiť, aký programovací jazyk vytvoril J-kód, ktorý vykonáva. Výsledok: prenosnosť medzi rôznymi procesormi.

Výhodou kompilácie programov (v akomkoľvek jazyku) do J-kódu je, že ten istý kód beží na rôznych rodinách CPU. Nevýhodou je, že J-kód nefunguje tak rýchlo ako natívny kód. Pre väčšinu aplikácií to nebude dôležité, ale pre najvyššie programy vyššej kategórie - tie, ktoré potrebujú každé posledné percento CPU - nebudú náklady na výkon J-kódu prijateľné.

Java ako virtuálny OS a GUI: prenosnosť OS

Väčšina programov Microsoft Windows napísaných v jazyku C alebo C ++ sa neprenáša ľahko do prostredí Macintosh alebo Unix, a to ani po opätovnej kompilácii. Aj keď programátori venujú osobitnú pozornosť zvládnutiu sémantických slabín v jazykoch C alebo C ++, je port ťažký. Tento problém nastáva, aj keď sa port pre operačný systém, ktorý nie je Windows, uskutočňuje bez zmeny procesorov. Prečo ťažkosti?

Po odstránení sémantických problémov v jazykoch C a C ++ a problémoch s prenosom CPU musia programátori stále narábať s odlišným operačným systémom a rôznymi volaniami GUI API.

Programy Windows volajú operačný systém veľmi odlišne ako programy Macintosh a Unix. Tieto hovory sú rozhodujúce pre písanie netriviálnych programov, takže kým sa tento problém s prenosnosťou nevyrieši, prenos bude stále ťažký.

Java tento problém rieši poskytnutím množiny knižničných funkcií (obsiahnutých v knižniciach dodávaných Javou, ako napr strašne, utila lang), ktoré hovoria s imaginárnym OS a imaginárnym GUI. Rovnako ako JVM predstavuje virtuálny procesor, aj knižnice Java predstavujú virtuálny OS / GUI. Každá implementácia Java poskytuje knižnice implementujúce toto virtuálne OS / GUI. Programy Java, ktoré používajú tieto knižnice na pomerne jednoduché zabezpečenie potrebných funkcií OS a GUI.

Používanie knižnice prenosnosti namiesto natívnych volaní OS / GUI nie je nový nápad. Túto schopnosť pre jazyky C a C ++ poskytujú produkty ako Visix Software's Galaxy a Protools Software Zinc. Ďalším prístupom, ktorý Java nedodržiava, je výber jediného OS / GUI ako hlavného servera a poskytnutie súhrnných knižníc podporujúcich tento hlavný OS / GUI na všetkých počítačoch, na ktoré chcete portovať. Problém prístupu master OS / GUI je v tom, že prenesené aplikácie vyzerajú na iných počítačoch často cudzo. Používatelia počítačov Macintosh sa napríklad sťažovali na najnovšiu verziu aplikácie Microsoft Word pre Macintosh, pretože vyzerala a správala sa ako program Windows, nie ako program Macintosh. Bohužiaľ prístup, ktorý si Java zvolila, má tiež problémy.

Java poskytuje vo svojich knižniciach OS / GUI funkciu najmenej spoločného menovateľa. Boli vynechané funkcie dostupné iba v jednom OS / GUI, napríklad dialógové okná so záložkami. Výhodou tohto prístupu je, že mapovanie bežných funkcií na natívne OS / GUI je pomerne jednoduché a so zvýšenou opatrnosťou môže poskytnúť aplikácie, ktoré vo väčšine OS / GUI fungujú podľa očakávaní. Nevýhodou je, že pre aplikácie v natívnom režime budú k dispozícii funkcie, ktoré budú pre aplikácie Java nedostupné. Niekedy to vývojári budú vedieť vyriešiť rozšírením AWT; inokedy nie. V prípadoch, keď je požadovaná funkčnosť nedosiahnuteľná pomocou alternatívnych riešení, sa vývojári s najväčšou pravdepodobnosťou rozhodnú napísať neprenosný kód.

Komu záleží na prenosnosti?

O prenosnosť sa starajú tri hlavné volebné obvody: vývojári, koncoví používatelia a oddelenia MIS.

Vývojári: Príležitosti a hrozby sa objavujú vo veľkom rozsahu

Vývojári majú obrovský záujem na vytváraní prenosného softvéru. Na druhej strane prenosný softvér umožňuje podporovať viac platforiem, čo vedie k väčšej základni potenciálnych zákazníkov. Rovnaká prenosnosť, ktorá umožňuje vývojárom zacieliť na nové trhy, však umožňuje aj konkurentom zamerať sa na ich trh.

Stručne povedané, prenositeľnosť Java tlačí trh aplikačného softvéru preč od segregovaných trhov založených na rôznych OS a GUI a smerom k jednému veľkému trhu. Napríklad na súčasnom trhu so softvérom je Microsoft silou, s ktorou treba rátať na trhoch aplikačných softvérov Windows a Macintosh, ale na trhoch OS / 2 a Unix nie je takmer vôbec prítomný. Toto rozdelenie umožňuje spoločnostiam na trhoch s OS / 2 a Unix ignorovať Microsoft ako konkurenta. Java týmto spoločnostiam uľahčuje konkurenciu na trhu Windows, ale umožňuje spoločnosti Microsoft aj ľahší vstup na trhy OS / 2 a Unix.

Používatelia: Nepriamy príjemcovia prenosnosti

Používatelia sa nestarajú o prenosnosť. Ak im prenosnosť uľahčuje a spríjemňuje život, potom sú tu všetci; ak nie, nie sú. Prenosnosť má pre používateľov určité pozitívne účinky, sú však trochu nepriame. Pozitívne účinky:

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