JAVA-OHJELMOINTI Osa 1: Ohjelmoinnin perusteita Eero Hyvönen Tietojenkäsittelytieteen laitos Helsingin yliopisto Sisällys Ohjelmoinnin kehityssuuntia Ohjelman kehittäminen Algoritmin käsite Muuttujan käsite Laskennan kulku Ohjelmointi käytännössä Java ohjelmointikielenä Ensimmäinen Java-ohjelma 4.10.1999 E. Hyvönen: Java Osa 1 2 Ohjelmointi 50-60 luvuilla Ohjelmoinnin kehityssuuntia Ohjelmointi ensin konekielellä (biteillä, kytkimillä) Erittäin hidasta, hankalaa ja työlästä Konekielistä symbolisiin assemblerkieliin Lukujen korvaaminen lyhyillä nimillä Esim. kahden kokonaisluvun yhteenlasku: 010000110011101000111101010000010010101101000010 -> LOAD A ADD B STORE C Assebler kielistä lausekieliin (Fortran, Lisp, ) C=A+B tai C:=A+B tai (SETQ C A+B)... Kääntäjä tai tulkki hoitaa muunnoksen konekielelle Koneen ohjauksesta ongelman ratkaisun kuvaamiseen 4.10.1999 E. Hyvönen: Java Osa 1 4 Ohjelmointi 60-70 luvuilla Ohjelmointi 80-90 luvuilla Ohjelmoinnin kriisi Kehitystyön ja ylläpidon vaikeus Jatkuu edelleen: Alan työllisyys turvattu! Ratkaisumalli: rakenteinen ohjelmointi Ongelman ratkonta eri abstraktiotasoilla Ongelman jäsentely lohkoihin ja aliohjelmiin Kurinalainen ohjelmontitapa Esim. Goto-hyppyjen kieltäminen Kriisi jatkuu... Tärkein uusi idea: Olio-ohjelmointi Uusi tapa jäsentää tietorakenteet ja niitä käyttävät proseduurit itsenäisiksi kokonaisuuksiksi Proseduurit hierarkisesti järjestetyn tiedon osana Itsenäisten data-proseduuri-kokonaisuuksien kapselointi Bottom-up ohjelmointi Oliokirjastot Koodin uudelleenkäyttö Laajat ohjelmisto, käyttöliittymät Olio- ja rakenteisen ohjelmoinnin yhdistäminen Eri tekniikat tukevat toisiaan 4.10.1999 E. Hyvönen: Java Osa 1 5 4.10.1999 E. Hyvönen: Java Osa 1 6
Eräitä muita kehityssuuntia Kertausta Funktionaalinen ohjelmointi (Lisp, ) Jäsentely arvoja palauttaviksi funktioiksi ilman sivuvaikutuksia Deklaratiivinen ohjelmointi (Prolog, solvelluskehittimet, ) Ei kuvata ohjelman ratkaisutapaa -- ainoastaan ongelma Ratkaisu(t) löytyvät reunaehtojen avulla automaattisesti Tapahtuma-perustainen ohjelmointi Laskentaa ohjaavat tapahtumat vs. proseduurit Esim. Windows-ohjelmointi WWW-ohjelmointi Lähtökohtana selaimen käyttöliittymä ja etäkäyttö verkon yli Yleensä eri tapoja yhdistellään Lausekielen ja konekielen välinen suhde? Miten eroaa deklaratiivinen ohjelmointikieli proseduraalisesta? 4.10.1999 E. Hyvönen: Java Osa 1 7 4.10.1999 E. Hyvönen: Java Osa 1 8 Ohjelman kehittämisen vaiheet Ohjelman kehittäminen 1. Vaatimusmäärittely (requirements analysis) 2. Suunnittelu (design) 3. Toteutus (implementation) 4. Testaus (testing) Iteratiivinen prosessi T&K hankkeissa usein prototyyppilähestymistapa 4.10.1999 E. Hyvönen: Java Osa 1 10 Ohjelmien kirjoittaminen ja ajaminen Ohjelma kirjoitetaan lausekielellä Lähdekielinen (source) versio, tekstitiedosto Kielestä riippuen lähdekielinen koodi joko käännetään ja linkataan kääntäjällä ajettavaan (konekieliseen) binäärimuotoon tai tulkitaan (interpret) suoraan tulkilla tai muunnetaan symboliselle tulkittavalla välikielelle. Tuloksena oleva objektikoodi (binäärikoodi) voidaan ajaa 4.10.1999 E. Hyvönen: Java Osa 1 11 Virheiden etsiminen ja korjaaminen, ylläpito Kääntäjä/tulkki Ilmoittaa syntaksivirheet Esim. sulut väärin Testaus Löytyy ajonaikaiset virheet ja poikkeukset Esim. nollalla jako, tiedostoa ei voi avata Löytyy loogiset virheet Ohjelma ei toimi niinkuin määriteltiin tai haluttaisiin Virheenetsintä (debug) Jäljitetään ja analysoidaan virheet testeissä Tehdään korjaukset 4.10.1999 E. Hyvönen: Java Osa 1 12
Käännettävät kielet Muuta: Muistivuotojen etsintä Hankalaa monissa kielissä (C, C++,..) Javassa ongelmaa ei ole Profilointi Tehokkuuden pullonkaulojen etsintä Versionhallinta Ohjelmat elävät ja niitä tehdään tiimityönä Tästä syntyy ohjelmankehityssykli vaatimukset-> suunnittelu->toteutus->testaus->vaatimukset-> 4.10.1999 E. Hyvönen: Java Osa 1 13 Perinteinen kielen toteutustapa Esimerkiksi Fortran, Pascal, C, C++ Tuloksena tehokas konekieli (object code) Ongelmia: Käyttäjälle kömpelö erillinen käännösvaihe Hitaus: osittain kääntäminen hankalaa Konekieli voidaan ajaa vain käännösympäristössä Ristiinkääntäjällä voidaan kääntää eri ympäristöihin Epädynaamisuus: Monet päätökset tehdään jo käännöseikä ajovaiheessa Esimerkiksi muuttujien tyypin sitominen 4.10.1999 E. Hyvönen: Java Osa 1 14 Tulkittavat kielet Erillistä käännösvaihetta ei tarvita Ohjelma kehitetään usein tulkin kanssa keskustelemalla Käyttäjälle helpompi kehitystapa Ohjelman kasvattaminen osittain Dynaamisuus: Päätökset ajon aikana Ongelmia: Tulkki hitaampi: muunnos konekieleen ajoaikana Ohjelman ajaminen edellyttää tulkkia loppukäyttäjältä Ohjelmien koko, lisensiointikysymykset Hybridiratkaisu Ohjelman kehitys tulkaten ja lopuksi tehokas käännös 4.10.1999 E. Hyvönen: Java Osa 1 15 Välikieleen kääntäminen Mm. Java:ssa tehty ratkaisu Java-kääntäjä tuottaa välikielisen version (bytecode) Java-tulkki (virtuaalikone) tulkitsee välikieltä Miksi näin? Samaa välikielistä ohjelmaa voi ajaa eri ympäristöissä (Windows, Unix, MacOS, ) Riittää, että käyttäjän koneessa on Java-tulkki Käännettyjen ohjelmien nopeampi ajaminen verkon ylitse (sovelmat, applet) Tietoturva: Tulkki rajoittaa sovelman valtuuksia asiakaspäässä 4.10.1999 E. Hyvönen: Java Osa 1 16 Esimerkki: Java Linuxympäristössä xemacs ohjelma.java Laaditaan ohjelma javac ohjelma.java Käännös välikieleen -> ohjelma.class tiedosto java ohjelma Ajetaan ohjelma.class Java-tulkilla Käytettävissä myös erityisiä Java-ohjelmointiympäristöjä Editointi, kääntäminen, virheenetsintä ym. integroitu Kertausta Luettele ohjelmankehityksen eri vaiheet. Mitä virhetyyppeja ohjelmoinnissa esiintyy? Tulkitsemisen ja kääntämisen edut/haitat? Miksi Javassa käytetään välikieltä? 4.10.1999 E. Hyvönen: Java Osa 1 17 4.10.1999 E. Hyvönen: Java Osa 1 18
Algoritmin idea Algoritmin käsite Toimenpidesarja, joka suorittaa halutun toiminnan äärellisellä määrällä askeleita. Algoritmilla on aina tila: alkutilaa muuttamalla päästään lopputilaan Tilaa muutetaan toimenpidesarjalla (operation) Esimerkki: Ruokareseptit ovat algoritmeja Alkutilana tyhjä puhdas kulho ja ainekset tms. Tilana on valmistettava ruoka Lopputilana valmis ruoka tms. Operaatioina suolan lisäys, sekoittaminen yms. toimenpiteet 4.10.1999 E. Hyvönen: Java Osa 1 20 Algoritmien tutkimusalueita Nimi tulee 800-luvun persialaisesta matemaatikosta abu-jafar Mohammed ibn Musa al-khuwarizmi Samaa juurta kuin algebra -sana 4.10.1999 E. Hyvönen: Java Osa 1 21 Laskennan teoria Laskennan rajat, vaativuusluokat Algoritmien analyysi (algorithm analysis) Aika- ja tilakompleksisuuden muodot Worst-case, average case Keskeistä tietojenkäsittelytieteen aluetta Esimerkiksi puhelinnumeron etsiminen luettelosta Algoritmien oikeaksi todistaminen (proving, verification) Vaikeaa formaalisti Validiointi (validation) testaamalla helpompaa 4.10.1999 E. Hyvönen: Java Osa 1 22 Automaattinen ohjelmointi Ohjelmien syntetisointi kuvauksista Eri sovellusalueiden algoritmit Muuttujan käsite 4.10.1999 E. Hyvönen: Java Osa 1 23
Muuttujan idea Muuttuja (variable) on nimi, jolla on arvo. Arvo asetetaan sijoitusoperaatiolla (assignment): x = 5, vastaus = "Kyllä", data = new Alkio( ) Sijoitusoperaatio korvaa muuttujan aiemman arvon uudella Sijoitus on eri asia kuin vertailu matematiikassa x=x+2 Javassa: a+b = b+a = = = Olisi matemaattinen epätosi Universaali kaava kaikilla arvoilla Toimii sijoitusoperaationa Toimii yhtäsuuruuden vertailuna 4.10.1999 E. Hyvönen: Java Osa 1 25 Muuttujan tyypitys Lisäksi muuttujilla on tyyppi (type) Tietyn tyyppinen muuttuja voi saada vain samaa tyyppiä olevia arvoja. Vahvasti tyypitetyissä kielissä tyyppi pitää ilmoittaa etukäteen koodissa, eikä se voi muuttua ajon aikana. Heikosti tyypitetyissa kielissä muuttujan tyyppiä ei ole sidottu vaan määräytyy ajon aikana. 4.10.1999 E. Hyvönen: Java Osa 1 26 Tyypit Javassa Vahvan tyypityksen etuja tehokas koodi virheiden automaattinen tunnistus Heikon tyypityksen etuja koodi napakampaa, helpompi muuttaa dynaamisempi toiminta Java on vahvasti tyypitetty Muuttujat esiteltävä tyyppeineen ennen käyttöä int kokluku; String vastaus; Käyttäjä luo uusia omia tyyppejään (luokat) Olioajattelu antaa joustoa Käsitteellisesti yleisemmän tyypin muuttujalla voi olla alemman tyypin arvoja. 4.10.1999 E. Hyvönen: Java Osa 1 27 4.10.1999 E. Hyvönen: Java Osa 1 28 Algoritmien perusrakenteita Laskennan kulku Sijoituslauseet Arvojen asettaminen muuttujalle tai muulle tiedolle Arvolausekkeet Arvojen ilmaisumuodot, esim. aritmeettiset lausekkeet Loogista testiä edustavat lausekkeet (true/false) Käytetään mm. ohjauslauseissa Ohjauslauseet Peräkkäisyys: toimenpiteet suoritetaan annetussa järjestyksessä Ehdollisuus: eri toimintojen valinta testin perusteella Toisto: toistetaan joukko toimenpiteitä (jollain lopetusehdolla) Hierarkisuus: alialgoritmien kutsuminen Syöttö- ja tulostusoperaatiot 4.10.1999 E. Hyvönen: Java Osa 1 30
Esimerkkejä lue(x); // Peräkkäisyys lue(y); // Alialgoritmi, jossa luetaan z=x+y; kirjoita("tulos on: "); kirjoita(z); lue(x); // Ehdollisuus if (x==7) kirjoita("on seitsemän"); else kirjoita("ei ole seitsemän"); 4.10.1999 E. Hyvönen: Java Osa 1 31 x=50; while ( x<100) { // Toisto lopetusehdolla kirjoita(x*x); x=x-1; } 4.10.1999 E. Hyvönen: Java Osa 1 32 Kertausta Perusoperaatiotyypit löytyvät muodossa tai toisessa kaikista ohjelmointikielistä. Algoritmit voidaan kirjoittaa ohjelmointikieliriippumattomasti pseudokielellä. Algoritmi on yleinen laskennan/toiminnan abstraktio. Edellä olevaa kummempaa välineistöä ei tarvita (vähemmälläkin tullaan toimeen)! Kaikki ylipäätään mekanisoitavissa olevat toiminnat voidaan kuvata. 4.10.1999 E. Hyvönen: Java Osa 1 33 Luettele algoritmin perusrakenteita. 4.10.1999 E. Hyvönen: Java Osa 1 34 Reaalimaailman ohjelmat Ohjelmointi käytännössä Suuri määrä muuttujia Vain osa niistä olennaisia kulloinkin Tarvitaan mekanismeja muuttujien näkyvyyden säätelyyn Suuri määrä askeleita (jopa kymmeniä miljoonia) Kompleksisimpia ihmiskunnan aikaansaannoksia Toimenpiteet pitää jäsentää mielekkään kokoisiksi kokonaisuuksiksi Kokonaisuuden mahduttava näyttöön, lyhyys kaunistaa Ongelmien abstrahointi, osittaminen, kapselointi: ratkaiseminen eri tasoissa osissa Stepwise refinement, top-dopwn, structured programming Lohkot, aliohjelmat, oliot Koodin lyhyys, jäsentely ymmärrettäväksi 4.10.1999 E. Hyvönen: Java Osa 1 36
Ohjelmistotuotanto Pyrimys teollistyyppiseen ohjelmointiin Kurinalaisuus, "ohjelmistotehdas"-ajattelu Valmistus aiemmista raaka-aineista Menetelmät soveltuvat parhaiten Toistensa kaltaisten ohjelmistojen kehittämiseen Esim. eri kännykkämallien ohjelmistoversiot Ohjelmointi on kuitenkin usein käsityötä Uniikkitavaran valmistusta Aina ei edes tarkkaan tiedetä millainen tuloksen pitäisi olla Ohjelmointi on enemmän taidetta kuin tiedettä Mutta näköistaidetta! Java ohjelmointikielenä 4.10.1999 E. Hyvönen: Java Osa 1 37 Java-kielen lähtökohtia Olio-keskeisyys Tiedon ja proseduurien moderni jäsentely Filosofinen perusta: systemaattinen olio-ajattelu Ympäristöriippumattomuus Sama ohjelma pitää voida ajaa kaikkialla Kieli Internet/Intranet-ympäristöön Ohjelman suoritus verkon kautta Tietoturvaongelmien hallinta Miten uskaltaisin käynnistää tuntemattoman ohjelman koneessani? 4.10.1999 E. Hyvönen: Java Osa 1 39 Historiaa Aluksi Oak-kieli sulautettuihin järjestelmiin 90-luvun alussa Sitten siirto Internet-ympäristöön Java-nimisenä Julkistus 1996 Pääkehittäjänä James Gosling (SUN Microsystems) Kaupallisen yrityksen vapaa standardi Otettu laajaan käyttöön erittäin nopeasti Uusin versio 1.2.2, "Java 2 SDK" versio 1.1 kurssin oppikirjoissa perusasiat eivät ole muuttuneet 4.10.1999 E. Hyvönen: Java Osa 1 40 Javan perusominaisuuksia Syntaksi peräisin C ja C++ kielistä Helppo omaksua nämä jo tunteville Pieni mutta ilmaisuvoimainen kieli Vähän varattuja sanoja ja muotoja Laajentuu oliokirjastojen avulla Laaja tarjonta eri tehtäviä/sovelluksia varten Laaja hajautettu kehittäjien verkosto Vahva tyypitys Unicode merkkijärjestelmä Tukee useimpia maailman kieliä 4.10.1999 E. Hyvönen: Java Osa 1 41 Poikkeusten käsittely (exceptions) Virhetilanteista hallittu toipuminen Rinnakkaisohjelmointi (threads) Eri tehtävien näennäisesti samanaikainen suorittaminen Automaattinen muistinhallinta Varattu muisti vapatuu ilman eri ohjelmointia, kun muistia ei enää tarvita Käännös Bytecode-välikielelle Tulkitaan virtuaalikoneella eri ajoympäristöissä 4.10.1999 E. Hyvönen: Java Osa 1 42
Kertausta Sovellusohjelmatyypit Tavallinen ohjelma, joka ajetaan omassa koneessa Sovelma, applet, joka ajetaan WWW:n kautta asiakaspäässä Servletti, joka ajetaan WWW:n kautta palvelinpäässä Tietoturvallisuuden takaaminen Sovelma ei pääse käsiksi asiakaskoneen tiedostoihin. Sovelma voi ottaa yhteyden vain kutsujaansa. Pointer-tietotyyppi puuttuu: muisti on suojattu. Luettele Javan ominaispiirteitä. Minkälaisia ohjelmatyyppejä asiakaspalvelinympäristössä Javalla voi tehdä? 4.10.1999 E. Hyvönen: Java Osa 1 43 4.10.1999 E. Hyvönen: Java Osa 1 44 Hoi maailma - ohjelma Ensimmäinen Java-ohjelma class Hoi { public static void main(string[] args) { System.out.println("Hoi maailma!"); } } class Hoi { } Hoi luokan määrittely. Lähes kaikki Java-koodi kirjoitetaan jonkin luokkamäärittelyn sisään. 4.10.1999 E. Hyvönen: Java Osa 1 46 Hoi maailma -ajo public static void main(string[] args) { } Pääohjelma On oltava joissain luokassa. Pääohjelma on eräs metodi. Javassa algoritmit toteutetaan metodeilla. System.out.println("Hoi maailma!"); Tulostaa päätteelle viestin (ja rivinvaihdon). javac Hoi.java Kännetään tiedosto välikielelle. Kääntäjä osoittaa mahdolliset virheet. Jos ei virheilmoituksi, muodostuu Hoi.class -tiedosto. java Hoi Ajetaan ohjelma: Tulostuu "Hoi maailma!" Huom. "java Hoi.class" aiheuttaisi virheilmoituksen! 4.10.1999 E. Hyvönen: Java Osa 1 47 4.10.1999 E. Hyvönen: Java Osa 1 48
Kertausta Mitä tekevät seuraavat komennot java koe java koe.java java koe.class javac koe javac koe.java javac koe.class Lisätietoja Arto Wikla: Ohjelmoinnin perusteet Java-kielellä, OtaDATA, 1998. John Lewis, William Loftus: Java Software Solutions, Addison-Wesley, 1998. 4.10.1999 E. Hyvönen: Java Osa 1 49 4.10.1999 E. Hyvönen: Java Osa 1 50