Javine tri vrste prenosivosti

Java je izazvala puno uzbuđenja u programskoj zajednici jer obećava prijenosne aplikacije i aplete. Zapravo, Java nudi tri različite vrste prenosivosti: prenosivost izvornog koda, prenosivost CPU arhitekture i prenosivost OS / GUI. Činjenica da postoje tri različite vrste prenosivosti presudna je, jer samo jedna od tih vrsta predstavlja prijetnju Microsoftu. Od Microsofta se može očekivati ​​da potkopa tu vrstu prenosivosti dok prihvaća druge dvije - a cijelo vrijeme tvrdi da podržava Javu. Razumijevanje tri vrste prenosivosti i njihovog zajedničkog rada presudno je za razumijevanje prijetnje Microsoftu i mogućih Microsoftovih odgovora.

Prije nego što uđemo u detalje o svakoj od ove tri vrste prenosivosti, pregledajmo nekoliko temeljnih pojmova.

Definiranje nekih pojmova

U ovom su članku korišteni sljedeći izrazi:

Endijanizam
Endijanizam se odnosi na redoslijed pohrane bajtova u višebajtnoj količini u danom CPU-u. Na primjer, nepotpisani kratki 256 (decimalni) zahtijeva dva bajta memorije: 0x01 i 0x00. Te se dvije bajtove mogu pohraniti u bilo kojem redoslijedu: 0x01, 0x00ili 0x00, 0x01. Endijanizam određuje redoslijed u kojem su pohranjena dva bajta. Iz praktičnih svrha, endijanizam je obično važan samo kada CPU-ovi različitog endijanizma moraju dijeliti podatke.
Java
Java je nekoliko različitih tehnologija upakiranih zajedno - programski jezik Java, Java virtualni stroj (JVM) i knjižnice klasa povezane s jezikom. Ovaj članak raspravlja o svim tim aspektima.
Java virtualni stroj (JVM)

JVM je zamišljeni CPU za koji većina Java kompajlera emitira kôd. Podrška za ovaj zamišljeni CPU je ono što omogućava Java programima da se izvode bez ponovne kompilacije na različitim CPU-ima. Ništa u programskom jeziku Java ne zahtijeva da se izvorni kod Java kompajlira u kôd za JVM umjesto u izvorni objektni kôd.

Zapravo, Asymetrix i Microsoft najavili su Java kompajlere koji emitiraju izvorne Microsoft Windows programe. (Dodatne informacije potražite u odjeljku Resursi ovog članka.)

J-kod
J-kod je izlaz koji većina Java kompajlera emitira u datoteke klase. J-kod se može smatrati objektnim kodom za Java virtualni stroj.
Prijenosnost
Prenosivost se odnosi na sposobnost pokretanja programa na različitim strojevima. Pokretanje određenog programa na različitim strojevima može zahtijevati različite količine posla (na primjer, nikakav rad, ponovna kompilacija ili male promjene u izvornom kodu). Kad ljudi nazivaju Java programe i aplete prijenosnim, oni obično znače da se programi i apleti izvode na različitim vrstama strojeva bez promjena (poput ponovne kompilacije ili prilagođavanja izvornog koda).

Sad kad smo pokrili neke bitne pojmove, objasnit ćemo svaku od tri vrste prenosivosti Java.

Java kao jezik: prenosivost izvornog koda

Kao programski jezik Java pruža najjednostavniji i najpoznatiji oblik prenosivosti - prenosivost izvornog koda. Dani Java program trebao bidaju identične rezultate bez obzira na temeljni procesor, operativni sustav ili Java kompajler. Ova ideja nije nova; jezici poput C i C ++ pružaju priliku za ovu razinu prenosivosti već dugi niz godina. Međutim, C i C ++ također pružaju brojne mogućnosti za stvaranje prijenosnog koda. Ako programi napisani na C i C ++ nisu od početka dizajnirani za prijenos, sposobnost prelaska na različite strojeve više je teoretska nego praktična. C i C ++ ostavljaju nedefinirane detalje kao što su veličina i endijanizam atomskih tipova podataka, ponašanje matematike s pomičnom zarezom, vrijednost neinicijaliziranih varijabli i ponašanje kada se pristupa oslobođenoj memoriji.

Ukratko, iako je sintaksa C i C ++ dobro definirana, semantika to nije. Ova semantička labavost omogućuje da se jedan blok izvornog koda C ili C ++ kompajlira u programe koji daju različite rezultate kada se izvode na različitim procesorima, operativnim sustavima, kompajlerima, pa čak i na jednoj kombinaciji kompajlera / CPU / OS, ovisno o raznim postavkama kompajlera. (Pogledajte distancu o razlikama između semantike i sintakse na bočnoj traci Sintaksa nasuprot semantici .)

Java je drugačija. Java pruža mnogo rigorozniju semantiku, a manje prepušta implementatoru. Za razliku od C i C ++, Java ima definirane veličine i endijanizam za atomske tipove, kao i definirano ponašanje s pomičnom zarezom.

