Programavimas

Trys „Java“ perkeliamumo tipai

„Java“ programuotojų bendruomenėje sukėlė daug įspūdžių, nes žada nešiojamas programos ir programėlės. Tiesą sakant, „Java“ teikia tris skirtingus perkeliamumo tipus: šaltinio kodo perkėlimą, procesoriaus architektūros perkeliamumą ir OS / GUI perkeliamumą. Tai, kad yra trys skirtingi perkeliamumo tipai, yra labai svarbus, nes tik vienas iš šių tipų kelia grėsmę „Microsoft“. Galima tikėtis, kad „Microsoft“ pakenks šio tipo perkeliamumui, apims kitus du, tuo pačiu teigdama, kad palaiko „Java“. Suprasti trijų rūšių perkeliamumą ir jų veikimą yra labai svarbu norint suprasti grėsmę „Microsoft“ ir galimus „Microsoft“ atsakymus.

Prieš pradėdami išsamiai apibūdinti kiekvieną iš šių trijų rūšių perkeliamumą, apžvelkime keletą pagrindinių terminų.

Apibrėžiant kai kuriuos terminus

Šiame straipsnyje vartojami šie terminai:

Endianizmas
Endianizmas reiškia baitų saugojimo tvarką daugiabačiu kiekiu tam tikrame procesoriuje. Pvz., Nepasirašytas trumpasis 256 (dešimtainis) reikalauja dviejų baitų saugyklos: 0x01 ir 0x00. Šie du baitai gali būti saugomi bet kuria tvarka: 0x01, 0x00 arba 0x00, 0x01. Endianizmas lemia dviejų baitų saugojimo tvarką. Praktiniais tikslais endianizmas paprastai yra svarbus tik tada, kai skirtingo endianizmo procesoriai turi dalytis duomenimis.
„Java“
„Java“ yra kelios skirtingos technologijos, supakuotos kartu - „Java“ programavimo kalba, „Java“ virtualioji mašina (JVM) ir klasių bibliotekos, susietos su kalba. Šiame straipsnyje aptariami visi šie aspektai.
„Java“ virtuali mašina (JVM)

JVM yra įsivaizduojamas procesorius, kuriam dauguma „Java“ kompiliatorių skleidžia kodą. Šio įsivaizduojamo procesoriaus palaikymas leidžia „Java“ programoms veikti nekompiliuojant skirtingų procesorių. Niekas „Java“ programavimo kalba nereikalauja, kad „Java“ šaltinio kodas būtų sukompiliuotas į JVM kodą, o ne į vietinį objekto kodą.

Tiesą sakant, „Asymetrix“ ir „Microsoft“ paskelbė „Java“ kompiliatorius, kurie skleidžia vietines „Microsoft Windows“ programas. (Daugiau informacijos rasite šio straipsnio skyriuje „Ištekliai“.)

J kodas
J kodas yra išvestis, kurią dauguma „Java“ kompiliatorių skleidžia į klasės failus. J kodas gali būti laikomas „Java“ virtualiosios mašinos objekto kodu.
Perkeliamumas
Perkeliamumas reiškia galimybę paleisti programą skirtingose ​​mašinose. Norint paleisti tam tikrą programą skirtingose ​​mašinose, gali prireikti skirtingo darbo kiekio (pvz., Jokio darbo, naujo kompiliavimo ar nedidelių šaltinio kodo pakeitimų). Kai žmonės „Java“ programas ir programėles vadina nešiojamaisiais, jie paprastai reiškia, kad programos ir programėlės veikia skirtingų tipų mašinose be jokių pakeitimų (pvz., Kompiliavimo ar šaltinio kodo pataisymo).

Dabar, kai apimsime keletą esminių terminų, paaiškinsime kiekvieną iš trijų „Java“ perkeliamumo tipų.

„Java“ kaip kalba: šaltinio kodo perkeliamumas

Kaip programavimo kalbą, „Java“ suteikia paprasčiausią ir žinomiausią perkeliamumo formą - šaltinio kodo perkeliamumą. Duota „Java“ programa turėtų duoda identiškus rezultatus, nepaisant pagrindinio procesoriaus, operacinės sistemos ar „Java“ kompiliatoriaus. Ši idėja nėra nauja; tokios kalbos kaip C ir C ++ daugelį metų suteikė galimybę perkelti šį lygį. Tačiau C ir C ++ taip pat suteikia daug galimybių sukurti ir nešiojamąjį kodą. Jei programos, parašytos C ir C ++, nėra sukurtos taip, kad būtų nešiojamos nuo pat pradžių, galimybė pereiti prie skirtingų mašinų yra daugiau teorinė nei praktinė. C ir C ++ palieka neapibrėžtas detales, tokias kaip atominių duomenų tipų dydis ir endianizmas, slankiojo kablelio matematikos elgsena, neinicijuotų kintamųjų vertė ir elgesys, kai pasiekiama atlaisvinta atmintis.

Trumpai tariant, nors C ir C ++ sintaksė yra gerai apibrėžta, semantika nėra. Šis semantinis laisvumas leidžia surinkti vieną C arba C ++ šaltinio kodo bloką programoms, kurios duoda skirtingus rezultatus, kai jos veikia skirtingais procesoriais, operacinėmis sistemomis, kompiliatoriais ir net vienu kompiliatoriaus / procesoriaus / OS deriniu, atsižvelgiant į įvairius kompiliatoriaus nustatymus. (Žr. Šoninę juostą Sintaksė ir semantika semantikos ir sintaksės skirtumų aptarimui.)

„Java“ yra kitokia. „Java“ pateikia kur kas griežtesnę semantiką ir palieka mažiau diegėjui. Skirtingai nuo C ir C ++, „Java“ apibrėžė atomų tipų dydžius ir endianizmą, taip pat apibrėžė slankiojo kablelio elgseną.

Be to, „Java“ apibrėžia daugiau elgesio nei „C“ ir „C ++“. „Java“ atminties neatlaisvina tol, kol jos nebegalima pasiekti, o kalboje nėra neinicijuotų kintamųjų. Visos šios funkcijos padeda susiaurinti „Java“ programos elgesio skirtumus nuo platformos iki platformos ir įgyvendinimo iki įgyvendinimo. Net ir be JVM galima tikėtis, kad „Java“ kalba parašytos programos daug geriau nei lygiavertės „C“ arba „C ++“ programos perkelia (po kompiliavimo) į skirtingus procesorius ir operacines sistemas.

Deja, funkcijos, dėl kurių „Java“ yra tokia nešiojama, turi ir neigiamą pusę. „Java“ prisiima 32 bitų mašiną su 8 bitų baitais ir IEEE754 slankiojo kablelio matematika. Mašinos, kurios netinka šiam modeliui, įskaitant 8 bitų mikrovaldiklius ir „Cray“ superkompiuterius, negali efektyviai paleisti „Java“. Dėl šios priežasties turėtume tikėtis, kad C ir C ++ bus naudojamos daugiau platformų nei „Java“ kalba. Taip pat turėtume tikėtis, kad „Java“ programos lengviau nei C arba C ++ perkeliamos tarp tų platformų, kurios palaiko abi.

„Java“ kaip virtuali mašina: procesoriaus perkeliamumas

Dauguma kompiliatorių sukuria objekto kodą, veikiantį vienoje CPU šeimoje (pavyzdžiui, „Intel x86“ šeima). Net kompiliatoriai, kurie gamina objekto kodą kelioms skirtingoms procesorių šeimoms (pavyzdžiui, x86, MIPS ir SPARC), vienu metu gamina tik vieno procesoriaus tipo objektų kodus; jei jums reikia trijų skirtingų procesoriaus šeimų objekto kodo, turite tris kartus sukompiliuoti šaltinio kodą.

Dabartiniai „Java“ kompiliatoriai yra skirtingi. Užuot gaminę išvestį kiekvienai skirtingai procesoriaus šeimai, kurioje ketinama vykdyti „Java“ programą, dabartiniai „Java“ kompiliatoriai sukuria objekto kodą (vadinamą J kodu) procesoriui, kurio dar nėra.

(Saulė turi paskelbė procesorių, kuris tiesiogiai vykdys J kodą, tačiau nurodo, kad pirmieji „Java“ lustų pavyzdžiai pasirodys tik šių metų antroje pusėje; visa tokių lustų gamyba prasidės kitais metais. „Sun Microelectronics“ pagrindinė „picoJavaI“ technologija bus pačios „Sun“ „microJava“ procesorių linijos, kuri bus skirta tinklo kompiuteriams, šerdis. Licenciatai, tokie kaip „LG Semicon“, „Toshiba Corp.“ ir „Rockwell Collins Inc.“, taip pat planuoja gaminti „Java“ lustus, pagrįstus „picoJavaI“ šerdimi.)

Kiekvienam tikram procesoriui, kuriame ketinama paleisti „Java“ programas, „Java“ vertėjas ar virtuali mašina „vykdo“ J kodą. Šis neegzistuojantis procesorius leidžia tą patį objekto kodą paleisti bet kuriame procesoriuje, kuriam egzistuoja „Java“ vertėjas.

Išvesties gaminimas įsivaizduojamam procesoriui nėra nauja „Java“: UCSD (Kalifornijos universitetas, San Diege) „Pascal“ kompiliatoriai prieš metus pagamino P kodą; „Limbo“, nauja „Lucent Technologies“ kuriama programavimo kalba, gamina įsivaizduojamo centrinio procesoriaus objekto kodą; o Perlas sukuria tarpinį programos atvaizdavimą ir vykdo šį tarpinį vaizdavimą, užuot sukūręs gimtąjį vykdomąjį kodą. Internete išmanantis JVM skiriasi nuo šių kitų virtualių procesorių diegimų, tyčia sukurtas taip, kad būtų galima generuoti tikrai saugų, be virusų kodą. Iki interneto nereikėjo virtualių mašinų įrodyti, kad programos saugios ir be virusų. Ši saugos funkcija kartu su daug geresniu supratimu, kaip greitai vykdyti programas įsivaizduojamiems procesoriams, leido greitai ir plačiai pripažinti JVM. Šiandien dauguma pagrindinių operacinių sistemų, įskaitant „OS / 2“, „MacOS“, „Windows 95 / NT“ ir „Novell Netware“, turi arba turėtų turėti integruotą „J-code“ programų palaikymą.

JVM, būdamas įsivaizduojamas procesorius, nepriklauso nuo šaltinio kodo kalbos. „Java“ kalba gali sukurti J kodą. Bet taip gali ir „Ada95“. Tiesą sakant, J kodo priglobti vertėjai buvo parašyti kelioms kalboms, įskaitant „BASIC“, „Forth“, „Lisp“ ir „Scheme“, ir beveik neabejotina, kad įdiegus kitas kalbas ateityje bus skleidžiamas J kodas. Kai šaltinio kodas bus konvertuotas į J kodą, „Java“ vertėjas negali pasakyti, kokia programavimo kalba sukūrė J kodą, kurį jis vykdo. Rezultatas: perkeliamumas tarp skirtingų procesorių.

Programų (bet kuria kalba) kompiliavimo pagal J kodą nauda yra ta, kad tas pats kodas veikia skirtingose ​​procesorių šeimose. Neigiama yra tai, kad J kodas veikia ne taip greitai, kaip gimtoji. Daugumai programų tai nebus svarbu, tačiau daugumai aukščiausios klasės programų - toms, kurioms reikalingi kas paskutiniai procesoriaus procentai - J kodo našumo išlaidos nebus priimtinos.

„Java“ kaip virtuali OS ir GUI: OS perkeliamumas

Dauguma „Microsoft Windows“ programų, parašytų C arba C ++, net po perkompiliavimo nėra lengvai perkeltos į „Macintosh“ ar „Unix“ aplinkas. Net jei programuotojai ypač rūpinasi, kad išspręstų C ar C ++ semantinius trūkumus, uostas yra sunkus. Šis sunkumas kyla net tada, kai ne Windows operacinės sistemos prievadas vyksta nekeičiant procesoriaus. Kodėl sunkumai?

Pašalinę semantines C ir C ++ problemas bei procesoriaus perkėlimo problemas, programuotojai vis tiek turi spręsti skirtingas operacines sistemas ir skirtingus GUI API iškvietimus.

„Windows“ programos operacinei sistemai skambina labai skirtingai nei „Macintosh“ ir „Unix“ programos. Šie skambučiai yra labai svarbūs rašant ne trivialias programas, todėl, kol nebus išspręsta ši perkėlimo problema, perkėlimas išliks sunkus.

„Java“ išsprendžia šią problemą pateikdama bibliotekos funkcijų rinkinį (esančią „Java“ teikiamose bibliotekose, tokiose kaip awt, utilir lang), kad kalbėti su įsivaizduojama OS ir menama GUI. Kaip JVM pateikia virtualų procesorių, „Java“ bibliotekos pateikia virtualią OS / GUI. Kiekvienas „Java“ diegimas suteikia bibliotekoms, įgyvendinančioms šią virtualią OS / GUI. „Java“ programos, kurios naudoja šias bibliotekas reikalingoms OS ir GUI funkcijoms užtikrinti, gana lengvai uosto.

Nešiojamojo bibliotekos naudojimas vietinių OS / GUI skambučių metu nėra nauja idėja. Tokie produktai kaip „Visix“ programinės įrangos „Galaxy“ ir „Protools“ programinės įrangos cinkas suteikia šią galimybę naudoti C ir C ++. Kitas būdas, kurio nesilaiko „Java“, yra pasirinkti vieną OS / GUI kaip pagrindinį ir pateikti pakavimo bibliotekas, palaikančias šią pagrindinę OS / GUI visose mašinose, į kurias norite perkelti. Pagrindinio OS / GUI požiūrio problema yra ta, kad perkeltos programos kitose mašinose dažnai atrodo svetimos. Pavyzdžiui, „Macintosh“ vartotojai skundėsi naujausia „Microsoft Word“, skirta „Macintosh“, versija, nes ji atrodė ir elgėsi kaip „Windows“ programa, o ne kaip „Macintosh“ programa. Deja, „Java“ požiūris taip pat turi problemų.

„Java“ savo OS / GUI bibliotekose pateikė mažiausiai bendro vardiklio funkcionalumą. Funkcijos, esančios tik vienoje OS / GUI, pvz., Skirtukų dialogo langai, buvo praleistos. Šio požiūrio privalumas yra tas, kad bendros funkcijos susiejimas su gimtąja OS / GUI yra gana lengvas ir, atsargiai, gali teikti programas, kurios veikia taip, kaip tikėtasi daugumoje OS / GUI. Trūkumas yra tas, kad vietinio režimo programoms bus prieinamos funkcijos, kurių negalima pasiekti „Java“ programoms. Kartais kūrėjai galės tai išspręsti išplėsdami AWT; kitu metu jie to nedarys. Tais atvejais, kai norimų funkcijų nepasiekiama apeinant, kūrėjai greičiausiai pasirenka rašyti neperkeliamą kodą.

Kam rūpi perkeliamumas?

Trys pagrindinės apygardos rūpinasi perkeliamumu: kūrėjai, galutiniai vartotojai ir MIS skyriai.

Kūrėjai: didelės galimybės ir grėsmės

Kūrėjai yra suinteresuoti kurti nešiojamą programinę įrangą. Teigiama, kad nešiojama programinė įranga leidžia palaikyti daugiau platformų, o tai lemia didesnę potencialių klientų bazę. Tačiau tas pats perkeliamumas, kuris leidžia kūrėjams nukreipti naujas rinkas, taip pat leidžia konkurentams nukreipti savo rinką.

Trumpai tariant, „Java“ perkėlimas nustumia taikomųjų programų rinką nuo atskirų rinkų, pagrįstų įvairiomis OS ir GUI, ir link vienos didelės rinkos. Pavyzdžiui, dabartinėje programinės įrangos rinkoje „Microsoft“ yra jėga, į kurią reikia atsižvelgti „Windows“ ir „Macintosh“ programų programinės įrangos rinkose, tačiau jos beveik nėra OS / 2 ir „Unix“ rinkose. Šis skaidymas leidžia įmonėms OS / 2 ir „Unix“ rinkose nepaisyti „Microsoft“ kaip konkurento. „Java“ leidžia šioms įmonėms lengviau konkuruoti „Windows“ rinkoje, tačiau taip pat leidžia „Microsoft“ lengviau patekti į OS / 2 ir „Unix“ rinkas.

Vartotojai: netiesioginiai perkeliamumo naudos gavėjai

Vartotojams savaime nerūpi perkeliamumas. Jei perkeliamumas palengvina ir malonina jų gyvenimą, tada jie visi už tai; jei ne, jie ne. Perkeliamumas turi tam tikrą teigiamą poveikį vartotojams, tačiau tai yra šiek tiek netiesioginis. Teigiamas poveikis: