Üldteave, võimalused Kursuses Programmeerimine II õpitakse koostama Interneti võimalusi kasutavaid programme, vaadatakse objektorienteeritud programmeerimist ning lahendatakse ülesandeid ja koostatakse programme nagu eelmiselgi semestril. Programmeerimisvõtete õppimiseks kasutatakse keelt nimega Java. Tal on rohkem sisseehitatud võimalusi kui programmeerimise õppimiseks loodud Pascalil, kuid range struktuuri tõttu (mis algul võibolla mõttetunagi tundub) on võimalik tema poolt pakutavas pärast algteabe omandamist juhtmaterjalide abil küllalt kergesti orienteeruda. Kuigi siinne kursus püüab õpetada enam programmeerimist kui keelt (Javat kasutatakse selles kursuses esimest korda), siis sellegipoolest tutvustatakse ka sellele keelele iseloomulikke võimalusi nagu veatöötlus ja ja veebilehekülgede rakendid. Algoritme ja andmestruktuure saab põhjalikumalt õppida sellel (1999 sügis) semestril valikkursusel. Java ajalugu ulatub aastasse 1990, kui teda hakati firma Sun poolt välja töötama. Eesmärgiks oli luua vahend, mille abil saaks töötada paljud uued erinevad protsessorid nii magnetofonides, telefoniaparaatides kui mujal. Seni tuli iga uue protsessoritüübi puhul luua tema jaoks eraldi programmid. Ainult vahel õnnestus teise protsessori programmi emuleerida. Kuna protsessoritel ning nende programmidel olid sageli sees vaid temale spetsiifilised käsud, siis tekkis nende käskude ülekandmisel raskusi. Sooviti luua lihtne baitkood, mida oleks lihtne üle kanda. Nii saaks üldkasutatavaid programme nagu näiteks aja väljastamist kasutada muutmata kujul kõikjal ning vaid masinaspetsiifilised käsud tuleks eraldi luua. Näiteks kerimine magnetofonil ning vee välja laskmine pesumasinal. Kuigi uut baitkoodi on võimalik kirjutada otse või kompileerida vajalike lihtsustuste ja laiendustega selleks teistes kõrgkeeles kirjutatud programme, otsustati luua omaette programmeerimiskeel, mille abil oleks lithsam kasutada uusi võimalusi. Kuna uus keel ei pea ühilduma eelnevatega, siis saab kõrvale jätta aja jooksul ebaotstarbekaks või veaohtlikuks osutunud kohad. Java on suure osa põhikonstruktsioone üle võtnud keelelt C, mistõttu selle keelega tutvunutele võivad Java programmilõigud esialgu tuttavamad tunduda. Keele näiteks järgnevalt üks väike veebilehele paigutatava rakendi kood. import java.awt.Graphics; import java.awt.Color; import java.applet.Applet; public class Tervitus extends Applet{ public void paint(Graphics ekraan){ ekraan.drawString("Tere!", 60, 30); ekraan.setColor(Color.green); ekraan.drawRect(50, 20, 60, 20); } } Käsk import ütleb programmile, kus asub vastav klass, et programm leiaks ta kasutamise ajal üles. Lause import java.awt.Color tähendab lihtsalt, et klass nimega Color asub paketis java.awt ning programm teab teda siis vajaduse korral sealt otsida. See on sarnane Pascali uses-fraasile, kus koodi algusesse "uses graph" kirjutamine lubas joonistamisprotseduure kasutada. Pascalis lihtsalt oli kümmekond moodulit igaühes mõnekümne alamprogrammiga, Java standardpakett sisaldab praegu ligi tuhat klassi, igau"hes paarkümmend meetodit. Nendes orienteerumine aga polegi lootusetu, sest klassid on jaotatud teemade järgi pakettidesse. Neid on standardis kokku praegu umbes 50. Paketis java.awt on näiteks joonistamise ja graafiliste komponentidega (nupud, aknad) seotud klassid. Rida "public class Tervitus extends Applet" tähendab, et klass nimega Tervitus on klassi Applet (rakend) järglane ning teda saab kõikjalt kasutada (public). Pärimisest pikemalt klasside, isendite ja liideste juures, kuid lihtsalt öeldes tähendab eelmine lause seda, et klass Tervitus sisaldab kõike, mis klass Applet, lisaks sellele veel need meetodid, mis on temas juurde või u"le defineeritud. Javas on käsusulgudeks loogelised sulud {} nagu Pascalis begin ja end. Sulge võib teineteise sisse paigutada. Siin näites on klassi Tervitus sulgude sees meetodi paint sulud. Siinses klassis Tervitus on võrreldes klassiga Applet muudetud vaid üks meetod nimega paint. Selle meetodi kutsub rakendikäitur (veebilehel brauser) välja siis, kui pilti on vaja üle joonistada. Näiteks juhul, kui ta tuleb teise akna alt välja. Teiste sõnadega saadab rakendikäitur rakendile ülejoonistamisteate. Meetod paint tahab oma parameetriks saada klassi Graphics (või selle järglase) isendit. Rakendikäitur saadab sellele meetodile sellise isendi, kes on võimeline ekraanile joonistama. Saabuvale Graphics klassi isendile panen nimeks ekraan. Meetodisisene on programmeerija vabal valikul, rakendikäiturile on tähtis vaid, et tüüp oleks sobiv. "ekraan.drawString("Tere!", 60, 30)" joonistab koordinaatidele 60, 30 alates rakendi vasakust ülemisest nurgast sõne Tere!. Isendi või klassi nime ning meetodi nime vahele pannakse punkt, mis näitab, et meetod kuulub tema juurde. Seejärel muudan ekraani joonistusvärvi roheliseks (ekraan.setColor(Color.green)) ning joonistan tekstile ümber ristküliku. Ristküliku esimesed kaks koordinaati tähistavad tema vasaku ülemise nurga asukohta ning järgmised kaks külgede pikkusi. Sama kehtib ka täidetud ristküliku ning ovaali (ringi) kohta. Et saaks loodud programmi töö tulemusi näha, selleks tuleb ta java baitkoodiks kompileerida ning siis java intepretaatorit sisaldava rakendikäituriga vaadata. Standartse java kompilaatori programmi nimi on javac ning klassi Tervitus kompileerimiseks tuleb kirjutada javac Tervitus.java . Kui Pascali kompilaator tegi sellise baidijada (.exe faili), mida sai masinas kohe käivitada, siis java koodi meie masinad otse käivitada ei suuda, temal peab vahel olema intepretaatoriks nimetatav lisaprogramm, mis java platvormi käsud nt. Windowsi operatsioonisüsteemile mõistetavaks tõlgib. Unixi süsteemile sobib sama baitkood, kuid tema jaoks on eraldi intepretaator. Selline kahekordne tõlkimine nõuab enam aega, kuid võimaldab sama programmi lasta tööle erinevatel operatsioonisüsteemidel. Ka näiteks Basicu või Perli programmi saab lasta tõlkida mitme operatsioonisüsteemi intepretaatoril, kuid Javast on nad märgatavalt aeglasemad, sest korralikult optimiseeritud baitkoodi on vastava masina käsustikuks tõlkida tunduvalt kiirem kui programmeerija kirjutatud teksti. Sellegipoolest on Java programm erinevates olukordades ja hinnagutel 20% kuni 20 korda aeglasem Pascalis või C-s kirjutatud ja vastava operatsioonisüsteemi jaoks kompileeritud programmist. Märgatava aja võtab intepretaatori käivitamine, samuti võib lihtsate käskude tõlkimine enam aega võtta kui nende täitmine. Samas aga kasutaja õnneks toimuvad aeganõudvad operatsioonid sageli ajal, kui arvuti muidu nagunii kasutajapoolset teadet (näiteks klahvivajutust) ootaks. Viimistletud tervikoperatsioonid, mille taga kasutaja sageli ootama peab, näiteks akna avamine, võtavad Javas ainult natukene rohkem aega kui operatsioonisüsteemispetsiifilistes programmides. Samuti on sisse viidud "sisemine" kompilaator, mis enne programmi käivitamist tõlgib ta vastavale operatsioonisüsteemile sobivaks masinkoodiks ning nii ei kulu enam töötamise ajal aega interpreteerimisele. Suur osa Java programme aeglustavatest põhjustest oleksid vajalikud muus keeles korralikult kirjutatavasse programmi nagunii sisse kirjutada. Java kompilaator paneb nad lihtsalt automaatselt sisse. Nii tuleb ka muidu kontrollida, et kasutaja sisestatud andmed sobiksid, et programmi kood on õigesti sisse loetud, et mittevajalikud andmed enam mälu ei raiskaks, et programm operatsioonisüsteemile liiga ei teeks. Muidu saab näiteks mälu vabastamise mõnikord välja jätta, lootuses, et ka koos "surnud" andmetega ei ületata programmile eraldatud mälu mahtu ning lastes selle võrra kiiremini töötada, kuid Java kontrollib ikka üle, et kusagil midagi "ripakile" pole jäänud. Ka pole näiteks siinkirjutajal veel kunagi juhtunud, et Java programm kogu operatsioonisüsteemi kinni külmutaks. Nagu eespool kirjas, võttis Java suure osa põhikonstruktsioone üle keelelt C, jättes samas kasutamata vahendid, milleta läbi saab ja mis kirjutamise keerulisemaks või veaohtlikumaks teevad. Välja jäeti "null terminated string", mille vääral kasutamisel võis valedesse mälupiirkondadesse sattuda. Ka pole Javas viita mäluaadressile. Siin pole üldse standardvahenditega võimalik otse masina mäluga tegelda, mis välistab suures osas võimaluse masinale või teistele programmidele kurja teha. Osuti isendile aga annab paljus samad võimalused mis viit. Vaid mäluaadressi asemel on objekti number tabelis. Klassid on nii kirjetüüpide kui objektitüüpide eest. Lihtsalt meetodeid võib kasutaja sinna soovi korral lisada või mitte. Võrguprogrammeerimine pole Java eriomadus, kuid juba tema loomisel on arvestatud võimaluse ja vajadusega luua arvutivõrgus töötavaid programme. Ta abil saab luua nii serveri- kui kliendiprogramme. Saab luua näiteks www serveri brauseritele HTML-lehekülgede saatmiseks kui ka mitme paralleelkasutajatega andmebaasi, jututoa või üle võrgu mängitava mängu. Iseseisvalt arvutis jooksvad programmid suudavad kasutajale pakkuda samasuguseid võimalusi nagu igas muus keeles kirjutatud programmid. Rakendid on mõeldud käivitamiseks teise programmi (näiteks brauseri) sees ning temal on peal turvapiirangud. Rakendeid võib näiteks lasta sirvijal julgelt Internetist kohale laadida ja käivitada, ilma et peaks muretsema, et see kuidagi kohalikule masinale kahju saaks teha. Ta ei tohi trükkida ning ei pääse ka kohalikkudele failidele ligi ega suuda ise midagi kettale kirjutada. Kuna tegemist on suhteliselt uue programmerimiskeelega, siis tema võimalusi täiendatakse pidevalt ja märgatavalt. Algselt 1995.a. paiku avaldatud versioonis oli kuus paketti klasse arvutamiseks, süsteemiga suhtlemiseks ja ekraanil kujutamiseks. Pideva täiendamise tõttu on ettevalmistatud võimaluste arv nelja aastaga peaaegu kümnekordistunud andmebaasiühenduse, komponenttehnoloogia ning laiendatud graafikavõimaluste abil, kuid keele kallal töötatakse ikka veel ning valmimas on lisavahendid kolme mõõtme lihtsamaks kujutamiseks, abiteegid vaegkuuljatele ning vaegnägijatele. Standardpaketi abil on võimalik esialgu mängida vaid ettevalmistatud au-formaadis faile, kuid valmimas on suuremad helivõimalused ja kõnesünteesipakett. Ka töötavad töörühmad Internetitelefoni ning parema kirjasaatmispaketi kallal. Pidevalt kasvades ja arenedes on keelel muidugi oht paisuda suureks ja raskesti haaratavaks, nagu juhtus juhtivaks programmeerimiskeeleks pürginud PL/1 ga ning praegugi on valmis meetodeid ligi kakskümmend tuhat. Kuid nii nagu on igas keeles mõnisada tuhat sõna ja hädapärased jutud suudame ajada vähem kui tuhande sõnaga, ei tasu ka programmeerimiskeele puhul lasta end heidutada suurtest sõnade hulgast ning lihtsamate programmide juures suudame hakkama saada mõne klassi ning mõneteistkümne meetodiga. Kui üldpõhimõtted on selged, saab üksikuid käsklusi alati manuaalist juurde vaadata. Kokkuvõtteks. Sellel semestril käsitletakse Java keele kaudu objektorienteeritud programmeerimist ja võrguprogrammeerimise võimalusi. Java baitkood koosneb lihtsalt erinevatele protsessoritele tõlgitavatest käskudest ning vajab käivitamiseks intepretaatorit. Java programmeerimiskeele loomisel on võetud aluseks keel C (ja C++), püüdes sealsetest kogemustest õppides muuta Java keel kergemini õpitavaks ning vead programmi seest kergemini leitavaks.