Uz to, Java definira više ponašanja od C i C ++. U Javi se memorija ne oslobađa sve dok joj se više ne može pristupiti, a jezik nema neinicijalizirane varijable. Sve ove značajke pomažu u sužavanju varijacija u ponašanju Java programa s platforme na platformu i implementacije na implementaciju. Čak i bez JVM-a, može se očekivati ​​da se programi napisani na jeziku Java prenose (nakon ponovnog prevođenja) na različite procesore i operativne sustave puno bolje od ekvivalentnih programa C ili C ++.

Nažalost, značajke zbog kojih je Java toliko prijenosna imaju i lošu stranu. Java pretpostavlja 32-bitni stroj s 8-bitnim bajtovima i matematikom s pomičnom zarezom IEEE754. Strojevi koji ne odgovaraju ovom modelu, uključujući 8-bitne mikrokontrolere i superračunala Cray, ne mogu učinkovito pokretati Javu. Iz tog razloga trebali bismo očekivati ​​da se C i C ++ koriste na više platformi od Java jezika. Također bismo trebali očekivati ​​da se Java programi lakše prenose od C ili C ++ između onih platformi koje podržavaju obje.

Java kao virtualni stroj: prenosivost CPU-a

Većina kompajlera proizvodi objektni kod koji radi na jednoj obitelji CPU-a (na primjer, Intel x86 obitelj). Čak i kompajleri koji proizvode objektni kôd za nekoliko različitih CPU obitelji (na primjer, x86, MIPS i SPARC) proizvode istovremeno samo objektni kod za jedan tip CPU-a; ako vam je potreban objektni kod za tri različite obitelji CPU-a, morate tri puta prevesti svoj izvorni kod.

Trenutni Java kompajleri su drugačiji. Umjesto da proizvode za svaku različitu CPU obitelj na kojoj je Java program namijenjen izvođenju, trenutni Java kompajleri proizvode objektni kod (nazvan J-kod) za CPU koji još ne postoji.

(Sun je najavio CPU koji će izravno izvršavati J-kod, ali naznačuje da će se prvi uzorci Java čipova pojaviti tek u drugoj polovici ove godine; puna proizvodnja takvih čipova započet će sljedeće godine. Osnovna tehnologija Sun Microelectronics-a picoJavaI bit će u srcu Sunčeve vlastite linije procesora microJava, koja će ciljati mrežna računala. Vlasnici licenci kao što su LG Semicon, Toshiba Corp. i Rockwell Collins Inc. također planiraju proizvoditi Java čipove bazirane na jezgri picoJavaI.)

Za svaki stvarni CPU na kojem su predviđeni Java programi, Java interpreter ili virtualni stroj "izvršava" J-kod. Ovaj nepostojeći CPU omogućuje da se isti objektni kod izvodi na bilo kojem CPU-u za koji postoji Java interpreter.

Izrada rezultata za zamišljeni CPU nije novost na Javi: UCSD (Sveučilište Kalifornija u San Diegu) Pascal kompajleri proizveli su P-kod prije mnogo godina; Limbo, novi programski jezik u razvoju u tvrtki Lucent Technologies, proizvodi objektni kod za zamišljeni CPU; i Perl stvara međupredstavnu predstavu programa i izvršava tu srednju predstavu umjesto stvaranja izvornog izvršnog koda. Internetski pametni JVM razlikuje se od ostalih implementacija virtualnog CPU-a namjerno dizajniran da omogući generiranje dokazivo sigurnog koda bez virusa. Prije Interneta nije bilo potrebe za virtualnim strojevima koji bi dokazali da su programi sigurni i bez virusa. Ova sigurnosna značajka, u kombinaciji s puno boljim razumijevanjem kako brzo izvršiti programe za zamišljene procesore, dovela je do brze,široko prihvaćeno JVM. Danas većina glavnih operativnih sustava, uključujući OS / 2, MacOS, Windows 95 / NT i Novell Netware, ima, ili se očekuje da će imati ugrađenu podršku za programe s J-kodom.

JVM, koji je u osnovi zamišljeni CPU, neovisan je o jeziku izvornog koda. Jezik Java može proizvesti J-kod. Ali to može i Ada95. U stvari, tumači s hostovanim J kodom napisani su za nekoliko jezika, uključujući BASIC, Forth, Lisp i Scheme, i gotovo je sigurno da će implementacije drugih jezika u budućnosti emitirati J-kod. Nakon što se izvorni kod pretvori u J-kôd, Java interpreter ne može reći koji je programski jezik stvorio J-kôd koji izvršava. Rezultat: prenosivost između različitih procesora.

Prednost kompiliranja programa (na bilo kojem jeziku) u J-kod je u tome što se isti kôd izvodi na različitim obiteljima CPU-a. Loša strana je što J-kod ne radi tako brzo kao izvorni kôd. Za većinu aplikacija to neće biti važno, ali za najviše napredne programe - one koji trebaju svaki zadnji postotak CPU-a - troškovi izvedbe J-koda neće biti prihvatljivi.

