ametrov komandnoj stroki. Primer: programma, pechatayushchaya svoi argumenty public class myTop { public static void main (String args[]){ int argc = args.length; for (int i = 0; i < argc; i++) System.out.println (argc[i]); } } Aplet vypolnyaetsya v kontekste navigatora i ego zhiznennyj cikl opredelyaetsya sleduyushchimi metodami klassa Applet: public void init () vyzyvaetsya navigatorom pri zagruzka apleta; public void start (); vyzyvaetsya navigatorom pri pokaze stranicy; public void stop (); vyzyvaetsya navigatorom, kogda tot uhodit s Web-stranicy; public void destroy (); etot metod prednaznachen dlya osvobozhdenya resursov; analog destruktora, no ne vyzyvaetsya avtomaticheski; vsegda vyzyvaet stop(); vsegda vyzyvaetsya pri vyhode iz navigatora i pri perezagruzke apleta. Prostejshij aplet vyglyadit tak: 1 import java.awt.Graphics; 2 import java.applet.Applet; 3 class SimpleApplet extends Applet { 4 public void paint (Graphics g) { 5 g.drawString ("Hello world!", 10, 10); 6 } 7 } Metod public void paint (Graphics g) (stroki 4-6) opredelyaet, kak aplet pererisovyvaet sebya v tot moment, kogda okonnyj me- nedzher posylaet WWW-navigatoru zapros na pererisovku. Vklyuchenie apleta v WWW-stranicu proizvoditsya sleduyushchim obrazom. V yazyke HTML 2.0 predusmotreny special'nye konstrukcii i . Pervaya iz nih zadaet imya zagruzhaemogo klassa i raz- mery oblasti v okne navigatora, vydelyaemoj apletu. Konstrukciya sluzhit dlya peredachi informacii s WWW-stranicy v tu sre- du, v kotoroj budet vypolnyat'sya aplet. Nizhe priveden prostoj primer vkllyucheniya apleta v WWW-stranicu.

Esli vy vidite etot tekst, to vash navigator ne podderzhivaet Java

Poskol'ku WWW-navigatory ignoriruyut neizvestnye konstrukcii, v navigatore, ne podderzhivayushchem Java, budet viden tekst -------------------------------------------------------------------------- Esli vy vidite etot tekst, to vash navigator ne podderzhivaet Java -------------------------------------------------------------------------- Oprosit' znacheniya, peredavaemye s pomoshch'yu konstrukcii , mozhno sleduyushchim obrazom: public void init () { String fontname = getParameter ("name"); String fontSizestring = getParameter ("size"); int theSize = Int.parseInt (fontSizeString); . . . }  4.2.2. Java-mashina Java-kompilyator perevodit transliruet ishodnye teksty Java- programm v kody Java-mashiny. Voobshche govorya, Java-mashina yavlyaet- sya virtual'noj v tom smysle, chto ona ne sushchestvuet v vide re- al'nyh mikroshem i drugih ustrojstv, a predstavlyaet soboj prog- rammnyj emulyator, vypolnyayushchijsya na kakoj-libo tradicionnoj ap- paratnoj platforme. Veroyatno, uzhe v blizhajshee vremya sleduet ozhidat' poyavleniya i vse bolee shirokogo rasprostraneniya i pryamyh apparatnyh realizacij Java-mashiny. Ideya yazykovyh processorov, razumeetsya, ne nova. Izvestny popyt- ki vnedrit' tak nazyvaemyj P-kod v kachestve standarta na re- zul'tat raboty Paskal'-kompilyatorov; v svoe vremya mnogo pisali o yazyke i mashine Fort; byla vypolnena apparatnaya realizaciya re- fal-mashiny, i spisok etot mozhno prodolzhat' i prodolzhat'. V kontekste proekta Java specifikaciya virtual'noj mashiny yavlya- etsya chast'yu kompleksa mer, napravlennyh na standartizaciyu Java- sredy i na obespechenie ee nezavisimosti ot apparatno-programm- noj platformy. Krome togo, sleduet uchityvat' tu specificheskuyu sredu, v kotoroj dolzhny gotovit'sya i rabotat' Java-programmy. Esli Web-stranica soderzhit Java-aplety, eti aplety budut pere- davat'sya po seti. Znachit, ves'ma zhelatel'no, chtoby Java-kod byl kak mozhno bolee kompaktnym; v protivnom sluchae vremya zagruzki stranicy riskuet stat' razdrazhayushche bol'shim. Sootvetstvenno, ar- hitektura i sistema komand Java-mashiny proektirovalis' takim obrazom, chtoby vsyacheski sposobstvovat' kompaktifikacii koda. S drugoj storony, format komand Java-mashiny dovol'no prost (obych- no komandy ne imeyut operandov i zanimayut odin bajt), poetomu vozmozhna ee (mashiny) effektivnaya emulyaciya. Po etoj prichine programmy, podgotovlennye dlya vypolneniya na Java-mashine, chasto nazyvayut bajt-kodami. My opishem arhitekturu Java-mashiny dovol'no kratko. Posleduyushchee izlozhenie opiraetsya na versiyu specifikacij 1.0.  4.2.2.1. Tipy dannyh, podderzhivaemye Java-mashinoj Java-mashina podderzhivaet sleduyushchie standartnye tipy dannyh: - byte - odnobajtnye celye cisla v dvoichnom dopolnitel'nom kode; - short - dvuhbajtnye celye chisla; - int - chetyrehbajtnye celye chisla; - long - vos'mibajtnye celye chisla; - float - chetyrehbajtnye veshchestvennye chisla v formate IEEE-754; - double - vos'mibajtnye veshchestvennye chisla; - char - dvuhbajtnye bezznakovye simvoly v kodirovke Unicode. Poskol'ku Java-kompilyator v sostoyanii proverit' tipy dannyh vo vremya translyacii, pri vypolnenii net nuzhdy associirovat' dopol- nitel'nuyu informaciyu so znacheniyami standartnyh tipov. Vmesto etogo generiruyutsya komandy, rasschitannye na obrabotku dannyh opredelennyh tipov. Naprimer, dlya slozheniya celyh chisel budet sgenerirovana komanda iadd, a dlya slozheniya veshchestvennyh chisel dvojnoj tochnosti - komanda dadd. Znacheniya tipa boolean predstavlyayutsya odnobajtnymi celymi chisla- mi i obrabatyvayutsya posredstvom sootvetstvuyushchih komand. Imeetsya eshche dva standartnyh tipa dannyh: - object - chetyrehbajtnaya ssylka na ob容kt (massivy traktuyutsya kak ob容kty); - returnAddress - chetyrehbajtnyj adres vozvrata iz metoda. Specifikacii Java-mashiny ne opisyvayut vnutrennej struktury ob- 容ktov. V realizacii Sun Microsystems znachenie tipa object uka- zyvaet na opisatel', hranyashchij dve ssylki - na tablicu metodov i na dannye ob容kta. Vozmozhny i drugie predstavleniya. Java-mashina yavlyaetsya 32-razryadnoj. Bolee dlinnye znacheniya (long, double) predstavlyayutsya kak para chetyrehbajtnyh velichin. Ne ogovorivaetsya, v kakom poryadke raspolagayutsya elementy pary; bolee togo, verifikator bajt-kodov obyazan vyyavlyat' i otvergat' programmy, pytayushchiesya "vruchnuyu" sostavlyat' dlinnye znacheniya.  4.2.2.2. Registry V Java-mashine dolzhny podderzhivat'sya sleduyushchie registry: - pc - schetchik komand; ukazyvaet na kod operacii dlya komandy, kotoraya budet vypolnyat'sya sleduyushchej. - vars - bazovyj registr dlya dostupa k lokal'nym peremennym te- kushchego metoda. - optop - ukazatel' na vershinu steka operandov. Java-mashina yav- lyaetsya stekovoj, poetomu osnovnaya chast' komand beret operandy iz steka i tuda zhe pomeshchaet rezul'tat. - frame - ukazatel' na strukturu, soderzhashchuyu okruzhenie vremeni vypolneniya. V svoyu ochered', okruzhenie vremeni vypolneniya ispol'zuetsya dlya realizacii treh celej: dinamicheskoj zagruzki, vozvrata iz meto- dov i obrabotki isklyuchitel'nyh situacij. Dlya obespecheniya dinamicheskoj zagruzki, okruzhenie vremeni vypol- neniya soderzhit ssylki na tablicu sivmolov tekushchego metoda i te- kushchego klassa. Pered nachalom vypolneniya metoda vypolnyaetsya re- daktirovanie ego vneshnih svyazej (nastrojka ssylok na vneshnie metody i vneshnie dannye). Podobnaya pozdnyaya nastrojka ssylok de- laet sgenerirovannyj kod ustojchivym po otnosheniyu k izmeneniyam vo vneshnih klassah. Dlya obespecheniya normal'nogo vozvrata iz metodov vypolnyaetsya vosstanovlenie registrovogo okruzheniya vyzyvayushchego metoda. Dlya obrabotki isklyuchitel'nyh situacij Java-mashina vypolnyaet prohod po steku vyzova metodov i otyskivaet samuyu vnutrennyuyu konstrukciyu catch, obrabatyvayushchuyu sluchivsheesya sobytie. V principe okruzhenie vremeni vypolneniya mozhet soderzhat' dopol- nitel'nuyu informaciyu, neobhodimuyu, naprimer, dlya otladki, no v specifikaciyah Java-mashiny eto ostavleno na usmotrenie avtorov realizacii.  4.2.2.3. Sbor musora Dlya sozdaniya ob容ktov vo vremya vypolneniya vydelyaetsya oblast' dinamicheskoj pamyati. YAzyk Java rasschitan na to, chto etu oblast' obsluzhivaet sborshchik musora, poskol'ku v yazyke net sredstv dlya osvobozhdeniya pamyati. Kak imenno rabotaet sborshchik musora, opre- delyaetsya realizaciej Java-mashiny.  4.2.2.4. Sistema komand Java-mashiny Komanda Java-mashiny sostoit iz odnobajtnogo koda operacii, za kotorym sleduyut operandy (esli takovye imeyutsya). Mozhno vydelit' sleduyushchie gruppy komand: - komandy zagruzki konstant i peremennyh v stek operandov. Dlya kazhdogo tipa dannyh imeyutsya svoi komandy zagruzki. Naprimer, komanda s kodom operacii dload i operandom, zadayushchim smeshchenie, zagruzhaet v stek iz lokal'noj peremennoj veshchestvennoe chislo dvojnoj tochnosti, a komanda aload delaet to zhe dlya ssylki na ob容kt. - komandy zapominaniya dannyh iz steka v lokal'nyh peremennyh. - komandy upravleniya massivami. Naprimer, komanda newarray s operandom, zadayushchim tip elementov, izvlekaet iz steka trebuemyj razmer massiva, sozdaet ego i pomeshchaet v stek ssylku na massiv. Otmetim, chto dlya sozdaniya massivov s elementami-ob容ktami slu- zhit drugaya komanda, anewarray. Za schet podobnoj specializacii dostigaetsya effektivnost' interpretacii Java-programm. - komandy raboty so stekom. K etoj gruppe otnosyatsya komandy, kotorye udalyayut, dubliruyut, menyayut mestami verhnie elementy steka operandov, a takzhe vypolnyayut drugie, bolee slozhnye mani- pulyacii so stekom. - arifmeticheskie komandy. Operandy izvlekayutsya iz steka; tuda zhe pomeshchaetsya rezul'tat. - logicheskie komandy (sdvig, i, ili, isklyuchayushchee ili). - komandy preobrazovaniya k drugomu tipu. - komandy peredachi upravleniya. Naprimer, v komande jsr (perehod na podprogrammu) operandom sluzhit otnositel'nyj adres perehoda; adres komandy, sleduyushchej za jsr, pomeshchaetsya na vershinu steka operandov. Imeyutsya komandy dlya realizacii pereklyuchatelej. - komandy vozvrata iz funkcii. Dlya vozvrata rezul'tatov raznyh tipov ispol'zuyutsya komandy s raznymi kodami operacii. Krome to- go, imeetsya komanda breakpoint, kotoraya ostanavlivaet normal'- nyj hod vypolneniya i peredaet upravlenie obrabotchiku etogo so- bytiya. - komandy manipulirovaniya s polyami ob容ktov (ustanovit'/prochi- tat' obychnoe/staticheskoe pole). - komandy vyzova metodov. Ih chetyre. Komanda invokevirtual vy- zyvaet (virtual'nyj) metod na osnove analiza informacii vremeni vypolneniya. Komanda invokenonvirtual osushchestvlyaet vyzov na os- nove informacii vremeni kompilyacii - naprimer, vyzov metoda ro- ditel'skogo klassa. Komanda invokestatic vyzyvaet staticheskij metod klassa. Nakonec, komanda invokeinterface vyzyvaet metod, predstavlennyj interfejsom. Vypolnenie vseh perechislennyh ko- mand svyazano ne tol'ko s peredachej upravleniya, no i s analizom raznogo roda tablic. - komanda vozbuzhdeniya isklyuchitel'noj situacii - athrow. - prochie ob容ktnye operacii (sozdat' ob容kt, proverit' tip ob- 容kta). - komandy sihronizacii (vojti v kriticheskij interval, vyjti iz nego). My vidim, chto ne sushchestvuet semanticheskogo razryva mezhdu yazykom Java i Java-mashinoj. Kak uzhe otmechalos', eto vazhno dlya kompakt- nosti skompilirovannyh Java-programm i dlya obespecheniya vysokoj skorosti translyacii.  4.2.3. Java i bezopasnost' Koncepciya zagruzki ob容ktov po seti prozrachnym dlya pol'zovatelya obrazom stol' zhe privlekatel'na, skol' i opasna. Esli ne predp- rinimat' nikakih mer i ne nakladyvat' nikakih ogranichenij na vozmozhnosti Java-apletov, vhod na lyubuyu Web-stranicu mozhet pri- vesti k nepredskazuemym posledstviyam. K schast'yu, razrabotchiki yazyka Java s samogo nachala udelyali samoe pristal'noe vnimanie voprosam informaciionnoj bezopasnosti. Iz yazyka udaleny mnogie potencial'no opasnye vozmozhnosti, takie kak operator goto ili tip dannyh "ukazatel'". Interpretiruemyj harakter vypolneniya pozvolyaet ne dopustit' vyhoda za granicy massiva, obrashcheniya po pustoj ssylke i t.p. V svoe vremya za po- dobnuyu ostorozhnost' vystupal avtor yazyka Paskal' Niklaus Virt, otmechavshij, chto pri tradicionnom podhode programmist napominaet moryaka, kotoryj nosit spasatel'nyj krug tol'ko na sushe. My, odnako, ne budem podrobno ostanavlivat'sya na "obychnoj" be- zopasnosti i udelim osnovnoe vnimanie vypolneniyu potencial'no vrazhdebnyh apletov. Smezhnyj vopros - proverka podlinnosti aple- tov, snabzhennyh elektronnoj podpis'yu, vidimo, budet reshen v posleduyushchih versiyah Java-sistem. Prezhde vsego, apletam, zagruzhennym po seti, zapreshcheny chteniya i zapis' fajlov iz lokal'noj fajlovoj sistemy, a takzhe vypolnenie setevyh soedinenij so vsemi hostami, krome togo, s kotorogo byl poluchen aplet. Krome togo, takim apletam ne razreshaetsya zapus- kat' programmy na klientskoj sisteme (govorya yazykom OS UNIX, dlya nih nedostupny sistemnye vyzovy fork i exec), im zapreshcheno zagruzhat' novye biblioteki i vyzyvat' programmy, vneshnie po ot- nosheniyu k Java-mashine. Na samom dele, perechislennye ogranicheniya ne yavlyayutsya chast'yu specifikacii Java-sistemy i mogut vypolnyat'sya s bol'shej ili men'shej akkuratnost'yu. Tak, v Netscape Navigator 2.0 chtenie i zapis' lokal'nyh fajlov dejstvitel'no polnost'yu zapreshcheny. V to zhe vremya, sreda razrabotki JDK 1.0 kompanii Sun Microsystems dopuskaet zadanie spiska katalogov, s kotorymi aplety mogut ra- botat'. Bolee tochno, vne razreshennogo spiska katalogov aplet ne mozhet: - proveryat' sushchestvovanie fajlov; - chitat'/pisat'/pereimenovyvat' fajly; - sozdavat' katalogi; - proveryat' atributy fajla - tip, vremya poslednej modifikacii, razmer. CHtoby v JDK sdelat' katalog dostupnym dlya apleta, sleduet po- mestit' v fajl ~/.hotjava/properties stroki vida acl.read=/home/welcome acl.write=/tmp Pered nachalom raboty apletov oni proveryayutsya verifikatorom baj- t-kodov. Verifikator ubezhdaetsya, chto zagruzhennyj aplet soot- vetstvuet specifikaciyam, zadannym pri kompilyacii vyzyvayushchej programmy, chto ne narushen format skompilirovannogo fajla, chto net perepolneniya ili ischerpaniya steka, net nekorrektnyh preob- razovanij tipov, nepravil'nyh dejstvij s registrami i t.p. Vse eti proverki verifikator osushchestvlyaet na osnove analiza potokov dannyh. Osobenno tshchatel'no proveryayutsya konstrukcii finally ob- rabotchikov isklyuchitel'nyh situacij. Sleduet otmetit', chto vernyj vybor balansa mezhdu vozmozhnostyami zagruzhaemyh apletov i bezopasnost'yu klientskoj sistemy yavlyaetsya ochen' tonkim voprosom. Ryad kompanij, naprimer, Argus System Group, predlagayut realizovat' na klientskoj sisteme usilennye mery bezopasnosti, chtoby uspeshno otrazhat' ugrozy so storony vrazhdebnyh apletov bez ogranicheniya svobody dejstvij dlya "blago- nadezhnyh" programm. K sozhaleniyu, predlagaemye resheniya zavisyat ot operacionnoj platformy, chto protivorechit trebovaniyu absolyut- noj perenosimosti Java-programm. Mozhno predpolozhit', chto infor- macionnaya bezopasnost' eshche dolgoe vremya budet ostavat'sya odnim iz samyh slozhnym i spornyh voprosov, kasayushchihsya proekta Java.  4.2.4. Java WorkShop V konce marta 1996 goda kompaniya Sun Microsystems ob座avila o vypuske versii 1.0 sredy razrabotki Java WorkShop. U etoj sredy est' dva zamechatel'nyh svojstva: ona polnost'yu napisana na yazy- ke Java i imeet interfejs, vyderzhannyj v Web-stile. Na ris. y1 pokazan vid ekrana pri rabote v Java WorkShop. Ris. y1. Tak vyglyadit ekran pri rabote v Java WorkShop. Sleduet otmetit', chto gipertekstovyj interfejs yavlyaetsya, pozha- luj, naibolee estestvennym dlya instrumental'nyh sred. Bolee to- go, neyavno on davno ispol'zuetsya, naprimer, pri perehode vo vklyuchaemyj fajl ili v mesto oshibki. Principial'no vazhno, chto teper' gipertekst stal yavnoj konceptual'noj osnovoj. Java WorkShop soderzhit polnyj nabor instrumentov, neobhodimyh dlya proektirovaniya, razrabotki, testirovaniya, otladki i sopro- vozhdeniya programm. V ego sostav vhodyat: - Menedzher proektov - instrument organizacii informacii, sos- tavlyayushchej proekt, a takzhe sredstvo specifikacii okruzheniya dlya proekta. - Postroitel' - instrument postroeniya rezul'tiruyushchih programm proekta. Postroitel' vedaet perekompilyaciej fajlov posle vnese- niya izmenenij, vydachej gipertekstovogo spiska soobshchenij ob oshibkah i t.p. - Publikator - instrument podderzhki kollektivnoj raboty nad proektami. Pozvolyaet organizovat' hranilishche proektov, predos- tavlyat' Web-stranicy proektov dlya ispol'zovaniya drugimi prog- rammistami, osushchestvlyat' dostup k proektam kolleg, zadavat' prava dostupa k proektam. - Prosmotrshchik apletov - sredstvo kontroliruemogo vypolneniya Java-programm. - Prosmotrshchik ishodnyh tekstov - instrument izucheniya programm s uchetom ih ob容ktnoj struktury. - Redaktor ishodnyh tekstov. Redaktor integrirovan s drugimi komponentami Java WorkShop, a takzhe s populyarnymi sistemami up- ravleniya versiyami. - Otladchik. Pomimo tradicionnyh vozmozhnostej, otladchik Java WorkShop pozvolyaet kontrolirovat' sostoyanie neskol'kih potokov vypolneniya, chto neobhodimo dlya razvityh Java-programm. Na ris y2 predstavlen obraz ekrana pri rabote v otladchike. Ris. y2. Tak vyglyadit ekran pri rabote s otladchikom Java WorkShop. - Spravochnaya podsistema. Java WorkShop mozhet rabotat' kak na platforme SPARC/Solaris i Intel/Solaris, tak i pod Microsoft Windows 95/NT. Kakih-to oso- byh trebovanij k apparature Java WorkShop ne pred座avlyaet. Dos- tatochno 45 Mb diskovogo prostranstva, 32 (dlya Solaris) ili 16 (dlya Windows) Mb operativnoj pamyati. Zamechatel'no, kak v pravil'no sproektirovannoj sisteme razlich- nye komponenty ne prosto ideal'no podhodyat drug k drugu no i usilivayut moshch' drug druga.  * 4.3. Svyaz' Java s okruzheniem: okonnyj instrumentarij  4.3.1. Obshchie polozheniya Odno iz vazhnyh dostoinstv Java sostoit v tom, chto eto ne tol'ko yazyk, no i standartizovannaya ob容ktno-orientirovannaya sreda vy- polneniya. Lyubopytno prosledit', kak v ramkah Java reshayutsya tra- dicionnye programmistskie problemy. My ostanovimsya na okonnom graficheskom interfejse. Vmeste s razlichnymi priyatnymi (glavnym obrazom dlya pol'zovate- lya) svojstvami, okonnyj interfejs privnosit i dovol'no nepriyat- nye (dlya razrabotchika) problemy. Odna iz nih - eto perenosi- most' prilozhenij mezhdu raznymi platformami. Perenosimost' yavlya- etsya problemoj i bez graficheskogo interfejsa, odnako nalichie takovogo delaet ee mnogokratno slozhnee. Delo v tom, chto kazhdaya okonnaya sreda - eto slozhnyj mir, so svo- imi zakonami, naborom stroitel'nyh blokov i priemov programmi- rovaniya. Motif ne pohozh na MS-Windows i okonnuyu sistemu Macintosh. Po-raznomu predstavlyayutsya primitivnye elementy in- terfejsa, po-raznomu obrabatyvayutsya vneshnie sobytiya, po-raznomu proiszhodit risovanie na ekrane i t.d. Vmeste s tem, po svoej suti okonnaya sreda - prosto ideal'noe pole deyatel'nosti dlya ob容ktnogo programmirovaniya. Dazhe chelove- ku, neiskushennomu v ob容ktno-orientirovannyh metodah proektiro- vaniya, yasno, chto takie veshchi, kak knopki, tekstovye polya, menyu, vpolne zasluzhivayut nazvaniya ob容ktov, kak by eto slovo ni poni- malos'. Inache govorya, vpolne ponyatno, chto takoe "knopka voob- shche", "spisok voobshche" i t.d. Vse eto daet osnovaniya nadeyat'sya, chto s pomoshch'yu ob容ktno-orien- tirovannogo podhoda mozhno poluchit' po-nastoyashchemu vysokourovne- vuyu i perenosimuyu okonnuyu sredu, osnovannuyu na abstraktnyh ti- pah dannyh. Dannaya osobennost' okonnyh sred proyavilas', v chastnosti, v po- yavlenii dovol'no bol'shogo kolichestva razlichnyh klassovyh bibli- otek, "obertyvayushchih" original'nye okonnye sistemy. V kachestve primerov mozhno privesti MFC, OWL, Zink i mnogie drugie. Vot i sredi standartnyh Java-bibliotek prisutstvuet AWT ili Abstract Windowing Toolkit - abstraktnyj okonnyj instrumenta- rij. AWT yavlyaetsya sistemoj klassov dlya podderzhki programmirovaniya v okonnoj srede. Ego "abstraktnost'" proyavlyaetsya v tom, chto vse, zavisyashchee ot konkretnoj platformy, horosho lokalizovano i sprya- tano. V AWT realizovany takie prostye i ponyatnye veshchi, kak knopki, menyu, polya vvoda; prostye i ponyatnye sredstva organiza- cii interfejsa - kontejnery, paneli, menedzhery geometrii. |to horosho vidno na ris. x1. Ris. x1. Osnovnye elementy ierarhii klassov AWT. Vse zavisimosti ot platformy soderzhatsya v vetvi, oboznachennoj kak Peer. Dalee my rassmotrim nekotorye osobennosti AWT, ne pretenduya na polnotu izlozheniya. Nasha cel' - dat' obshchee ppredstavlenie o teh- nologii programmirovaniya graficheskogo okonnogo interfejsa v srede Java.  4.3.2. Iz chego stroitsya graficheskij interfejs (komponenty i kontejnery) Esli posmotret' na lyuboe okonnoe prilozhenie, to legko uvidet', chto interfejsnaya chast' sostoit iz ob容ktov, ob容dinennyh v gruppy. V AWT ob容kty nazyvayutsya komponentami (na samom dele oni vse yavlyayutsya naslednikami klassa Component), a gruppy ob- 容ktov realizovany s pomoshch'yu tak nazyvaemyh kontejnerov. Otme- tim, chto lyuboj kontejner - eto tozhe komponenta, poetomu gruppy ob容ktov mogut byt' vlozheny drug v druga. Kak obychno, menyu sto- yat osobnyakom. Ierarhiya komponent pokazana na ris. x2. (Avtorom etogo i dvuh sleduyushchih risunkov yavlyaetsya Charles L. Perkins, clp@home.HarvardSq.com.) Ris. x2. Ierarhiya komponent AWT Na ris. x3 poyasnyayutsya oboznacheniya, ispol'zovannye na ris. x2. K chislu primitivnyh komponent otnosyatsya: - Button - Checkbox - Label - List - ScrollBar - TextArea - TextField Osnovnye kontejnery: - Dialog - FileDialog - Frame - Panel - Window Vzaimodejstvie interfejsnyh komponent s pol'zovatelem realizo- vano s pomoshch'yu apparata sobytij, o kotorom budet rasskazano ni- zhe.  4.3.3. Kak organizovat' interfejs My uzhe otmechali, chto interfejs sostoit iz komponent, pomeshchennyh v kontejnery. Odnako, ostaetsya otkrytym vopros o tom, kak raz- meshchat' komponenty drug otnositel'no druga vnutri kontejnera. Naivnyj podhod (prinyatyj, tem ne menee, vo mnogih sistemah) zaklyuchaetsya v zadanii otnositel'nyh koordinat komponent v kon- tejnere. Variacii etogo podhoda sostoyat, kak pravilo, v vozmozh- nosti zadavat' razlichnye edinicy dliny (piksely, tysyachnye dyuj- ma, "dialogovye edinicy"). Nedostatkom podobnoj modeli razmeshche- niya komponent yavlyaetsya to, chto pri perevode prilozheniya na dru- guyu platformu i dazhe na drugoj komp'yuter, vneshnij vid prilozhe- niya menyaetsya ploho predskazuemo. AWT staraetsya reshit' dannuyu problemu sleduyushchim obrazom. Esli nel'zya izbezhat' izmenenij vneshnego vida prilozhenij pri zapuske ih na raznyh platformah, nado postarat'sya hotya by sdelat' eti izmeneniya predskazuemymi i v nekotorom smysle estestvennymi. Dlya provedeniya etoj programmy v zhizn' ispol'zuyutsya ob容kty pod obshchim nazvaniem Layout (raspolozhenie). Layout upravlyaet tem, kak komponenty budut raspolagat'sya vnutri kontejnera, sleduya opredelennym principam ili receptam. Vsego v AWT imeetsya 5 predopredelennyh raspolozhenij: - BorderLayout - CardLayout - FlowLayout - GridLayout - GridBagLayout Ih mestopolozhenie v ierarhii klassov pokazano na ris. x4. Ris. x4. Raspolozheniya i ierarhiya klassov AWT. Raspolozheniya yavlyayutsya pryamymi naslednikami klassa Object i vse realizuyut protokol LayoutManager. Ob容kt tipa LayoutManager soderzhitsya v klasse Container. V klasse Container opredeleny 3 metoda add, prednaznachennye dlya dobavleniya novyh komponent v kontejner. Kuda imenno budet do- bavlena komponenta s pomoshch'yu metoda add, zavisit ot konkretnogo tipa LayoutManager dannogo kontejnera. Dlya zadaniya LayoutManager est' metod setLayout. Rassmotrim kratko, kak rabotayut privedennye vyshe shemy razmeshche- niya.  4.3.3.1. BorderLayout BorderLayout delit pryamougol'nyj kontajner na 5 pryamougol'nyh oblastej: sever, yug, zapad, vostok i centr: [Image] Komponenta dobavlyaetsya v sootvetstvuyushchuyu oblast' s pomoshch'yu me- toda add (string, component); Primer. setLayout (new BorderLayout()); buttonN = new Button ("one"); add ("North", buttonN); // ... dobavlenie ostal'nyh knopok  4.3.3.2. CardLayout [Image] Kontejner sostoit iz neskol'kih ploskostej. V kazhdyj moment na- verhu tol'ko odna ploskost'. Takim obrazom, CardLayout preds- tavlyaet soboj kak by bloknot so mnogimi stranicami. Ctranicy pomechayutsya s pomoshch'yu strok. Metod dobavleniya komponent k kontejneru: add (string, component); gde string - imya "stranicy", a component - dobavlyaemaya kompo- nenta. Kak pravilo, eti komponenty sami budut kontejnerami (stranica bloknota vryadli budet sostoyat' iz odnoj bol'shoj knop- ki): setLayout (new CardLayout ()); add ("one", create (new FlowLayout ())); add ("two", create (new BorderLayout ())); add ("three", create (new GridLayout (2, 2))); add ("four", create (new BorderLayout (10, 10))); add ("five", create (new FlowLayout (FlowLayout.LEFT, 10, 10))); add ("six", create (new GridLayout (2, 2, 10, 10)));  4.3.3.3. FlowLayout FlowLayout realizuet model' postrochnogo zapolneniya kontejnera. Posle zapolneniya odnoj stroki nachinaetsya sleduyushchaya. Pri izmene- nii razmerov kontejnera proishodit pereraspredelenie komponent po strokam. [Image] setLayout (new FlowLayout ()); add (new Button ("OK")); add (new Button ("Cancel")); add (new Button ("Resume")); Novye komponenty dobavlyayutsya v kontejner s pomoshch'yu metoda add (component). Ryady komponent mogut byt' vyravneny vpravo, vlevo, ili centri- rovany.  4.3.3.4. GridLayout Kontejner razbivaetsya na kletki. Dlya etogo zadaetsya chislo strok i stolbcov. Pri dobavlenii novyh komponent, kletki zapolnyayutsya po strokam. Vozmozhnost' delat' propuski otsutstvuet. Novye komponenty dobavlyayutsya v kontejner s pomoshch'yu metoda add (component) [Image] Primer. setLayout (new GridLayout (2, 3)); // 2 stroki, 3 stolbca add (new Button ("1")); add (new Button ("2")); add (new Button ("3")); add (new Button ("I")); add (new Button ("II"));  4.3.3.5. GridBagLayout GridBagLayout pozvolyaet razdelit' kontejner na neravnye pryamou- gol'nye oblasti. |to dostigaetsya s pomoshch'yu ob容dineniya sosednih kletok v kletki bol'shego razmera. Krome togo, GridBagLayout pozvolyaet zapolnyat' reshetku s propuskami. Konkretnyj algoritm zapolneniya opredelyaetsya ob容ktom klassa GridBagConstraints. V ob容ktah etogo klassa imeetsya bolee 10 parametrov, opredelyayu- shchih razmeshchenie sleduyushchej komponenty. Programma, ispol'zuyushchaya GridBagConstraints, mozhet vyglyadet' sleduyushchim obrazom: GridBagLayout gridbag = new GridBagLayout (); GridBagConstraints c = new GridBagConstraints (); setLayout (gridbag); // Ustanavlivaem harakteristiki c.fill = GridBagConstraints.BOTH; c.weightx = 1.0; . . . Button button1 = new Button ("1"); gridbag.setConstraints (button1, c); add (button1); . . . // zdes' mozhno izmenit' nekotorye ustanovki // ob容kte klassa GridBagConstraints, // naprimer // c.fill = GridBagConstraints.NONE; Button buttonX= new Button ("X"); gridbag.setConstraints (buttonX, c); add (buttonX);  4.3.4. Sobytiya V AWT, kak i v drugih okonnyh sredah, sobytiya kak programmnye ob容kty sootvetstvuyut vneshnim sobytiyam. Tipichnyj primer - nazha- tie na knopku, v rezul'tate chego v AWT proishodit sobytie ACTION_EVENT. Takim obrazom, interaktivnaya chast' programm v AWT sootvetstvuet modeli programmy, upravlyaemoj sobytiyami. Drugimi slovami, pri- lozheniya ili aplety dolzhny otslezhivat' sobytiya i obrabatyvat' ih. Rassmotrim podrobnee, kak eto proishodit v AWT. Kazhdyj okonnyj interfejs mozhno rassmatrivat' kak nabor (vozmozhno, vlozhennyh drug v druga) komponent. Kogda proishodit sobytie, svyazannoe s kakim-to elementom interfejsa (naprimer, knopkoj), to vyzyvaet- sya metod handleEvent. Po umolchaniyu etot metod nichego ne delaet, a prosto peredaet sobytie naverh, to est' tomu ob容ktu, v koto- rom soderzhitsya iniciator sobytiya (naprimer, ob容mlyushchemu oknu). Takim obrazom, esli sobytie nikto ne perehvatyvaet, ono dosti- gaet frejma (esli eto prilozhenie) ili apleta. |tot bazovaj mehanizm obrabotki sobytij pri naivnom primenenii navyazyvaet programmistu odnu iz dvuh modelej obrabotki sobytij. - Vo-pervyh, mozhno pozvolit' vsem sobytiyam vsplyvat' do samogo verha i uzhe na urovne frejma pisat' metod, kotoryj zanimaetsya razborom i obrabotkoj sobytij. - Vo-vtoryh, mozhno sozdat' mnozhestvo specializirovannyh klas- sov, v kazhdom iz kotoryh pereopredelen metod handleEvent. Oba etih krajnih podhoda nebezuprechny. Pervyj sposobstvuet na- pisaniyu monolitnyh programm, vtoroj privodit k ochen' bol'shomu chislu klassov. V real'noj zhizni ispol'zuetsya kompromissnaya ideologiya - handleEvent pereopredelyaetsya dlya sostavnyh ob容ktov, ob容dinyayu- shchih neskol'ko elementov interfejsa i otvechayushchih za yasno oprede- lennuyu chast' raboty prilozheniya (naprimer, raznogo roda dialo- gi). Krome togo, vozmozhny i drugie modeli obrabotki sobytij, naprav- lennye na luchshee otdelenin logiki programmy ot ee interfejsa. V kachestve odnogo iz primerov realizacii al'ternativnoj modeli mozhno ukazat' paket "The Command Class for AWT objects", koto- ryj napisal Jan Newmarch, jan@ise.canberra.edu.au.  4.3.5. Metody klassa Component, svyazannye s obrabotkoj sobytij Nizhe perechisleny metody klassa Component, svyazannye s obrabot- koj sobytij. - postEvent(). |tot metod, kak pravilo, vyzyvaetsya avtomatiches- ki pri nastuplenii sootvetstvuyushchego sobytiya. - Obrabatyvayutsya sobytiya pri pomoshchi metoda handleEvent(). Po umolchaniyu etot metod, v zavisimosti ot tipa sobytiya, vyzyvaet odin iz specializirovannyh obrabotchikov sobytij, takih kak - - action() - - keyUp() - - mouseDown() - - gotFocus() i t.d. Metod handleEvent() mozhet byt' pereopredelen. V etom sluchae, kak pravilo, vsya obrabotka sootvetstvuyushchego sobytiya budet pro- ishodit' imenno v etom metode, odnako, esli handleEvent() vozv- rashchaet false, to vyzyvaetsya handleEvent() dlya kontejnera, so- derzhashchego dannuyu komponentu. Sobytiya v AWT predstavlyayutsya s pomoshch'yu ob容ktov klassa Event, v kotorom opredeleny sleduyushchie peremennye: public Object target; // iniciator sobytiya public long when; // vremya, kogda sobytie proizoshlo public int id; // tip sobytiya(KEY_PRESS, MOUSE_DOWN...) public int x; // koordinaty public int y; // kursora public int key; // kod klavishi public int modifiers;// kod modifikatora (control, shift ...) public Object arg; // vspomogatel'nye dannye public Event evt; // pole dlya soedineniya sobytij v spiski Privedem tipichnyj primer obrabotki sobytij, kogda vse oni obra- batyvayutsya na verhnem urovne (v dannom sluchae na urovne aple- ta). class MyApplet extends Applet { . . . public boolean action( Event evt, Object arg) { . . . if ((ev.target instanceof Button) && arg.equals ("OK")) { // Vypolnit' sootvetstvuyushchie dejstviya . . . return true; } else { // Drugie sluchai . . . } . . . return false; } . . . } V etom primere, esli iniciator sobytiya imeet tip Button s ime- nem "OK", to vypolnyayutsya sootvetstvuyushchie dejstviya i vozvrashchaet- sya znachenie true, to est' sobytie dal'she ne peredaetsya. Drugoj sposob obrabotat' sobytie zaklyuchaetsya v sozdanii specia- lizirovannoj komponenty. Primer. class OKButton extends Button { . . . public boolean action (Event e, Object arg) { // Vypolnit' sootvetstvuyushchie dejstviya . . . return true; } } My vidim, naskol'ko gluboko produmana v proekte Java svyaz' s operacionnym okruzheniem. Udalos' dostich' udachnogo sochetaniya bo- gatstva vozmozhnostej s perenosimost'yu. 5. Joe - tehnologiya svyazyvaniya Java-programm s ob容ktnymi biznes-prilozheniyami Vyshe, v razdele "Java, Joe i NEO", my pisali o tom, chto novyj produkt kompanii SunSoft - Joe - prizvan osushchestvlyat' svyaz' mezhdu klientskimi komponentami, napisannymi na yazyke Java, i ob容ktnymi serverami prilozhenij, sozdannymi v srede NEO. Pri etom Joe beret na sebya vse (ili pochti vse) tehnicheskie proble- my, svyazannye s rabotoj v raspredelennoj ob容ktnoj srede, obes- pechivaya v to zhe vremya dlya Java-programm polnocennoe vzaimodej- stvie s proizvol'nymi ob容ktnymi servisami. V predydushchih vypuskah Jet Info byla opublikovana shutlivaya "|vo- lyuciya programmista". My dobavim k nej eshche dva razdela. Pervyj iz privodimyh nizhe primerov napisan na yazyke Java i mozhei is- pol'zovat'sya v sostave obychnyh, lokal'no rabotayushchih apletov. 1 import java.awt.Font; 2 import java.awt.Color; 3 public class JAVAhello extends java.applet.Applet { 4 Font f = new Font ("TimesRoman", Font.BOLD, 36); 5 public void init () { 6 resize (150, 25); 7 } 8 public void paint (Graphics g) { 9 g.setFont (f); 10 g.setColor (Color.blue); 11 g.drawString ("Hello, World!", 50, 25); 12 } 13 } Teper' modificiruem programmu dlya Joe, chtoby obespechit' vozmozh- nost' raboty v srede klient/server. 1 import sunw.services.*; 2 import java.awt.Graphics; 3 import java.awt.Font; 4 import java.awt.Color; 5 public class JOEhello extends sunw.services.JOEApplet { 6 sunw.corba.ObjectRef obj; 7 Hello.HelloWorldRef hiThere; 8 Font f = new Font("TimesRoman", Font.BOLD, 36); 9 public void init () { 10 super.init (); 11 resize (150, 25); 12 obj = find ("HelloWorldServer"); 13 hiThere = Hello.HelloWorldStub.narrow (obj); 14 } 15 public void paint (Graphics g) { 16 g.setFont (f); 17 g.setColor (Color.red); // Poluchim stroku iz udalennogo ob容kta, realizovannogo na C++, // i vyvedem ee. 18 g.drawString (hiThere.sayHello (), 50, 25); 19 } 20 } Poyasnim smysl novyh strok, poyavivshihsya vo vtorom variante prog- rammy. V stroke 1 importiruetsya opisanie predostavlyaemyh ob容ktnyh servisov. V stroke 5 ob座avlyaetsya, chto klass Hello budet naslednikom JOEApplet. V stroke 6 deklariruetsya obobshchennaya (ne tipizirovannaya) ssylka na NEO-ob容kt. Ona budet ispol'zovana dlya sohraneniya rezul'tata poiska ob容kta po imeni. V stroke 7 opisana tipizirovannaya ssylka na NEO-ob容kt, kotoraya budet ispol'zovat'sya dlya manipulirovaniya udalennym ob容ktom (v chastnosti, dlya vyzova metodov) sredstvami yazyka Java. V stroke 12 my poluchaem ot sluzhby imen NEO ssylku na nuzhnyj nam servernyj ob容kt. V stroke 13 vypolnyaetsya operaciya privedeniya obobshchennoj ssylki k tipizirovannomu vidu. Nakonec, v stroke 18 vypolnyaetsya vyzov metoda udalennogo ob容k- ta, napisannogo, voobshche govorya, ne na yazyke Java (naprimer, na C++). Vprochem, vid etogo operatora ne zavisit ni ot udalennos- ti, ni ot yazyka realizacii ob容kta. Process razrabotki programm v srede Joe dovol'no prost. On sos- toit iz sleduyushchih etapov: - Translyaciya interfejsa k NEO-ob容ktam, napisannogo na yazyke IDL (Interface Definition Language), v klass na yazyk Java. |tot etap podderzhan vhodyashchim v sostav Joe kompilyatorom IDL - Java. Rezul'tat translyacii soderzhit surrogatnye metody, kotorye vo vzaimodejstvii s brokerom ob容ktov obespechivayut vzaimodejstvie s udalennymi ob容ktami, ne otlichayushcheesya ot lokal'nogo sluchaya. V svoyu ochered', broker ob容ktov, vhodyashchij v sostav Joe, prozrach- nym dlya klientskoj storony obrazom zagruzhaetsya v WWW-navigator vmeste s Java-apletami. - Napisanie klientskogo koda na yazyke Java s ispol'zovaniem sgenerirovannogo interfejsa i sredstv Joe dlya vzaimodejstviya s udalennymi ob容ktami. Dal'she Java-programma kompiliruetsya i vypolnyaetsya obychnym obra- zom. Podcherknem, chto opisannaya ob容ktnaya sreda obespechivaet polno- cennoe, dvustoronnee vzaimodejstvie mezhdu klientom i serverom. V chastnosti, udalennye servernye ob容kty mogut vyzyvat' metody v ob容ktah-klientah. Dlya obespecheniya etoj vozmozhnosti v sostave Joe imeetsya translyator Java-klassov v IDL-interfejsy. 6. Zaklyuchenie Intranet i Java - vot dva klyuchevyh slova, simvoliziruyushchih sov- remennyj etap razvitiya informacionnyh tehnologij. Intranet poz- volyaet peresmotret' podhod k pol'zovaniyu informacionnymi resur- sami, chto v ogromnoj stepeni uvelichivaet proizvoditel'nost' truda otdel'nyh rabotnikov i kompanij v celom. Krome togo, teh- nologiya Intranet pozvolyaet dobit'sya nevidannoj ranee masshtabi- ruemosti - ot lokal'noj seti do Internet. Java snimaet ogranicheniya Web-servisa, delaya poslednij interak- tivnym i ob容ktno-orientirovannym. Java vvodit novyj - absolyut- nyj - standart na perenosimost' programmnogo obespecheniya. Pri- mechatel'no, chto besprecedentnye po svoej moshchi vozmozhnosti vvo- dyatsya pri polnom sohranenii informacionnoj bezopasnosti. V sochetanii s produktami Sun Microsystems - Joe i NEO - Java obespechivaet rasprostranenie koncepcii Intranet na proizvol'nye servisy, chto otkryvaet real'nuyu vozmozhnost' sozdaniya korpora- tivnyh informacionnyh sistem novogo pokoleniya. ------------------ Artur van Hoff poluchil obrazovanie v Gollandii, zatem rabotal v vedushchih evropejskih komp'yuternyh kompaniyah. V techenie treh let, nachinaya s 1993 goda, rabotal v Sun Microsystems. Artur van Hoff prinimal uchastie v razrabotke yazyka Java, v proektirovanii programmnogo interfejsa dlya prilozhenij na Java, im napisan per- vyj Java-kompilyator na yazyke Java. V 1996 godu on i ego kollegi Semi SHajo i Kim Poleze obrazovali nezavisimuyu kompaniyu s namereniem razrabatyvat' programmnoe obespechenie na Java. Artur van Hoff prinimaet aktivnoe uchastie v populyarizacii Java, on uchastvuet v naibolee izvestnyh konferenciyah i yavlyaetsya avto- rom ryada statej i gotovyashchejsya k izdaniyu vesnoj 1996 goda knigi "Hooked on Java". Vopros. Internet, Web i Java predstavlyayut soboj sdvig paradigmy v informacionnyh tehnologiyah. Obshchestvennaya reakciya na etot sdvig ne imeet precendenta v komp'yuternoj industrii - vedushchie kompanii ob座avili o podderzhke Java, na etu temu v komp'yuternoj i delovoj presse bylo opublikovano neveroyatnoe kolichestvo sta- tej, stoimost' akcij teh kompanij, kotorye svyazany s etimi teh- nologiyami, rezko podskochila, tehnicheskie rukovoditeli bankov i krupnyh korporacij podderzhivayut primenenie Java v pilotnyh pro- ektah. V to zhe vremya vse sushchestvuyushchie segodnya prilozheniya etih tehnolo- gij ogranicheny v osnovnom nebol'shimi zadachami, takimi kak mar- keting v Internet, rasprostranenie informacii, Java-igry i t.d. I dazhe predpolagaemye v budushchem prilozheniya ne otlichayutsya radi- kal'noj noviznoj. CHto zhe osobennogo v etih tehnologiyah, chem mozhno na samom dele ob座asnit' te reakciyu i interes, kotorye my mozhem nablyudat' se- godnya? Otvet. Sovreshenno ochevidno, chto Java i Internet predstavlyayut soboj celyj mir novyh vozmozhnostej dlya komp'yuternoj industrii, odnako sushchestvuyushchie segodnya prilozheniya poka ostayusya prostymi, potomu chto eshche net sootvetstvuyushchego opyta v reshenii nekotoryh vnutrennih problem. Tem ne menee, rynok ochen' bystro sdvigaetsya v napravlenii etogo novogo mira, ezhednevno ob座avlyayutsya novye produkty i tehnologii. Imenno eto i svidetel'stvuet o tom, chto Java i Internet predstavlyayut soboj ogromnyj sdvig paradigmy, sozdayushchij novye vozmozhnosti. |to sobytie sravnimo po masshtabu s poyavlenie perosnal'nyh komp'yuterov, no segodnya ono zahvatilo vseh gorazdo bystree. V chem zhe specifika Java i Internet? YA dumayu, chto oni v sostoya- nii obespechit' komp'yuternoj industrii i pol'zovatelyam imenno to, chego te vsegda ozhidali: prostoj dostup k neogranichennym ob- 容mam informacii i prilozhenij. Vopros. Kak lyubaya tehnologiya, Java imeet soyuznikov i opponen- tov. Kto, po Vashemu mneniyu, predstavlyaet naibol'shuyu opasnost' dlya budushchego Java (produkt, kompaniya ili kto-to lichno)? Kakovy mogut byt' otvetnye konkuriruyushchie nachinaniya opponetov Java? Otvet. Naibol'shaya opasnost' sostoit v tom, chto v blizhajshie gody my dolzhny prijti k novoj srede, celikom napisannoj na Java, no s bibliotekami ot raznyh postavshchikov. |to znachit, chto my polu- chim lish' novyj, uluchshennyj yazyk realizacii i nichego bolee. Za- dacha zhe sostoit v tom, chtoby sozdat' obshcheprinyatuyu sredu, ne za- visyashchuyu ot platformy. V to zhe vremya, bylo by glupo s moej storony, buduchi stronnikom Java, delit'sya s moimi opponentami ideyami o tom, kak stroit' ataku na Java, ne tak li? Vopros. Kakim budet vliyanie sdviga komp'yuternoj paradigmy, predstavlennoj Internet, Web i Java, na osnovnyh dejstvuyushchih lic tekushchej pradigmy (IBM, Sun, HP, DEC, Compaq, Oracle i dru- gih)? Otvet. V sovremennyh usloviyah pokupka komp'yutera privodit k po- zhiznennoj neobhodimosti dlya vladel'ca pokupat' programmnoe obespechenie u odnogo postavshchika. |to ne mozhet dlit'sya beskonech- no. Esli vse komp'yutery smogut vypolnyat' lyuboe programnoe obes- pechenie na Java, to zamok, v vide privyazannosti k opredelennoj platforme, budet snyat i takie monopolisty, kak Microsoft, budut vynuzhdeny srazhat'sya na ravnyh s bolee melkimi firmami. Takim obrazom budet vyrovneno igrovoe pole i vozniknet sreda s bol'- shimi vozmozhnostyami dlya konkurencii, a rezul'tatom, v konechnom itoge, budut produkty luchshego kachestva, v bol'shej stepeni ori- entirovannye na potrebitelya. Vopros. Rossiya, naryadu s Kitaem i Indiej, - odna iz stran, ho- rosho izvestnyh vysokim professinal'nym urovnem programmistov. K sozhalaeniyu, rossijskie programmisty opozdali k pervoj volne "garazhnyh komp'yuterov" v nachale 80-h godov. Zatem nastupila po- losa dominirovaniya na rynke bol'shih kompanij, popast' na rynok i dobit'sya kakih-to uspehov stalo prakticheski nevozmozhno. SHiro- ko rasprostraneno mnenie o tom, chto s prihodom Java vozniknet novaya volna "garazhnogo programmirovaniya", i v nej smogut priyat' uchast