Java kao virtualni OS i GUI: prenosivost OS-a

Većina programa Microsoft Windows napisanih na C ili C ++ ne mogu se lako povezati na Macintosh ili Unix okruženje, čak i nakon ponovne kompilacije. Čak i ako programeri dodatno paze da se nose sa semantičkim slabostima u C ili C ++, priključak je težak. Ova se poteškoća pojavljuje čak i kada se priključenje na operativni sustav koji nije Windows odvija bez promjene CPU-a. Zašto poteškoća?

Nakon uklanjanja semantičkih problema u C i C ++ i problema s prijenosom CPU-a, programeri se i dalje moraju nositi s različitim operativnim sustavom i različitim GUI API pozivima.

Windows programi vrlo različito pozivaju operativni sustav od Macintosha i Unixa. Ti su pozivi presudni za pisanje netrivijalnih programa, pa dok se ne riješi ovaj problem prenosivosti, prijenos će i dalje biti težak.

Java rješava taj problem dajući skup biblioteka funkcija (koja se nalazi u Java isporučene knjižnicama, kao što su awt, utili lang) da razgovara s imaginarnim OS i imaginarni GUI. Baš kao što JVM predstavlja virtualni CPU, Java knjižnice predstavljaju virtualni OS / GUI. Svaka implementacija Java pruža knjižnice koje implementiraju ovaj virtualni OS / GUI. Java programi koji koriste ove knjižnice za prilično lako pružanje potrebnih priključaka za OS i GUI.

Korištenje knjižnice prenosivosti umjesto izvornih OS / GUI poziva nije nova ideja. Proizvodi kao što su Visix Software Galaxy i Zinc Protools Software pružaju ovu mogućnost za C i C ++. Sljedeći pristup, koji ne slijedi Java, jest odabrati jedan OS / GUI za glavnog i osigurati knjižnice omotača koji podržavaju ovaj glavni OS / GUI na svim računalima na koje želite priključiti. Problem s glavnim OS / GUI pristupom je taj što prenesene aplikacije na drugim strojevima često izgledaju strano. Primjerice, korisnici Macintosha žalili su se na nedavnu verziju programa Microsoft Word za Macintosh jer je izgledao i ponašao se kao Windows program, a ne kao Macintosh program. Nažalost, pristup koji je zauzela Java ima problema.

Java je pružila funkcionalnost najmanje zajedničkog nazivnika u svojim OS / GUI knjižnicama. Izostavljene su značajke dostupne na samo jednom OS / GUI, poput dijaloških okvira s karticama. Prednost ovog pristupa je što je mapiranje zajedničke funkcionalnosti s matičnim OS / GUI-om prilično jednostavno i s pažnjom može pružiti aplikacije koje rade kako se očekuje na većini OS-a / GUI-a. Nedostatak je što će programima izvornog načina rada biti dostupna funkcionalnost koja Java aplikacijama nije dostupna. Ponekad će programeri moći zaobići ovo proširivanjem AWT-a; drugi put neće. U onim slučajevima u kojima je željena funkcionalnost nedostižna zaobilaznim rješenjima, programeri će najvjerojatnije odabrati pisanje neprenosivog koda.

Koga je briga za prenosivost?

Tri glavne izborne jedinice brinu se o prenosivosti: programeri, krajnji korisnici i MIS odjeli.

Programeri: Mogućnosti i prijetnje postaju velike

Programeri su zainteresirani za stvaranje prijenosnog softvera. Prije svega, prijenosni softver omogućuje im podršku više platformi, što dovodi do veće baze potencijalnih kupaca. Međutim, ista prenosivost koja omogućava programerima ciljanje novih tržišta, također omogućuje konkurentima ciljanje njihovog tržišta.

Ukratko, prenosivost Jave odmiče tržište aplikacijskog softvera od odvojenih tržišta koja se temelje na raznim OS-ima i GUI-ima prema jednom velikom tržištu. Na trenutnom tržištu softvera, na primjer, Microsoft je sila s kojom treba računati na tržištima aplikacijskog softvera Windows i Macintosh, ali gotovo nije prisutan na tržištima OS / 2 i Unix. Ova particija omogućuje tvrtkama na OS / 2 i Unix tržištima da zanemaruju Microsoft kao konkurenta. Java olakšava tim tvrtkama natjecanje na Windowsovom tržištu, ali omogućuje i lakši ulazak Microsofta na OS / 2 i Unix tržišta.

Korisnici: neizravni korisnici prenosivosti

Korisnike nije briga za prenosivost, samo po sebi. Ako im prenosivost čini život lakšim i ugodnijim, onda su svi za to; ako ne, nisu. Prijenosnost ima neke pozitivne učinke za korisnike, ali oni su donekle neizravni. Pozitivni učinci: