Ohjelmointikielten periaatteet Syksy Antti-Juhani Kaijanaho

Koko: px
Aloita esitys sivulta:

Download "Ohjelmointikielten periaatteet Syksy Antti-Juhani Kaijanaho"

Transkriptio

1 Ohjelmointikielten periaatteet Syksy 2004 Antti-Juhani Kaijanaho

2 Copyright c 2002, 2004 Antti-Juhani Kaijanaho Tästä teoksesta saa valmistaa kappaleita ja sen saa saattaa yleisön saataviin, muuttamattomana tai muutettuna, käännöksenä tai muunnelmana, toisessa kirjallisuus- tai taidelajissa taikka toista tekotapaa käyttäen, mikäli kaikki seuraavat ehdot tulevat täytetyksi: (1) Kun teoksesta valmistetaan muutettu kappale tai muutettu teos kokonaan tai osittain saatetaan yleisön saataviin, on teoksen muuttajan nimi, salanimi tai nimimerkki ilmoitettava tekijän nimen rinnalla. (2) Kun teoksesta valmistetaan muutettu kappale tai muutettu teos kokonaan tai osittain saatetaan yleisön saataviin, on pidettävä huoli, ettei muutettua teosta voi hyvällä tahdolla sekoittaa alkuperäiseen. (3) Teoksen tekijän nimeä ei saa ilman hänen eri lupaansa käyttää teoksen markkinoinnissa. Erikseen korostettakoon, että teoksen tekijä ei vaadi maksua teoskappaleiden valmistamisesta tai teoksen saattamisesta yleisön saataviin. Teoskappaleen valmistaja tai teoksen yleisön saataviin saattaja saa periä tästä haluamansa maksun. Tekijänoikeuslaki (404/1961) 3 1 mom: Kun teoksesta valmistetaan kappale tai teos kokonaan tai osittain saatetaan yleisön saataviin, on tekijä ilmoitettava sillä tavoin kuin hyvä tapa vaatii.

3 Sisältö Esipuhe v Luku 1. Johdanto 1 1. Kielten jaotteluja 1 2. Kielen valinta 6 3. Ohjelmointikielten suunnitteluperiaatteita 7 4. Kielen määrittely 8 5. Toteutustekniikoista 10 Luku 2. Konekielinen ohjelmointi Konekielet Symboliset konekielet Abstraktit koneet Neloskielen idea Systeemikutsut Konekielellä ohjelmoinnista 22 Luku 3. Suoraviivaohjelmat Suoraviivaohjelman elementit Abstrakti syntaksi Denotationaalinen semantiikka Tyyppijärjestelmä Konkreetti kielioppi Toteutuksesta 55 Luku 4. Paikallinen kontrollivuon ohjaus Kontrollivuo ja kontrollinohjaus Testit Valintalauseet Toistolauseet eli silmukat Vahtikomennot Väitteet 73 Luku 5. Aliohjelmat Kutsusekvenssit Parametrinvälitysmekanismit Staattinen ja dynaaminen vaikutusalue Aktivaatiotietue Vuorottaisrutiinit 82 iii

4 iv SISÄLTÖ 6. Ohjelmointi laskentana 82 Luku 6. Samanaikaisuus Jaettu muisti Erilliset kommunikoivat prosessit 83 Luku 7. Rakenteiset arvot 85 Luku 8. Abstraktit tietorakenteet ja modulit 87 Luku 9. Olioabstraktio 89 Luku 10. Polymorfismi 91 Kirjallisuutta 93 Liite A. Neloskoneen systeemikutsut 95 Liite B. Ohjelmointikielten historia Kaksi ensimmäistä sukupolvea: ennen vuotta Automaattinen ohjelmointi ja ohjelmointikielten synty: Baabelin torni: 1960-luku Modernismi: 1970-luku Postmodernismi: 1980-luku Internetin nousu: 1990-luku Sukupolvista 106 Liite C. Semanttiset alueet Tuloalueet Summa-alueet Funktioalueet 111 Liite D. ALKEIS-suoran kääntäjä Pääohjelma Selain Apuluokat Lauseet Tyypit Lausekkeen jäsennin Primäärilausekkeet Operaattorilausekkeet Muunnoslausekkeet 157

5

6 LUKU 4 Paikallinen kontrollivuon ohjaus Edellisessä luvussa esiteltiin imperatiivisen ohjelmointikielen perusrakenne suoraviivaohjelman mallia noudattaen. Luvussa rakennetun ALKEIS-suoran pahin puute on, että sillä ei pysty tekemään kummoisempia ohjelmia: valintojen tekeminen on mahdotonta, ja samoin on mahdotonta suorittaa mitään vaihtuvan monta kertaa. Tässä luvussa pohditaan mahdollisia laajennuksia ALKEIS-suoraan, jotka korjaavat tämän puutteen. Tuloksena syntyvät ALKEIS-jos, AL- KEIS-silmukka ja ALKEIS-vahti. 1. Kontrollivuo ja kontrollinohjaus Useimmat nykykielet ovat luonteeltaan peräkkäistäviä (engl. sequential): ohjelmatekstissä mainitut tehtävät tehdään yksi kerrallaan toinen toisensa jälkeen. Sitä järjestystä, jossa tehtävät tehdään jollakin tietyllä suorituskerralla, sanotaan kontrollivuoksi (engl. control flow). Sillä tarkoitetaan toisinaan myös sitä, missä kaikissa järjestyksissä asiat voidaan tehdä, kun tarkastellaan kaikkia mahdollisia suorituskertoja. Sekaannuksen välttämiseksi ensimmäistä merkitystä kutsutaan tässä monisteessa dynaamiseksi kontrollivuoksi tai lyhyesti kontrolliksi ja jälkimmäistä staattiseksi kontrollivuoksi. Kääntäjät tekevät usein laajoja staattisen kontrollivuon analyysejä optimointiensa tueksi ja myös tiettyjen merkitysopillisten ongelmien (mm. käyttämättömät muuttujat) tunnistamiseksi. Jotkin kielet tukevat yhtäaikaisuutta (engl. concurrency), jolloin ohjelmassa on useita rinnakkaisia dynaamisia kontrollivoita. Tällöinkin ohjelmalla on vain yksi staattinen kontrollivuo, joka kuvaa yhteisesti ohjelman kaikkien suorituskertojen kaikkia dynaamisia kontrollivoita. Jokaisessa ohjelmointikielessä on konstruktioita, joiden tehtävänä on ohjata dynaamisen kontrollivuon kulkua. Tässä monisteessa kutsutaan näitä konstruktioita kontrollia ohjaaviksi (tälle ei ole tietääkseni englanninkielistä termiä) ja näiden konstruktioiden käyttöä kontrollinohjaukseksi. Suoritusaikana on kullakin hetkellä kaksi merkittävää tietoa: missä nyt ollaan ja minne seuraavaksi mennään. Jälkimmäistä sanotaan jatkeeksi (engl. continuation). Koko staattinen kontrollivuo voidaan mallittaa kertomalla, mitä missäkin ohjelman paikassa tehdään ja mikä on siinä jatke. 59

7 60 4. PAIKALLINEN KONTROLLIVUON OHJAUS Käskykielten merkittävin kontrollia ohjaava konstruktio unohtuu helposti, sillä se on pääasiassa piilossa. Tarkoitan tässä jo edellisessä luvussa tutuksi tullutta peräkkäistämistä (engl. sequencing), joka ottaa kaksi lausetta järjestyksessä. Kun kontrolli tulee peräkkäistyskonstruktioon (mukanaan jatke ilmaisemassa, mitä normaalitilanteessa pitäisi tehdä tämän konstruktion jälkeen), se antaa jälkimmäiselle osalauseelle jatkeeksi oman jatkeensa ja antaa ensimmäiselle jatkeeksi tuon yhdistelmän. Tälle yhdistelmälle, joka koostuu ensimmäisestä osalauseesta, jonka jatke on toinen osalause, jonka jatkeena on koko konstruktion jatke, konstruktio antaa kontrollin. Toisin sanoen se suorittaa ensin ensimmäisen lauseen ja sitten toisen lauseen. Abstraktissa kieliopissa peräkkäistystä merkitään yleensä lauseiden väliin sijoitetulla puolipisteellä. Aikoinaan ohjelmointikielten näkyvin tärkein kontrollia ohjaava konstruktio oli go to -lause. Se oli pesiytynyt kieliin symbolisten konekielten hyppykäskyistä. Go to ohjasi kontrollin (usein numerolla) nimettyyn paikkaan ohjelmassa. Sen lisäksi käytettiin lähinnä haarautuvaa if-lausetta, joka valitsee lausekkeen arvon perusteella, kumpi sen osalauseista suoritetaan. Tuloksena on vaikeasti ymmärrettävää ohjelmakoodia, ns. spagettikoodia luvulla muotia oli rakenteinen ohjelmointi (structured programming), Se oli reaktio spagettikoodia vastaan lääkkeinä nähtiin ylhäältä alas (engl. top-down) -suunnittelu, koodin modularisointi, rakenteiset tyypit, muuttujien selkeä nimeäminen ja laaja kommentointi. Rakenteisen ohjelmoinnin liikkeen yhtenä osana kampanjoitiin Dijkstra [9] etunenässä go to -lauseen hävittämisen puolesta (mutta myös kompromisseja etsittiin [22]). Nykyisin näyttää siltä, että go to on vähintäänkin uhanalainen laji: Java varaa sen avainsanaksi vain siksi, että kääntäjät voisivat antaa parempia virheilmoituksia... Toisaalta niissäkin kielissä, jotka eivät go to -nimistä lausetta sisällä, on sen tapaisia lauseita kuitenkin eri nimillä (Javan break on varsin voimakas heikennetty versio go to -lauseesta; Schemen call-with-current-continuation on sekin hieman rajoitettu mutta erittäin voimakas versio go to -lauseesta). Rakenteisen ohjelmoinnin myötä go to -lauseen tilalle on vakiintunut joukko lohkorakenteisia kontrollia ohjaavia konstruktioita. Jokin for-lauseen muunnelma löytyy kaikista käskykielistä. Samoin kielissä on jokin while-lauseen muunnelma sekä täysin haarautuva if... else-lause. 2. Testit Kontrollivuon ohjaus perustuu siihen, että ohjelma pystyy havainnoimaan omaa tilaansa ja tekemään sen perusteella päätöksiä. Tämän perustana on testit:

8 2. TESTIT 61 Kokonaislukutyyppisten ja liukulukutyyppisten lausekkeiden arvojen vertailu (pienempi-kuin, suurempi-kuin, yhtäsuurikuin ym.). Taulukoiden vertailu alkioittain. Koosteiset testit, jotka muodostuvat useista testeistä, jotka on yhdistetty loogisin operaattorein. Testit esitetään abstraktissa syntaksissa yleensä lausekkeina. Tätä varten pitää lisätä yksi uusi tyyppi, totuusarvotyyppi (engl. truth value type), yleensä nimeltään boolean. Tässä tyypissä on kaksi arvoa, tosi ja epätosi, jotka syntaksissa esitetään tavallisesti avainsanoina: τ ::=... boolean totuusarvotyyppi ε ::=... lauseke voi olla myös... true false... totuusvakio ε 1 = ε 2... yhtäsuuruusvertailu ε 1 ε 2... erisuuruusvertailu ε 1 < ε 2... pienempi kuin -vertailu ε 1 ε 2... pienempi kuin tai yhtäsuuri -vertailu ε 1 > ε 2... suurempi kuin -vertailu ε 1 ε 2... suurempi kuin tai yhtäsuuri -vertailu ε... looginen negaatio ε 1 ε 2... konjunktio ε 1 ε 2... disjunktio ε 1 ε 2... implikaatio ε 1 ε 2... ekvivalenssi Tavallisesti loogiset operaattorit, ja ovat oikosuljettuja (engl. shortcircuited), jolloin oikean operandin arvo lasketaan vain, jos koko lausekkeen arvo ei ole selvä jo pelkän vasemman oprandin arvon perusteella. Tämän järjestelyn etuna on, että testeissä voidaan testata jotain sellaista asiaa, joiden laskeminen on jo virhe, kunhan vain ensin samassa testissä rajataan pois tilanteet, joissa tällaiset virheet syntyvät. Esimerkiksi taulukon indeksointi testissä voidaan tehdä, vaikka vasta aiemmin samassa testilausekkeessa on tarkistettu, että indeksi on sallittu. TEHTÄVÄ 4.1. Lisää testit ALKEIS-suoran denotationaaliseen semantiikkaan ja tyyppijärjestelmään. TEHTÄVÄ 4.2. Lisää testit ALKEIS-suoran konkreettiin kielioppiin. Kiinnitä huomiota järkevien presedenssien asettamiseen (perustele valintasi).

9 62 4. PAIKALLINEN KONTROLLIVUON OHJAUS Mitä tarkoittaa kaava 2 < 3 < 4? Saisitko rakennettua kielen niin, että se tarkoittaa sitä mitä se matematiikassa tarkoittaa? 3. Valintalauseet Ohjelmoinnissa on kaksi pääasiallista valintatilannetta: suoritettava lause pitää valita joko jonkin testin totuusarvon mukaan tai sitten jonkin toisen lausekkeen arvon mukaan. Toki jälkimmäinen riittäisi yksin, sillä edellinen on sen erityistapaus, mutta edellinen on niin tärkeä erityistapaus, että sille on oma konstruktionsa. If-lauseen semantiikka on kaikille tuttu: selvitetään annetun testin totuusarvo if-lauseen kohdalla ja sitten suoritetaan jompi kumpi annetusta vaihtoehtoisesta lauseesta. Sen abstrakti syntaksi on myös simppeli: γ ::= if ɛ then γ 1 else γ 2 Toteutuksessakaan ei ole juuri yllätyksiä. If-lauseen ainoa kiinnostusta herättävä piirre on sen konkreetti syntaksi. Aivan vanhimmissa kielissä if-lauseen then- ja else-osassa sai olla enintään yksi lause kummassakin; tällöin yhtään monimutkaisempien rakenteiden ilmaisemisessa tarvittiin konekielisestä ohjelmoinnista tuttu goto-lause. Siitä ei kuitenkaan pidetä korkean tason ohjelmoinnissa 1, joten moderneissa ohjelmointikielissä if-lauseen then- ja else-lause voivat olla mielivaltaisen monimutkaisia, yleensä lohkoja. Tyypillinen konkreetti syntaksi on Pascalin käyttämän tyyppinen if x 0 then if x < 0 then writeln("negatiivinen") else writeln("nolla") else writeln("positiivinen") tai C:n tyylinen: if (x 0) if (x < 0) puts("negatiivinen\n"); else puts("nolla\n"); else puts("positiivinen\n"); Jos kumpi tahansa näistä kirjoitetaan ilmiselvällä tavalla konkreetiksi kieliopiksi ja else-osan pois jättäminen sallituaan, kuten on tapana esimerkiksi 1 Ks. esim. Dijkstran kommentti [9] sekä Knuthin sovitteleva artikkeli [22].

10 3. VALINTALAUSEET 63 statement: if ( expression ) statement if ( expression ) statement else statement niin tällainen konkreetti kielioppi on moniselitteinen: kumpaan if-lauseeeseen else-osa liittyy lauseessa if (x >= 0) if (x == 0) printf("1"); else printf("0");, eli tulostaako se 0 silloin kun x on negatiivinen vai silloin kun se on positiivinen? Tätä ongelmaa sanotaan orvoksi elseksi (engl. dangling else), ja siihen on useita ratkaisuja: Orvon elsen ongelma juontuu siitä, että if-lauseen loppu ei ole yksikäsitteisesti määrätty. Tämä voidaan korjata niin, että lisätään if-lauseen loppuun jokin lopetusavainsana; tyypillisiä ovat endif, end if ja fi (if väärin päin). Näin toimivat esimerkiksi Bourne Shell ja Algolit. Edellisen ratkaisun tyyliin voidaan tehdä myös niin, että thenlauseen tai jopa myös else-lauseen pitää olla lohko. Tällöin ei myöskään jää epäselväksi, mihin if-lause päättyy. Näin toimii esimerkiksi Perl. Vielä yksi edellisten muunnelma on ilmaista ohjelman lohkorakenne sisennyksillä niin, että sisennyksillä on semanttista merkitystä. Tämän seurauksena kieliopin näkökulmasta jokainen then- ja else-lause on lohko, joten ratkaisu on sukua edelliselle ratkaisulle. Näin toimivat esimerkiksi Python ja Haskell. Yleisin ratkaisu lienee kuitenkin julistaa, että if-else-parit löydetään etsimällä ensin sisimmälle if-lauseelle sitä tekstuaalisesti lähinnä oleva else ja sitten toiseksi sisimmälle if-lauseelle sitä tekstuaalisesti lähinnä oleva vielä käyttämätön else jne. Tämä vastaa sitä, mitä ohjelmoijat yleensä tarkoittavat. TEHTÄVÄ 4.3. Kirjoita denotationaalinen semantiikka if-lauseelle. ALKEIS-suora varustettuna testeillä ja if-lauseella on ALKEIS-jos. TEHTÄVÄ 4.4. Suunnittele ja speksaa (abstrakti ja konkreetti syntaksi sekä denotationaalinen semantiikka ja tyypitys) ALKEIS-josiin case-lause matkien C-sukuisten kielten switch-case-lausetta. Älä kuitenkaan matki sitä niin tarkasti, että toistaisit näiden kielten mokaa: break-lauseen vaatiminen useimpien haarojen loppuun on erittäin virhealtista. Case-lauseen speksaaminen jätettiin harjoitustehtäväksi, koska se on tuttu eikä sen speksissä ole juuri yllätyksiä. Sen sijaan sen toteuttamiseen liittyy muutama asia, jotka on syytä mainita. Tässä oletetaan, että case toimii vain lukutyyppisillä lausekkeilla. Jos caselauseen haarojen arvot ovat lähellä toisiaan, kannattaa kääntäjän käyttää hyppytaulukkoa, joka koostuu hyppykäskyistä, ja sopivaan hyppykäskyyn hypätään case-lauseen lausekkeen arvon perusteella. Seuraavassa listauksessa on käytetty tätä tekniikkaa:

11 64 4. PAIKALLINEN KONTROLLIVUON OHJAUS 1 ; A hand compilation of the following ALKEIS style code 2 ; using a jump table: 3 ; var 4 ; a : unsigned byte; 5 ; begin 6 ; read a; 7 ; case a 8 ; 1 : write 1 ; 9 ; 2 : write 2 ; 10 ; 3 : write 3 ; 11 ; esac 12 ; end tmp: zero 15 zero 16 a: zero 17 ; read a 18 SP < SP [SP+0] < 0 ; stdin 20 [SP+4] < a ; buffer 21 [SP+8] < 1 ; buffer length 22 syscall 3 ; SYS_READ 23 if [SP+0] = 0 goto fail 24 SP < SP ; case a 1: write 1 ; 2: write 2 ; 3: write 3 ; esac 26 if [a] < 49 goto fail (B) ; 49 = 1 27 if [a] > 51 goto fail (B) ; 51 = 3 28 [tmp] < 0 29 [tmp] < [a] 49 (B) 30 [ tmp] < [tmp] 16 ; 16 bytes for an instruction 31 [tmp] < [tmp] + jumptable 32 goto [ tmp] 33 jumptable: noinstr 34 goto case_1 35 goto case_2 36 goto case_3 37 case_1: noinstr 38 ; write 1 39 AR < tmp 40 [AR+0] < 49 (B) ; 1 41 [AR+1] < 10 (B) ; line feed 42 SP < SP 12

12 3. VALINTALAUSEET [SP+0] < 1 ; stdout 44 [SP+4] < tmp ; buffer 45 [SP+8] < 2 ; buffer length 46 syscall 4 ; SYS_WRITE 47 SP < SP + 4 ; ignore errors 48 goto exit 49 case_2: noinstr 50 ; write 2 51 AR < tmp 52 [AR+0] < 50 (B) ; 2 53 [AR+1] < 10 (B) ; line feed 54 SP < SP [SP+0] < 1 ; stdout 56 [SP+4] < tmp ; buffer 57 [SP+8] < 2 ; buffer length 58 syscall 4 ; SYS_WRITE 59 SP < SP + 4 ; ignore errors 60 goto exit 61 case_3: noinstr 62 ; write 3 63 AR < tmp 64 [AR+0] < 51 (B) ; 3 65 [AR+1] < 10 (B) ; line feed 66 SP < SP [SP+0] < 1 ; stdout 68 [SP+4] < tmp ; buffer 69 [SP+8] < 2 ; buffer length 70 syscall 4 ; SYS_WRITE 71 SP < SP + 4 ; ignore errors 72 goto exit 73 fail : SP < SP 4 74 [SP+0] < 1 ; EXIT_FAILURE 75 syscall 11 ; SYS_EXIT 76 exit : SP < SP 4 77 [SP+0] < 0 ; EXIT_SUCCESS 78 syscall 11 ; SYS_EXIT Hyppytaulun sijasta voi käyttää myös rakennetta, jossa on taulukossa eri tapausten alkuosoitteet ja sitten ko. taulukosta haetaan hypyn kohde. Jos taas arvot ovat hajallaan ympäri arvoaluetta, voi olla järkevää tehdä lineaarinen tai binäärinen haku. Jos arvot muodostavat

13 66 4. PAIKALLINEN KONTROLLIVUON OHJAUS useita klustereita, voi olla järkevää tehdä ensin lineaarinen tai binäärinen haku klustereiden joukosta ja sitten valitussa klusterissa käyttää hyppytaulukkoa. TEHTÄVÄ 4.5. Lisää ALKEIS-josin kääntäjään tuki speksaamallesi caserakenteelle. If- ja case-rakenteet ovat hyödyllisiä myös lausekkeina, jolloin niitä käytetään valitsemaan jokin useista vaihtoehtoisista lausekkeista. C-sukuisten kielten?:-operaattori on oleellisesti if-lauseke. TEHTÄVÄ 4.6. Speksaa ja toteuta if-lauseke ALKEIS-josiin. 4. Toistolauseet eli silmukat Imperatiivisen ohjelmoinnin ytimessä on sijoituslauseiden ja peräkkäisyyden lisäksi silmukat (engl. loops) eli toistolauseet (engl. repetition statements). ALKEIS-jos laajenee ALKEIS-silmukaksi, kun siihen lisätään toistolauseet. Varsin harvinainen mutta yleiskäyttöisin rakenne on loop. Sen abstrakti syntaksi on seuraavanlainen: γ ::= loop γ 1 exit if ε γ 2 Tämän silmukan intuitiivinen semantiikka on, että joka iteraatiolla suoritetaan ensin γ 1, sitten katsotaan, onko ε tosi ja jos on, silmukka päättyy, muuten suoritetaan γ 2 ja aloitetaan uusi iteraatio. Tämän denotationaalinen semantiikka vaatii sen verran raskasta matematiikkaa, että jätämme sen tällä kertaa väliin Operationaalinen semantiikka. Tästä lähtien abstraktissa syntaksissa ei käytetä enää γ-kirjainta mihinkään tarkoitukseen. Lauseiden tunnukseksi otetaan sen tilalle κ. Silmukkarakenteen formaalin semantiikan määrittelemme nyt käyttäen Plotkinin rakenteista operationaalista semantiikkaa (engl. structural operational semantics) eli lyhytaskelista operationaalista semantiikkaa (engl. smallstep operational semantics) eli siirtymäsemantiikkaa (engl. transition semantics). Hyvä esitys aiheesta on esimerkiksi Reynoldsin mainiossa kirjassa [37]. Operationaalisen semantiikan intuitio on tilakone (engl. state machine): koneella on joukko tiloja joiden välillä on sallittuja tilasiirtymiä. Tämä tilakone ei tavallisesti ole äärellinen vaan tiloja on yleensä ainakin numeroituvasti ääretön määrä. Ohjelman suoritus alkaa jostain alkutilasta ja etenee tilasiirtymiä pitkin päätyäkseen, jos hyvin käy, johonkin lopputilaan. Keskeisessä asemassa on siis tila (engl. state, configuration), joka on oleellisesti sama kuin denotationaalisessa semantiikassa käytetty

14 4. TOISTOLAUSEET ELI SILMUKAT 67 ympäristö. Kaikkien tilojen joukkoa merkitään Γ. Tila voi olla lopputila (engl. terminal state) tai välitila (engl. nonterminal state). Lopputilojen joukkoa merkitään Γ T ja välitilojen joukkoa merkitään Γ N ; nämä ovat keskenään pistevieraita, ts. mikään tila ei ole sekä lopputila että välitila. Toinen keskeinen käsite on siirtymä (engl. transition), joka määritellään relaationa joukosta Γ N joukkoon Γ. Kielen operationaalinen semantiikka määritellään määrittelemällä Γ, Γ T ja siirtymärelaatio. ALKEIS-silmukan tilajoukko määritellään seuraavasti: Γ T = Σ Σ (Ids LValue) (LValue RValue) Γ N = (Statements Expressions) Γ T Γ = Γ T Γ N Σ = V unsigned byte missä operaattori ( ) tarkoittaa äärellisten jonojen joukkoa, toisin sanoen X koostuu X:n alkioista muodostetuista äärellisistä jonoista. Tyhjää jonoa merkitään, alkioiden a ja b muodostamaa jonoa merkitään a, b ; jonoa, jossa jonot s ja t on laitettu peräkkäin, merkitään st (toisin sanoen a, b c, d = a, b, c, d ), jonon s alkiota, jonka järjestysnumero on n (laskeminen aloitetaan nollasta), merkitään s(n) ja jonon s osajonoa, joka muodostuu s:n alkioista, joiden järjestysnumerot ovat n:n ja m:n välillä, n mukaanlukien, merkitään s(n : m) (toisin sanoen a, b, c, d, e (2 : 4) = c, d ). Plotkinin idea oli, että semantiikan siirtymärelaatio esitetään päättelysäännöstönä: siirtymä γ γ, missä γ Γ N ja γ Γ ovat tiloja, on mahdollinen, jos se voidaan johtaa päättelysäännöistä (vrt. tyyppijärjestelmän päättelysääntöjen toiminta). Kutakin kielikonstruktiota kohti annetaan yksi tai useampi päättelysääntö. Päättelysäännöt on muotoiltava niin, että niitä voidaan soveltaa ainoastaan sellaisessa tilanteessa, jossa vastaavan operaation tekeminen on haluttua. Esimerkiksi laskujärjestys voidaan haluttaessa määritellä tarkasti, mutta ihan yhtä hyvin se voidaan jättää suhteellisen auki. Keskeisenä tekijänä tässä ohjauksessa ovat kaksi uutta abstraktin syntaksin välikesymbolia, ν R ja ν L edellinen edustaa muodollisesti lauseketta, joka on jonkin oikean arvon vakio, ja jälkimmäinen

15 68 4. PAIKALLINEN KONTROLLIVUON OHJAUS edustaa vastaavasti muodollisesti lauseketta, joka on jonkin vasemman arvon vakio. Pohjaa eli virhetilannetta kumpikaan ei kuitenkaan hyväksy. Näin lausekkeiden abstrakti syntaksi muuttuu seuraavanlaiseksi: ν R RValue \ { } ν L LValue \ { } ε Expressions ε ::= ν R ν L Konkreettiin syntaksiin ei kuitenkaan tuoda mitään keinoa ilmaista vasempia arvoja, vaan tämä abstraktin syntaksin muutos on puhtaasti muodollinen lisäys, jonka tarkoituksena on tukea operationaalista semantiikkaa. Sijoituslauseen osalta riittää antaa seuraavat säännöt: (ν L ν R, (σ I, σ O, σ L, σ R )) (σ I, σ O, σ L, σ R (ν L, ν R )) (ε 1, σ) (ε 1, σ) (ε 1 ε 2, σ) (ε 1 ε 2, σ) (ε 2, σ) (ε 2, σ) (ε 1 ε 2, σ) (ε 1 ε 2, σ) Säännöt johtavat siihen vaatimukseen, että molemmat lausekkeet lasketaan kokonaan (onnistuneesti) ennen kuin sijoitusta aletaan tehdä. Sen sijaan lausekkeiden keskinäinen laskujärjestys jää auki. If-lauseelle tarvitaan useampi sääntö: (if true then κ 1 else κ 2, σ) (κ 1, σ) (if false then κ 1 else κ 2, σ) (κ 2, σ) (ε, σ) (ε, σ) (if ε then κ 1 else κ 2, σ) (if ε then κ 1 else κ 2, σ) Muuttujan arvon ottaminen tuottaa ulos vasemman arvon, jos muuttuja on määritelty: σ L (ι) = ν L (ι, (σ I, σ O, σ L, σ R )) (ν L, (σ I, σ O, σ L, σ R ))

16 4. TOISTOLAUSEET ELI SILMUKAT 69 Vasen arvo muuttuu oikeaksi arvoksi helposti: σ R (ν L ) = ν R (ν L, (σ I, σ O, σ L, σ R )) (ν R, (σ I, σ O, σ L, σ R )) Merkin kirjoittaminen mallinnetaan nyt helpommin kuin aiemmin, koska tilaan on otettu erikseen σ O, tulostejono: Peräkkäistys: ν R Σ (write ν R, (σ I, σ O, σ L, σ R )) (σ I, ν R σ O, σ L, σ R ) (ε, σ) (ε, σ) (write ε, σ) (write ε, σ) (κ 1, σ) σ (κ 1 ; κ 2, σ) (κ 2, σ ) (κ 1, σ) (κ 1, σ ) (κ 1 ; κ 2, σ) (κ 1; κ 2, σ ) Lohkot: ei ole sellaista ι jolle σ L (ι ) = a σ R (a) = (ε, σ) ν R (κ, (σ I, σ O, σ L (ι, a), σ R (a, ))) (σ I, σ O, σ L, σ R) (var ι : τ begin κ end, (σ I, σ O, σ L, σ R )) (σ I, σ O, σ L (ι, σ L (ι)), σ R (a, )) (var δ 1 ; δ 2 begin κ end, σ) (var δ 1 begin var δ 2 begin κ end end, σ) Ohjelman suoritus (engl. execution) on operationaalisen semantiikan kannalta tilojen (mahdollisesti ääretön) jono, jolle pätee se, että peräkkäisten tilojen γ ja γ välillä on siirtymärelaatio γ γ. Jos on olemassa äärellinen suoritus, joka alkaa tilasta γ ja päättyy tilaan γ, niin tämä merkitään γ γ. Jos suorituksen viimeinen tila ei ole lopputila eikä suoritusta voi enää jatkaa (eli ei ole olemassa tilaa, johon kyseisen suorituksen viimeisestä tilasta pääsisi sallitulla siirtymällä), suorituksen sanotaan olevan jumissa (engl. stuck). Virhetilanteet operationaalinen semantiikka hoitaa niin, että kukin sääntö sallii (joko oletustensa tai muotonsa avulla) käytön vain silloin, kun virhetilannetta ei tule. Näin virhetilanteessa ei enää voida käyttää yhtään sääntöä ja suoritus jää jumiin. Virhetilanne ilmenee siis tilakoneen jumittumisena. TEHTÄVÄ 4.7. Täydennä edellä annettu ALKEIS-josin operationaalinen semantiikka.

17 70 4. PAIKALLINEN KONTROLLIVUON OHJAUS Silmukan operationaalinen semantiikka on seuraavanlainen: (loop κ 1 exit if ε κ 2, σ) (κ 1 ; if ε then (κ 2 ; loop κ 1 exit if ε κ 2 ), σ) 4.2. Muut silmukkarakenteet. Silmukkarakenteista kuuluisin on varmastikin while-rakenne: κ ::= while ε do κ (while ε do κ, σ) (loop exit if ε κ, σ) Tarpeellinen on usein myös perinteinen for-silmukka: κ ::= for ι : τ ε 1 to ε 2 step ε 3 do κ (for ι : τ ε 1 to ε 2 step ε 3 do κ, σ) (var ι : τ begin ι ε 1 ; while (ι < ε 2 ) (κ; ι ι + ε 3 ) end, σ) Ohjelmointikieltä, joka on suunnilleen samanlainen kuin ALKEISjos varustettuna while-silmukoilla, sanotaan while-kieleksi. Sillä on keskeinen merkitys ohjelmoinnin teoriassa imperatiivisen ohjelmointikielen arkkityyppinä. Tämä johtuu siitä, että while-kielelle on olemassa selkeitä ohjelmien oikeaksi todistamiseen liittyviä formalismeja ja siitä, että while-kieli on yksinkertaisimmasta päästä kieliä, joka on laskennallisesti yhtä ilmaisuvoimainen kuin Turingin kone eli kykenee laskemaan kaikki (yleis)rekursiiviset (engl. general recursive) funktiot Vastaavasti kieltä, joka on suunnilleen samanlainen kuin ALKEISjos varustettuna for-silmukoilla niin, että silmukkamuuttujaan ei voi sijoittaa silmukan sisällä, sanotaan for-kieleksi. Se ei, yllättäen, ole yhtä ilmaisuvoimainen kuin while-kieli, sillä sillä ei voi tehdä päättymätöntä silmukkaa eikä ylipäätään mitään silmukkaa, jonka iteraatioiden lukumäärä ei ole etukäteen tiedossa. Niinpä for-kieli kykenee laskemaan primitiivirekursiiviset (engl. primitive recursive) funktiot ja on Turingin konetta aidosti heikompi.

18 5. VAHTIKOMENNOT Vahtikomennot Mielenkiintoinen variantti ALKEIS-silmukasta saadaan, kun kaikki if-lauseet ja silmukkarakenteet korvataan Dijkstran vahtikomennoilla [10]: κ ::= if ξ guarded conditional do ξ guarded loop ξ GuardedCommand ξ ::=ε κ guard ξ 1 ξ 2 guarded choice Vahtikomento ε κ ilmaisee, että lause κ suoritetaan vain jos ε on tosi. Jos ε on epätosi, vahtikomennon sanotaan olevan suorituskelvoton (engl. infeasible). Vahtikomento ξ 1 ξ 2 valitsee vahtikomennoista ξ 1 ja ξ 2 suoritettavaksi jomman kumman, kuitenkin niin, että suorituskelvotonta ei valita. Käytännössä siis vahtikomento ε 1 κ 1 ε n κ n toimii niin, että se valitsee jonkin sellaisen i:n, jolla vahtilauseke ε i saa arvokseen true, ja suorittaa sitten κ i :n; jos sellaista i:tä ei ole, koko vahtikomento on suorituskelvoton ja jos sellaisia i:tä on useita, niistä valitaan joku. Vahtikomennot tuovat ohjelmointikieleen epädeterminismin (engl. nondeterminism): täsmälleen samalla syötteellä sama ohjelma voi käyttäytyä eri tavoin. Epädeterminismiä on kahdenlaista: enkeliepädeterminismiä (engl. angelic nondeterminism) ja demoniepädeterminismiä (engl. demonic nondeterminism). Näiden kuvaavien nimien takaa löytyy kysymys siitä, miten suoritettava lause valitaan, kun vaihtoehtoja on useita. Enkeliepädeterminismin taustalla on vertauskuva, jossa valinnan tekee enkeli: tehdään siis ohjelman käyttäjän kannalta suotuisin valinta (toisin sanoen, jos valintakohdassa toinen vaihtoehto johtaa virhetilanteeseen ja toinen antaa oikean tuloksen, valitaan se oikeaan tulokseen johtava). Demoniepädeterminismin vertauskuvana on vastaavasti demoni valintaa tekemässä. Tämä ei ole varsinaisesti enkeliepädeterminismin vastakohta, sillä silloin valittaisiin aina väärin ; pikemminkin kyse on ilkeilevästä demonista, joka saattaa joskus valita oikeinkin, mutta siihen ei voi luottaa. Käytännössä tämä tarkoittaa, että demoniepädeterminismissä ohjelman kirjoittajan tulee olettaa pahin mahdollinen valinta varmuuden vuoksi, mutta siihen ei voi luotaa. Enkeliepädeterminismin toteuttaminen tietokoneohjelmassa vaatii käytännössä sitä, että valintaa tehtäessä arvataan ja jos arvaus

19 72 4. PAIKALLINEN KONTROLLIVUON OHJAUS osoittautuu myöhemmin vääräksi, valinta tehdään uudestaan. Tällaista toimintaa sanotaan peruutukseksi (engl. backtracking) ja sitä käytetään lähinnä logiikkaohjelmoinnissa. Toinen tapa toteuttaa enkeliepädeterminismi on valintatilanteen edessä valita kaikki mahdollisuudet ja suorittaa kaikkia vaihtoehtoja toisistaan riippumatta. Jotkut vaihtoehdot osoittautuvat vääriksi valinnoiksi, jolloin niiden suorittaminen lakkaa; ohjelman lopuksi (toivottavasti) hengissä on ainakin yksi suoritus ja niistä voidaan sitten valita umpimähkään, mikä tulos annetaan ulos (tai, haluttaessa voidaan myös antaa ulos kaikki tulokset, jos vain käyttäjä ymmärtää tämän). Vahtikomentojen epädeterministisyys on käytännössä aina demonista, sillä demoniepädeterminismi on helpoin toteutettava. Koska valitsijaksi katsotaan oikukas demoni, voidaan ajatella, että valinnan tekemiseen annetaan kääntäjälle täysi vapaus: se voi esimerkiksi valita aina ensimmäisen niistä, aina viimeisen niistä tai sitten se voi esimerkiksi heittää arpaa niiden välillä (hui!). Fiksu optimoiva kääntäjä saattaa valita aina sen, joka on kevyin suorittaa. Pääsääntö on siis, että valinnanvapaus annetaan kääntäjälle (ja sen toteuttajalle) ja ohjelmoijan pitää hyväksyä se, että mikä tahansa suorituskelpoisista vaihtoehdoista valitaan. Vahtikomentopohjainen if-lause valitsee vaihtoehdoista demonisesti jonkin suorituskelpoisen ja suorittaa sitä vastaavan lauseen. Jos mikään vaihtoehdoista ei ole suorituskelpoinen, if-lauseen suoritus epäonnistuu (operationaalisen semantiikan näkökulmasta suorittava kone jää jumiin, denotationaalisen semantiikan näkökulmasta tila muuttuu pohjaksi). Vahtikomentopohjainen do-silmukka suorittaa vahtikomentonsa toistuvasti kunnes vahtikomento muuttuu suorituskelvottomaksi. Siis silmukan suoritus loppuu, kun kaikki vahtilausekkeet saavat arvokseen false. ESIMERKKI 4.1. Seuraava vahtikomentopohjainen if-lause valitsee muuttujien a ja b arvoista pienemmän ja sijoittaa sen muuttujaan min: if a b min a a b min b ESIMERKKI 4.2. Seuraavassa ohjelmapätkässä a, b ja c ovat lukutaulukoita ja sekä a että b on järjestetty kasvavaan suuruusjärjestykseen. Ohjelmanpätkä yhdistää a:n ja b:n c:hen niin, että c:ssä on jokainen a:n ja b:n alkio ja c on kasvavassa suuruusjärjestyksessä. Muuttujassa n on taulukon a koko ja muuttujassa m on taulukon b koko. Taulukko c on riittävän iso. var i : unsigned int; j : unsigned int; k : unsigned int; begin i 0U;

20 6. VÄITTEET 73 j 0U; k 0U; do i < n (j m a[i] b[j]) begin c[k] a[i]; i i + 1; k k + 1 end j < m (i n a[i] b[j]) begin c[k] b[j]; j j + 1; k k + 1 end end Vahtikomentojen semantiikan sivuutamme ajanpuutteen vuoksi TEHTÄVÄ 4.8. Suunnittele, speksaa ja toteuta ALKEIS-vahti. Voit jättää formaalin semantiikan kirjoittamatta. 6. Väitteet Väitteet (engl. assertions) ovat testejä, joiden odotetaan saavan arvokseen aina true. Niiden tarkoituksena on dokumentoida ohjelmoijien tekemiä oletuksia ja osoittaa, milloin näitä oletuksia rikotaan. Ne ovat pääsääntöisesti testauksen apuvälineitä (testioraakkeleita). Yleiskäyttöisin tapa lisätä väitteet kieleen on lisätä siihen assertlause: κ ::= assert ε (ε, σ) (ε, σ) (assert ε, σ) (assert ε, σ) (assert true, σ) σ Huomaa, kuinka operationaalisesta semantiikasta puuttuu sääntö assert false -tapaukselle: se on tarkoituksellista ja se johtaa siihen, että assert false aiheuttaa jumin niin kuin pitääkin. Hyödyllinen olisi lohkorakenne pre ε 1 begin κ post ε 2, jossa ε 1 on väitelauseke, jonka tulee olla totta lohkoon tultaessa, ja jossa ε 2 on väitelauseke, jonka tulee olla totta lohkosta poistuttaessa. Väitettä ε 1 sanotaan esiehdoksi (engl. precondition) ja väitettä ε 2 sanotaan jälkiehdoksi (engl. postcondition). Ajatus on, että tämä lohkorakenne ilmaisee sopimuksen: lohkon käyttäjän vastuulla on, että esiehto pätee, ja lohkon itsensä vastuulla on, että jälkiehto pätee. Jos lohkon käyttäjä rikkoo sopimuksen ja esiehto ei pädekään, lohkolla ei ole mitään vastuuta eikä sen tarvitse huolehtia jälkiehdosta. Näin esimerkiksi voidaan kirjoittaa seuraavasti:

21 74 4. PAIKALLINEN KONTROLLIVUON OHJAUS pre a 0 b > 0 begin q a / b; r a % b; post a = q b + r 0 r r < b end Muita hyödyllisiä väitteitä ovat ns. pysyväisväittämät (engl. invariants), joista ei ajanpuutteen vuoksi tämän enempää. Tony Hoare on kirjoittanut mielenkiintoisia artikkeleita [14, 15] väitteiden käytöstä teoriassa ja käytännössä.

22

23 Kirjallisuutta [1] IEEE standard for binary floating-point arithmetic, ANSI/IEEE Std [2] 7-Bit coded Character Set, Standard ECMA 6. WWW: ch/ecma1/stand/ecma-006.htm. [3] Addison-Wesley, Reading, MA. The Unicode Standard, Version 4.0, [4] Alfred V. Aho, Ravi Sethi, ja Jeffrey D. Ullman. Compilers: Principles, Techniques and Tools. Addison-Wesley, Reading, MA, [5] Andrew W. Appel ja Jens Palsberg. Modern Compiler Implementation in Java. Cambridge University Press, Cambridge, 2 laitos, [6] John Backus. Can programming be liberated from the von Neumann style? A functional style and its algebra of programs. Communications of the ACM, 21(8), Elokuu [7] C. J. Burgess. Software quality issues when choosing a programming language. Kirjassa Software Quality Management III Vol. 2, sivua Computational Mechanics Publications, [8] O.-J. Dahl, E. W. Dijkstra, ja C. A. R. Hoare. Structured Programming. Academic Press, Lontoo, [9] Edsger W. Dijkstra. Go to statement considered harmful. Communications of the ACM, 11(3), Maaliskuu Letter to the editor. [10] Edsger W. Dijkstra. A Discipline of Programming. Prentice-Hall, Englewood Cliffs, NJ, [11] Erich Gamma, Richard Helm, Ralph Johnson, ja John Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley, Boston, [12] C. A. R. Hoare. Hints on programming language design. Kirjassa C. A. R. Hoare ja C. B. Jones (toim.), Essays in Computer Science. Prentice-Hall, New York, [13] C. A. R. Hoare. A hard act to follow. Higher-Order and Symbolic Computation, 13(1 2):71 72, [14] C. A. R. Hoare. Assertions: a personal perspective. IEEE Annals of the History of Computing, 25(2), [15] Tony Hoare. Towards the verifying compiler. Kirjassa Olaf Owe, Stein Krogdahl, ja Tom Lyche (toim.), From Object-Orientation to Formal Methods: Essays in Memory of Ole-Johan Dahl, nide 2635 sarjasta Lecture Notes in Computer Science. Springer, [16] International Organization for Standardization. Information lechnology Syntactic metalanguage Extended BNF, ISO/IEC 14977:1996(E). [17] International Organization for Standardization. Programming languages C, ISO/IEC 9899:1999. [18] Antti-Juhani Kaijanaho ja Benjamin Fallenstein. Totally different structural programming: Programming languages in ZigZag. WWW: jyu./antkaij/plinzz.pdf, Elokuu An invited talk presented at the First 93

24 94 KIRJALLISUUTTA International ZigZag Conference, part of ACM Hypertext Conference 2001 in Århus, Denmark on August 14, [19] Richard Kelsey, William Klinger, Jonathan Rees, et al. Revised 5 report on the algorithmic language Scheme. ACM SIGPLAN Notices, 33(9):26 76, Syyskuu [20] Heiko Kießling ja Uwe Krüger. Blocks and procedures. SIGPLAN Notices, 28(11), [21] Donald E. Knuth. Backus normal form vs. backus naur form. Communications of the ACM, 7(12), Joulukuu Letter to the editor. [22] Donald E. Knuth. Structured programming with go to statements. Computing Surveys, 6(4), Joulukuu [23] Donald E. Knuth ja Luis Trabb Pardo. The early development of programming languages. Kirjassa J. Belzer, A. G. Holzman, ja A. Kent (toim.), Encyclopedia of Computer Science and Technology, nide 6. Dekker, New York, Julkaistu myös kirjassa [27]. [24] Thomas E. Kurtz. BASIC. ACM SIGPLAN Notices, 13(8): , Elokuu Preprints, First ACM SIGPLAN History of Programming Languages Conference. [25] Patricia K. Lawlis. Guidelines for choosing a computer language: Support for the visionary organization, Elokuu [26] John McCarthy. History of LISP. ACM SIGPLAN Notices, 13(8): , Elokuu Preprints, First ACM SIGPLAN History of Programming Languages Conference. [27] N. Metropolis, J. Howlett, ja Gian-Carlo Rota (toim.). A History of Computing in the Twentieth Century. Academic Press, New York, [28] Robin Milner. A theory of type polymorphism in programming. Journal of Computer and System Sciences, 17(3): , [29] Hanspeter Mössenböck. Treating statement sequences as block objects. SIGPLAN Notices, 27(8), [30] Peter Naur et al. Revised report on the algorithmic language ALGOL 60. Communications of the ACM, 6(1):1 17, Tammikuu [31] John K. Ousterhout. Scripting: Higher-level programming for the 21st century. Computer, 31(3):23 30, Maaliskuu [32] Alan J. Perlis. Epigrams on programming. ACM SIGPLAN Notices, 17(9), Syyskuu [33] Simon Peyton Jones (toim.). Haskell 98 Language and Libraries: The Revised Report. Cambridge University Press, Huhtikuu [34] Simon Peyton Jones. Haskell 98 language and libraries: The revised report. Journal of Functional Programming, 13(1), Tammikuu [35] Simon L. Peyton Jones. The Implementation of Functional Programming Languages. Prentice-Hall, New York, [36] Eric S. Raymond. The Art of Unix Programming. Addison-Wesley, Boston, [37] John C. Reynolds. Theories of Programming Languages. Cambridge University Press, Cambridge, [38] Guy Lewis Steele, Jr. Debunking the expensive procedure call myth or procedure call implementations considered harmful or, LAMBDA: The ultimate GOTO. Kirjassa James K. Ketchel et al. (toim.), Proceedings of the 1977 annual conference, sivua ACM Press, [39] Christopher Strachey. Fundamental concepts in programming languages. Higher-Order and Symbolic Computation, 13:11 49, Perustuu Stracheyn vuonna 1967 pitämiin luentoihin.

25 KIRJALLISUUTTA 95 [40] A. van Wijngaarden et al. (toim.). Revised Report on the Algorithmic Language Algol 68. Springer, Berliini, [41] Larry Wall. Perl, the first postmodern computer language. org/ larry/pm.html, A talk given in Linux World Spring 1999.

26

kontrollivuon analyysejä optimointiensa tueksi ja myös tiettyjen merkitysopillisten

kontrollivuon analyysejä optimointiensa tueksi ja myös tiettyjen merkitysopillisten Luku 4 Kontrolli Tässä viimeisessä luvussa paneudutaan ohjelman kontrollin hallintaan. Keskeisin asia on aliohjelmakäsite, joka on teoreettisesti niin vahva, että valtaosa muista aiheeseen liittyvistä

Lisätiedot

järjestys, jossa ohjelman suoritus etenee ohjelmatekstissä jollakin tietyllä suorituskerralla (dynaaminen kontrollivuo)

järjestys, jossa ohjelman suoritus etenee ohjelmatekstissä jollakin tietyllä suorituskerralla (dynaaminen kontrollivuo) Luku 5 Kontrollivuon ohjaus Useimmat nykykielet ovat luonteeltaan peräkkäistäviä (sequential): ohjelmatekstissä mainitut tehtävät tehdään yksi kerrallaan toinen toisensa jälkeen. Jotkin kielet tukevat

Lisätiedot

TIES542 kevät 2009 Kontrollivuon ohjaus

TIES542 kevät 2009 Kontrollivuon ohjaus TIES542 kevät 2009 Kontrollivuon ohjaus Antti-Juhani Kaijanaho 20. tammikuuta 2009 Sisältö 1 Testit 2 2 Käskykielten kontrollinohjaus 3 2.1 Valintalauseet 4 2.2 Toistolauseet eli silmukat 5 2.3 Vahtikomennot

Lisätiedot

Ohjelmointikielten periaatteet. Antti-Juhani Kaijanaho

Ohjelmointikielten periaatteet. Antti-Juhani Kaijanaho Ohjelmointikielten periaatteet Antti-Juhani Kaijanaho 1. marraskuuta 2010 2 Sisältö 1 Johdanto 7 1.1 Ohjelmoinnista.......................... 7 1.2 Mikä on ohjelmointikieli..................... 7 1.3 Historia...............................

Lisätiedot

Java-kielen perusteita

Java-kielen perusteita Java-kielen perusteita valintalauseet 1 Johdantoa kontrollirakenteisiin Tähän saakka ohjelmissa on ollut vain peräkkäisyyttä eli lauseet on suoritettu peräkkäin yksi kerrallaan Tarvitsemme myös valintaa

Lisätiedot

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5) Alkuarvot ja tyyppimuunnokset (1/5) Aiemmin olemme jo antaneet muuttujille alkuarvoja, esimerkiksi: int luku = 123; Alkuarvon on oltava muuttujan tietotyypin mukainen, esimerkiksi int-muuttujilla kokonaisluku,

Lisätiedot

Ohjelmointikielten periaatteet Syksy Antti-Juhani Kaijanaho

Ohjelmointikielten periaatteet Syksy Antti-Juhani Kaijanaho Ohjelmointikielten periaatteet Syksy 2004 Antti-Juhani Kaijanaho Copyright c 2002, 2004 Antti-Juhani Kaijanaho Tästä teoksesta saa valmistaa kappaleita ja sen saa saattaa yleisön saataviin, muuttamattomana

Lisätiedot

Imperatiivisten ohjelmien organisointiparadigmojen. historia

Imperatiivisten ohjelmien organisointiparadigmojen. historia Imperatiivisten ohjelmien organisointiparadigmojen historia Timo Tapanainen Helsingin yliopisto, tietojenkäsittelytieteen laitos Tietojenkäsittelytieteen historia -seminaari, kevät 2007 Sisältö Paradigma,

Lisätiedot

Imperatiivisten ohjelmien organisointiparadigmojen historia

Imperatiivisten ohjelmien organisointiparadigmojen historia Imperatiivisten ohjelmien organisointiparadigmojen historia Timo Tapanainen Helsingin yliopisto, tietojenkäsittelytieteen laitos Tietojenkäsittelytieteen historia -seminaari, kevät 2007 Sisältö Paradigma,

Lisätiedot

Ehto- ja toistolauseet

Ehto- ja toistolauseet Ehto- ja toistolauseet 1 Ehto- ja toistolauseet Uutena asiana opetellaan ohjelmointilauseet / rakenteet, jotka mahdollistavat: Päätösten tekemisen ohjelman suorituksen aikana (esim. kyllä/ei) Samoja lauseiden

Lisätiedot

ALKEIS-kielen semantiikan aksiomaattinen määrittely

ALKEIS-kielen semantiikan aksiomaattinen määrittely ALKEIS-kielen semantiikan aksiomaattinen määrittely Antti Jokipii antti.jokipii@republica.fi Antti Vuorenmaa anvuoren@cc.jyu.fi Eero Lempinen eerolem@cc.jyu.fi Pete Räsänen peter@cc.jyu.fi Tiivistelmä

Lisätiedot

Aliohjelmat. 1 Kutsusekvenssit. Antti-Juhani Kaijanaho 5. helmikuuta 2007

Aliohjelmat. 1 Kutsusekvenssit. Antti-Juhani Kaijanaho 5. helmikuuta 2007 Aliohjelmat Antti-Juhani Kaijanaho 5. helmikuuta 2007 1 Kutsusekvenssit Aliohjelmaan kontrolli siirtyy sen kutsun (engl. call) kautta. Kun aliohjelman suoritus päättyy, kontrolli siirtyy takaisin sinne,

Lisätiedot

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A. Tehtävä. Tämä tehtävä on aineistotehtävä, jossa esitetään ensin tehtävän teoria. Sen jälkeen esitetään neljä kysymystä, joissa tätä teoriaa pitää soveltaa. Mitään aikaisempaa tehtävän aihepiirin tuntemusta

Lisätiedot

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä OULUN YLIOPISTO Tietojenkäsittelytieteiden laitos Johdatus ohjelmointiin 811122P (5 op.) 12.12.2005 Ohjelmointikieli on Java. Tentissä saa olla materiaali mukana. Tenttitulokset julkaistaan aikaisintaan

Lisätiedot

TIEA255 Tietotekniikan teemaseminaari ohjelmointikielet ja kehitysalustat. Antti-Juhani Kaijanaho. 16. helmikuuta 2011

TIEA255 Tietotekniikan teemaseminaari ohjelmointikielet ja kehitysalustat. Antti-Juhani Kaijanaho. 16. helmikuuta 2011 TIEA255 Tietotekniikan teemaseminaari ohjelmointikielet ja kehitysalustat Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 16. helmikuuta 2011 Sisällys Sisällys Ohjelmointikieli? programming language n. a

Lisätiedot

vaihtoehtoja TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho 13. lokakuuta 2016 TIETOTEKNIIKAN LAITOS

vaihtoehtoja TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho 13. lokakuuta 2016 TIETOTEKNIIKAN LAITOS TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 13. lokakuuta 2016 Sisällys Harjoitustehtävätilastoa Tilanne 13.10.2016 klo 9:42 passed waiting redo submitters

Lisätiedot

13. Loogiset operaatiot 13.1

13. Loogiset operaatiot 13.1 13. Loogiset operaatiot 13.1 Sisällys Loogiset operaatiot AND, OR, XOR ja NOT. Operaatioiden ehdollisuus. Bittioperaatiot. Loogiset operaatiot ohjausrakenteissa. Loogiset operaatiot ja laskentajärjestys.

Lisätiedot

TIES542 kevät 2009 Denotaatio

TIES542 kevät 2009 Denotaatio TIES542 kevät 2009 Denotaatio Antti-Juhani Kaijanaho 27.1.2009 (korjauksia 28.1.2009) Denotationaalisessa merkitysopissa kukin (ohjelmointi)kielen konstrktiolle määritellään matemaattinen otus, jota sanotaan

Lisätiedot

Säännölliset kielet. Sisällys. Säännölliset kielet. Säännölliset operaattorit. Säännölliset kielet

Säännölliset kielet. Sisällys. Säännölliset kielet. Säännölliset operaattorit. Säännölliset kielet TIEA241 Automaatit ja kieliopit, kesä 2013 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 24. toukokuuta 2013 Sisällys Formaalit kielet On tapana sanoa, että merkkijonojen joukko on (formaali) kieli. Hieman

Lisätiedot

Lisää pysähtymisaiheisia ongelmia

Lisää pysähtymisaiheisia ongelmia Lisää pysähtymisaiheisia ongelmia Lause: Pysähtymättömyysongelma H missä H = { w111x w validi koodi, M w ei pysähdy syötteellä x } ei ole rekursiivisesti lueteltava. Todistus: Pysähtymisongelman komplementti

Lisätiedot

5/20: Algoritmirakenteita III

5/20: Algoritmirakenteita III Ohjelmointi 1 / syksy 2007 5/20: Algoritmirakenteita III Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007 p.1/17 Tämän

Lisätiedot

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä OULUN YLIOPISTO Tietojenkäsittelytieteiden laitos Johdatus ohjelmointiin 81122P (4 ov.) 30.5.2005 Ohjelmointikieli on Java. Tentissä saa olla materiaali mukana. Tenttitulokset julkaistaan aikaisintaan

Lisätiedot

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 5. marraskuuta 2015

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 5. marraskuuta 2015 TIEA24 Automaatit ja kieliopit, syksy 205 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 5. marraskuuta 205 Sisällys Käsiteanalyysiä Tarkastellaan koodilukkoa äärellisenä automaattina. Deterministinen äärellinen

Lisätiedot

TIEA241 Automaatit ja kieliopit, kevät Antti-Juhani Kaijanaho. 12. tammikuuta 2012

TIEA241 Automaatit ja kieliopit, kevät Antti-Juhani Kaijanaho. 12. tammikuuta 2012 TIEA241 Automaatit ja kieliopit, kevät 2012 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 12. tammikuuta 2012 Sisällys Sisällys Äärellisiä automaatteja PUSH ON PUSH OFF Q T Q J C C H S C,Q C,Q 0 50s 1e

Lisätiedot

Yhtälönratkaisusta. Johanna Rämö, Helsingin yliopisto. 22. syyskuuta 2014

Yhtälönratkaisusta. Johanna Rämö, Helsingin yliopisto. 22. syyskuuta 2014 Yhtälönratkaisusta Johanna Rämö, Helsingin yliopisto 22. syyskuuta 2014 Yhtälönratkaisu on koulusta tuttua, mutta usein sitä tehdään mekaanisesti sen kummempia ajattelematta. Jotta pystytään ratkaisemaan

Lisätiedot

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti C! Perusteet 19.1.2017 Palautteesta (1. kierros toistaiseksi) Toistaiseksi helppoa Miksi vain puolet pisteistä? Vaikeinta oli ohjelmointiympäristön asennus ja käyttö Vaikeaa eroavuudet Pythonin ja C:n

Lisätiedot

Tyyppiluokat II konstruktoriluokat, funktionaaliset riippuvuudet. TIES341 Funktio-ohjelmointi 2 Kevät 2006

Tyyppiluokat II konstruktoriluokat, funktionaaliset riippuvuudet. TIES341 Funktio-ohjelmointi 2 Kevät 2006 Tyyppiluokat II konstruktoriluokat, funktionaaliset riippuvuudet TIES341 Funktio-ohjelmointi 2 Kevät 2006 Alkuperäislähteitä Philip Wadler & Stephen Blott: How to make ad-hoc polymorphism less ad-hoc,

Lisätiedot

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin. 2. Ohjausrakenteet Ohjausrakenteiden avulla ohjataan ohjelman suoritusta. peräkkäisyys valinta toisto Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet

Lisätiedot

TIES542 kevät 2009 Tyyppijärjestelmän laajennoksia

TIES542 kevät 2009 Tyyppijärjestelmän laajennoksia TIES542 kevät 2009 Tyyppijärjestelmän laajennoksia Antti-Juhani Kaijanaho 16. helmikuuta 2009 Tyypitetyt ohjelmointikielet sisältävät paljon muitakin konstruktioita kuin yksinkertaisesti tyypitetyn lambda-kielen,

Lisätiedot

811120P Diskreetit rakenteet

811120P Diskreetit rakenteet 811120P Diskreetit rakenteet 2016-2017 1. Algoritmeista 1.1 Algoritmin käsite Algoritmi keskeinen laskennassa Määrittelee prosessin, joka suorittaa annetun tehtävän Esimerkiksi Nimien järjestäminen aakkosjärjestykseen

Lisätiedot

13. Loogiset operaatiot 13.1

13. Loogiset operaatiot 13.1 13. Loogiset operaatiot 13.1 Sisällys Loogiset operaatiot AND, OR, XOR ja NOT. Operaatioiden ehdollisuus. Bittioperaatiot. Loogiset operaatiot ohjausrakenteissa. Loogiset operaatiot ja laskentajärjestys.

Lisätiedot

811120P Diskreetit rakenteet

811120P Diskreetit rakenteet 811120P Diskreetit rakenteet 2018-2019 1. Algoritmeista 1.1 Algoritmin käsite Algoritmi keskeinen laskennassa Määrittelee prosessin, joka suorittaa annetun tehtävän Esimerkiksi Nimien järjestäminen aakkosjärjestykseen

Lisätiedot

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti C! Perusteet 19.1.2017 Palautteesta (1. kierros toistaiseksi) (Erittäin) helppoa Miksi vain puolet pisteistä? Vaikeinta oli ohjelmointiympäristön asennus ja käyttö Ei selvää että main funktion pitikin

Lisätiedot

TIES542 kevät 2009 Yhteismuistisamanaikaisuus

TIES542 kevät 2009 Yhteismuistisamanaikaisuus TIES542 kevät 2009 Yhteismuistisamanaikaisuus Antti-Juhani Kaijanaho 9. maaliskuuta 2009 Tehtävät ovat samanaikaiset (engl. concurrent), jos ne etenevät yhtä aikaa samalla toistensa kanssa kommunikoiden.

Lisätiedot

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli TIE-20306 PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli Seminaariesitelmä ryhmä 24 Markku Ahokas Jani Kuitti i SISÄLLYSLUETTELO 1. YLEISTÄ EIFFELISTÄ... 1 1.1 Historia ja tausta... 1 1.2

Lisätiedot

11/20: Konepelti auki

11/20: Konepelti auki Ohjelmointi 1 / syksy 2007 11/20: Konepelti auki Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007 p.1/11 Tämän luennon

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op) ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 7. huhtikuuta 2017 Vastaa kaikkiin tehtäviin. Tee jokainen tehtävä erilliselle konseptiarkille. Kirjoittamasi luokat, funktiot ja aliohjelmat

Lisätiedot

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 8. syyskuuta 2016

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 8. syyskuuta 2016 TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 8. syyskuuta 2016 Sisällys a https://tim.jyu.fi/view/kurssit/tie/ tiea241/2016/videoiden%20hakemisto Matemaattisen

Lisätiedot

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 16. marraskuuta 2015

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 16. marraskuuta 2015 ja ja TIEA241 Automaatit ja kieliopit, syksy 2015 Antti-Juhani Kaijanaho NFA:ksi TIETOTEKNIIKAN LAITOS 16. marraskuuta 2015 Sisällys ja NFA:ksi NFA:ksi Kohti säännöllisiä lausekkeita ja Nämä tiedetään:

Lisätiedot

TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 31. maaliskuuta 2011

TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 31. maaliskuuta 2011 TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 31. maaliskuuta 2011 Sisällys Sisällys Chomskyn hierarkia kieli säännöllinen kontekstiton kontekstinen rekursiivisesti

Lisätiedot

T Syksy 2004 Logiikka tietotekniikassa: perusteet Laskuharjoitus 12 (opetusmoniste, kappaleet )

T Syksy 2004 Logiikka tietotekniikassa: perusteet Laskuharjoitus 12 (opetusmoniste, kappaleet ) T-79.144 Syksy 2004 Logiikka tietotekniikassa: perusteet Laskuharjoitus 12 (opetusmoniste, kappaleet 9.1 9.5) 30.11. 3.12.2004 1. Osoita lauselogiikan avulla oheisten ehtolausekkeiden ekvivalenssi. (a)!(a

Lisätiedot

12. Javan toistorakenteet 12.1

12. Javan toistorakenteet 12.1 12. Javan toistorakenteet 12.1 Sisällys Yleistä toistorakenteista. Laskurimuuttujat. While-, do-while- ja for-lauseet. Laskuri- ja lippumuuttujat. Tyypillisiä ohjelmointivirheitä. Silmukan rajat asetettu

Lisätiedot

Chomskyn hierarkia ja yhteysherkät kieliopit

Chomskyn hierarkia ja yhteysherkät kieliopit Chomskyn hierarkia ja yhteysherkät kieliopit Laskennan teorian opintopiiri Tuomas Hakoniemi 21. helmikuuta 2014 Käsittelen tässä laskennan teorian opintopiirin harjoitustyössäni muodollisten kielioppien

Lisätiedot

11. Javan toistorakenteet 11.1

11. Javan toistorakenteet 11.1 11. Javan toistorakenteet 11.1 Sisällys Laskuri- ja lippumuuttujat. Sisäkkäiset silmukat. Tyypillisiä ohjelmointivirheitä: Silmukan rajat asetettu kierroksen verran väärin. Ikuinen silmukka. Silmukoinnin

Lisätiedot

Logiikan kertausta. TIE303 Formaalit menetelmät, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos.

Logiikan kertausta. TIE303 Formaalit menetelmät, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos. TIE303 Formaalit menetelmät, kevät 2005 Logiikan kertausta Antti-Juhani Kaijanaho antkaij@mit.jyu.fi Jyväskylän yliopisto Tietotekniikan laitos TIE303 Formaalit mentetelmät, 2005-01-27 p. 1/17 Luento2Luentomoniste

Lisätiedot

Java-kielen perusteet

Java-kielen perusteet Java-kielen perusteet Tunnus, varattu sana, kommentti Muuttuja, alkeistietotyyppi, merkkijono, literaalivakio, nimetty vakio Tiedon merkkipohjainen tulostaminen 1 Tunnus Java tunnus Java-kirjain Java-numero

Lisätiedot

Luento 5. Timo Savola. 28. huhtikuuta 2006

Luento 5. Timo Savola. 28. huhtikuuta 2006 UNIX-käyttöjärjestelmä Luento 5 Timo Savola 28. huhtikuuta 2006 Osa I Shell-ohjelmointi Ehtolause Lausekkeet suoritetaan jos ehtolausekkeen paluuarvo on 0 if ehtolauseke then lauseke

Lisätiedot

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit IDL - proseduurit 25. huhtikuuta 2017 Viimeksi käsiteltiin IDL:n interaktiivista käyttöä, mutta tämä on hyvin kömpelöä monimutkaisempia asioita tehtäessä. IDL:llä on mahdollista tehdä ns. proseduuri-tiedostoja,

Lisätiedot

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014 18. syyskuuta 2014 IDL - proseduurit Viimeksi käsiteltiin IDL:n interaktiivista käyttöä, mutta tämä on hyvin kömpelöä monimutkaisempia asioita tehtäessä. IDL:llä on mahdollista tehdä ns. proseduuri-tiedostoja,

Lisätiedot

TIEA241 Automaatit ja kieliopit, kesä Antti-Juhani Kaijanaho. 29. toukokuuta 2013

TIEA241 Automaatit ja kieliopit, kesä Antti-Juhani Kaijanaho. 29. toukokuuta 2013 TIEA241 Automaatit ja kieliopit, kesä 2013 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 29. toukokuuta 2013 Sisällys Chomskyn hierarkia (ja muutakin) kieli LL(k) LR(1) kontekstiton kontekstinen rekursiivisesti

Lisätiedot

MS-A0402 Diskreetin matematiikan perusteet

MS-A0402 Diskreetin matematiikan perusteet MS-A040 Diskreetin matematiikan perusteet Osa : Relaatiot ja funktiot Riikka Kangaslampi 017 Matematiikan ja systeemianalyysin laitos Aalto-yliopisto Relaatiot Relaatio Määritelmä 1 Relaatio joukosta A

Lisätiedot

Haskell ohjelmointikielen tyyppijärjestelmä

Haskell ohjelmointikielen tyyppijärjestelmä Haskell ohjelmointikielen tyyppijärjestelmä Sakari Jokinen Helsinki 19. huhtikuuta 2004 Ohjelmointikielten perusteet - seminaarityö HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos 1 Johdanto 1 Tyyppien

Lisätiedot

FORMAALI SYSTEEMI (in Nutshell): aakkosto: alkeismerkkien joukko kieliopin määräämä syntaksi: sallittujen merkkijonojen rakenne, formaali kuvaus

FORMAALI SYSTEEMI (in Nutshell): aakkosto: alkeismerkkien joukko kieliopin määräämä syntaksi: sallittujen merkkijonojen rakenne, formaali kuvaus FORMAALI SYSTEEMI (in Nutshell): Formaali kieli: aakkosto: alkeismerkkien joukko kieliopin määräämä syntaksi: sallittujen merkkijonojen rakenne, formaali kuvaus esim. SSM:n tai EBNF:n avulla Semantiikka:

Lisätiedot

uv n, v 1, ja uv i w A kaikilla

uv n, v 1, ja uv i w A kaikilla 2.8 Säännöllisten kielten rajoituksista Kardinaliteettisyistä on oltava olemassa (paljon) ei-säännöllisiä kieliä: kieliä on ylinumeroituva määrä, säännöllisiä lausekkeita vain numeroituvasti. Voidaanko

Lisätiedot

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 30. marraskuuta 2015

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 30. marraskuuta 2015 TIEA241 Automaatit ja kieliopit, syksy 2015 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 30. marraskuuta 2015 Sisällys t Väitöstilaisuus 4.12.2015 kello 12 vanhassa juhlasalissa S212 saa tulla 2 demoruksia

Lisätiedot

Tietotekniikan valintakoe

Tietotekniikan valintakoe Jyväskylän yliopisto Tietotekniikan laitos Tietotekniikan valintakoe 2..22 Vastaa kahteen seuraavista kolmesta tehtävästä. Kukin tehtävä arvostellaan kokonaislukuasteikolla - 25. Jos vastaat useampaan

Lisätiedot

Esimerkki 1: Kahviautomaatti.

Esimerkki 1: Kahviautomaatti. Esimerkki 1: Kahviautomaatti. ÄÄRELLISET AUTOAATIT JA SÄÄNNÖLLISET KIELET 2.1 Tilakaaviot ja tilataulut Tarkastellaan aluksi tietojenkäsittelyjärjestelmiä, joilla on vain äärellisen monta mahdollista tilaa.

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 8: Pienen ohjelmointikielen tulkki (ohjelmoitava laskin) (mm. SICP 4-4.1.5 osin) Riku Saikkonen 15. 11. 2012 Sisältö 1 Nelilaskintulkki, globaalit muuttujat

Lisätiedot

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008 TIEA34 Funktio-ohjelmointi, kevät 2008 Luento 3 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 2. tammikuuta 2008 Ydin-Haskell: Syntaksi Lausekkeita (e) ovat: nimettömät funktiot: \x

Lisätiedot

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 19. syyskuuta 2016

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 19. syyskuuta 2016 TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 19. syyskuuta 2016 Sisällys Neuvoja opintoihin tee joka päivä ainakin vähän uskalla mennä epämukavuusalueelle en

Lisätiedot

Johdanto Meta Kielten jaotteluja Historia. Aloitusluento. TIES542 Ohjelmointikielten periaatteet, kevät Antti-Juhani Kaijanaho

Johdanto Meta Kielten jaotteluja Historia. Aloitusluento. TIES542 Ohjelmointikielten periaatteet, kevät Antti-Juhani Kaijanaho Aloitusluento TIES542 Ohjelmointikielten periaatteet, kevät 2007 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 8. tammikuuta 2007 Luennoija Antti-Juhani Kaijanaho

Lisätiedot

Sisällys. 17. Ohjelmoinnin tekniikkaa. Aritmetiikkaa toisin merkiten. for-lause lyhemmin

Sisällys. 17. Ohjelmoinnin tekniikkaa. Aritmetiikkaa toisin merkiten. for-lause lyhemmin Sisällys 17. Ohjelmoinnin tekniikkaa for-lause lyhemmin. Vaihtoehtoisia merkintöjä aritmeettisille lauseille. Useiden muuttujien esittely ja alustaminen yhdellä lauseella. if-else-lause vaihtoehtoisesti

Lisätiedot

S BAB ABA A aas bba B bbs c

S BAB ABA A aas bba B bbs c T-79.148 Kevät 2003 Tietojenkäsittelyteorian perusteet Harjoitus 8 Demonstraatiotehtävien ratkaisut 4. Tehtävä: Laadi algoritmi, joka testaa onko annetun yhteydettömän kieliopin G = V, Σ, P, S) tuottama

Lisätiedot

Pinoautomaatit. TIEA241 Automaatit ja kieliopit, kesä Antti-Juhani Kaijanaho. 6. kesäkuuta 2013 TIETOTEKNIIKAN LAITOS. Pinoautomaatit.

Pinoautomaatit. TIEA241 Automaatit ja kieliopit, kesä Antti-Juhani Kaijanaho. 6. kesäkuuta 2013 TIETOTEKNIIKAN LAITOS. Pinoautomaatit. TIEA241 Automaatit ja kieliopit, kesä 2013 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 6. kesäkuuta 2013 Sisällys Aikataulumuutos Tämänpäiväinen demotilaisuus on siirretty maanantaille klo 14:15 (Ag Delta).

Lisätiedot

Johnson, A Theoretician's Guide to the Experimental Analysis of Algorithms.

Johnson, A Theoretician's Guide to the Experimental Analysis of Algorithms. Kokeellinen algoritmiikka (3 ov) syventäviä opintoja edeltävät opinnot: ainakin Tietorakenteet hyödyllisiä opintoja: ASA, Algoritmiohjelmointi suoritus harjoitustyöllä (ei tenttiä) Kirjallisuutta: Johnson,

Lisätiedot

TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 19. tammikuuta 2012

TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 19. tammikuuta 2012 TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 19. tammikuuta 2012 Sisällys Sisällys Muistathan A B -konstruktion 0 k 1 i 2 s 3 s 4 a 5 0 k 1 o 2 i 3 r 4

Lisätiedot

TIES542 kevät 2009 Rekursiiviset tyypit

TIES542 kevät 2009 Rekursiiviset tyypit TIES542 kevät 2009 Rekursiiviset tyypit Antti-Juhani Kaijanaho 17. helmikuuta 2009 Edellisessä monisteessa esitetyt tietue- ja varianttityypit eivät yksinään riitä kovin mielenkiintoisten tietorakenteiden

Lisätiedot

Muistutus aikatauluista

Muistutus aikatauluista Muistutus aikatauluista (Nämä eivät välttämättä koske avoimen yo:n opiskelijoita Erkki Kailan rinnakkaisella kurssilla) Luento 1: kotitehtävät sulkeutuvat 20.9 12:00, ennen tutoriaalia Tutoriaali 1 sulkeutuu

Lisätiedot

Tieto ja sen osoite (3) Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI) Osoitinmuuttujat. Tieto ja sen osoite (5)

Tieto ja sen osoite (3) Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI) Osoitinmuuttujat. Tieto ja sen osoite (5) Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI) Muuttujat Tietorakenteet Kontrolli Optimointi Tarkistukset 1 Tieto ja sen osoite (3) X DC LOAD, =X LOAD R2, X int x =; symbolin X arvo muuttujan X arvo

Lisätiedot

Täydentäviä muistiinpanoja Turingin koneiden vaihtoehdoista

Täydentäviä muistiinpanoja Turingin koneiden vaihtoehdoista Täydentäviä muistiinpanoja Turingin koneiden vaihtoehdoista Antti-Juhani Kaijanaho 15. maaliskuuta 2012 1 Apumääritelmä Määritelmä 1. Olkoon Σ merkistö, jolla on olemassa täydellinen järjestys ( ) Σ 2.

Lisätiedot

3. Muuttujat ja operaatiot 3.1

3. Muuttujat ja operaatiot 3.1 3. Muuttujat ja operaatiot 3.1 Sisällys Imperatiivinen laskenta. Muuttujat. Nimi ja arvo. Muuttujan nimeäminen. Muuttujan tyyppi. Operaattorit. Operandit. Arvon sijoitus muuttujaan. Aritmeettiset operaattorit.

Lisätiedot

Turingin koneen laajennuksia

Turingin koneen laajennuksia Turingin koneen laajennuksia Turingin koneen määritelmään voidaan tehdä erilaisia muutoksia siten että edelleen voidaan tunnistaa tasan sama luokka kieliä. Moniuraiset Turingin koneet: nauha jakautuu k

Lisätiedot

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008 TIEA341 Funktio-ohjelmointi 1, kevät 2008 Aloitusluento Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 7. tammikuuta 2008 Aikataulu Luennot salissa Ag C231.1: ma klo 10 12, to klo 14-16

Lisätiedot

jäsennyksestä TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho 29. syyskuuta 2016 TIETOTEKNIIKAN LAITOS Kontekstittomien kielioppien

jäsennyksestä TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho 29. syyskuuta 2016 TIETOTEKNIIKAN LAITOS Kontekstittomien kielioppien TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 29. syyskuuta 2016 Sisällys Harjoitustehtävätilastoa Tilanne 29.9.2016 klo 8:41 (lähes kaikki kommentoitu) passed

Lisätiedot

jäsentäminen TIEA241 Automaatit ja kieliopit, syksy 2015 Antti-Juhani Kaijanaho 26. marraskuuta 2015 TIETOTEKNIIKAN LAITOS

jäsentäminen TIEA241 Automaatit ja kieliopit, syksy 2015 Antti-Juhani Kaijanaho 26. marraskuuta 2015 TIETOTEKNIIKAN LAITOS TIEA241 Automaatit ja kieliopit, syksy 2015 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 26. marraskuuta 2015 Sisällys Tunnistamis- ja jäsennysongelma Olkoon G = (N, Σ, P, S) kontekstiton kielioppi ja

Lisätiedot

Sisällys. 16. Ohjelmoinnin tekniikkaa. Aritmetiikkaa toisin merkiten. Aritmetiikkaa toisin merkiten

Sisällys. 16. Ohjelmoinnin tekniikkaa. Aritmetiikkaa toisin merkiten. Aritmetiikkaa toisin merkiten Sisällys 16. Ohjelmoinnin tekniikkaa Vaihtoehtoisia merkintöjä aritmeettisille lauseille. Useiden muuttujien esittely ja alustaminen yhdellä lauseella. For-lause lyhemmin. If-else-lause vaihtoehtoisesti

Lisätiedot

16. Ohjelmoinnin tekniikkaa 16.1

16. Ohjelmoinnin tekniikkaa 16.1 16. Ohjelmoinnin tekniikkaa 16.1 Sisällys For-lause lyhemmin. Vaihtoehtoisia merkintöjä aritmeettisille lauseille. Useiden muuttujien esittely ja alustaminen yhdellä lauseella. If-else-lause vaihtoehtoisesti

Lisätiedot

Alityypitys. TIES542 Ohjelmointikielten periaatteet, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos

Alityypitys. TIES542 Ohjelmointikielten periaatteet, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos Alityypitys TIES542 Ohjelmointikielten periaatteet, kevät 2007 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 5. maaliskuuta 2007 Muistatko tietueet? {I 1 = E 1,..., I n = E n } : {I

Lisätiedot

Sisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat. Operaatiot. Imperatiivinen laskenta. Muuttujat. Esimerkkejä: Operaattorit.

Sisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat. Operaatiot. Imperatiivinen laskenta. Muuttujat. Esimerkkejä: Operaattorit. 3. Muuttujat ja operaatiot Sisällys Imperatiivinen laskenta. Muuttujat. Nimi ja arvo. Muuttujan nimeäminen. Muuttujan tyyppi.. Operandit. Arvon sijoitus muuttujaan. Aritmeettiset operaattorit. Arvojen

Lisätiedot

1. Universaaleja laskennan malleja

1. Universaaleja laskennan malleja 1. Universaaleja laskennan malleja Laskenta datan käsittely annettuja sääntöjä täsmällisesti seuraamalla kahden kokonaisluvun kertolasku tietokoneella, tai kynällä ja paperilla: selvästi laskentaa entä

Lisätiedot

12. Javan toistorakenteet 12.1

12. Javan toistorakenteet 12.1 12. Javan toistorakenteet 12.1 Sisällys Yleistä toistorakenteista. Laskurimuuttujat. While-, do-while- ja for-lauseet. Laskuri- ja lippumuuttujat. Tyypillisiä ohjelmointivirheitä. Silmukan rajat asetettu

Lisätiedot

16. Ohjelmoinnin tekniikkaa 16.1

16. Ohjelmoinnin tekniikkaa 16.1 16. Ohjelmoinnin tekniikkaa 16.1 Sisällys Vaihtoehtoisia merkintöjä aritmeettisille lauseille. Useiden muuttujien esittely ja alustaminen yhdellä lauseella. For-lause lyhemmin. If-else-lause vaihtoehtoisesti

Lisätiedot

f(n) = Ω(g(n)) jos ja vain jos g(n) = O(f(n))

f(n) = Ω(g(n)) jos ja vain jos g(n) = O(f(n)) Määritelmä: on O(g(n)), jos on olemassa vakioarvot n 0 > 0 ja c > 0 siten, että c g(n) kun n > n 0 O eli iso-o tai ordo ilmaisee asymptoottisen ylärajan resurssivaatimusten kasvun suuruusluokalle Samankaltaisia

Lisätiedot

Vasen johto S AB ab ab esittää jäsennyspuun kasvattamista vasemmalta alkaen:

Vasen johto S AB ab ab esittää jäsennyspuun kasvattamista vasemmalta alkaen: Vasen johto S AB ab ab esittää jäsennyspuun kasvattamista vasemmalta alkaen: S A S B Samaan jäsennyspuuhun päästään myös johdolla S AB Ab ab: S A S B Yhteen jäsennyspuuhun liittyy aina tasan yksi vasen

Lisätiedot

Approbatur 3, demo 1, ratkaisut A sanoo: Vähintään yksi meistä on retku. Tehtävänä on päätellä, mitä tyyppiä A ja B ovat.

Approbatur 3, demo 1, ratkaisut A sanoo: Vähintään yksi meistä on retku. Tehtävänä on päätellä, mitä tyyppiä A ja B ovat. Approbatur 3, demo 1, ratkaisut 1.1. A sanoo: Vähintään yksi meistä on retku. Tehtävänä on päätellä, mitä tyyppiä A ja B ovat. Käydään kaikki vaihtoehdot läpi. Jos A on rehti, niin B on retku, koska muuten

Lisätiedot

Yhteydettömän kieliopin jäsennysongelma

Yhteydettömän kieliopin jäsennysongelma Yhteydettömän kieliopin jäsennysongelma Yhteydettömän kieliopin jäsennysongelmalla tarkoitetaan laskentaongelmaa Annettu: yhteydetön kielioppi G, merkkijono w Kysymys: päteekö w L(G). Ongelma voidaan periaatteessa

Lisätiedot

Hahmon etsiminen syotteesta (johdatteleva esimerkki)

Hahmon etsiminen syotteesta (johdatteleva esimerkki) Hahmon etsiminen syotteesta (johdatteleva esimerkki) Unix-komennolla grep hahmo [ tiedosto ] voidaan etsia hahmon esiintymia tiedostosta (tai syotevirrasta): $ grep Kisaveikot SM-tulokset.txt $ ps aux

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op) ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 20. huhtikuuta 2018 Vastaa kaikkiin tehtäviin. Tee kukin tehtävä omalle konseptiarkille. Noudata ohjelmointitehtävissä kurssin koodauskäytänteitä.

Lisätiedot

Testaa: Vertaa pinon merkkijono syötteeseen merkki kerrallaan. Jos löytyy ero, hylkää. Jos pino tyhjenee samaan aikaan, kun syöte loppuu, niin

Testaa: Vertaa pinon merkkijono syötteeseen merkki kerrallaan. Jos löytyy ero, hylkää. Jos pino tyhjenee samaan aikaan, kun syöte loppuu, niin Yhteydettömien kielioppien ja pinoautomaattien yhteys [Sipser s. 117 124] Todistamme, että yhteydettömien kielioppien tuottamat kielet ovat tasan samat kuin ne, jotka voidaan tunnistaa pinoautomaatilla.

Lisätiedot

Palautetta viime luennosta

Palautetta viime luennosta Palautetta viime luennosta Kuka saa ja kenen täytyy suorittaa 5op kokonaisuus? Sivuaineopiskelijat suorittavat jos heidän sivuainekokonaisuuteen on merkitty niin Kokonaisuuksia on useita eri tiedekunnittain,

Lisätiedot

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op Assembly ja konekieli Tietokoneen ja ohjelmiston rakenne Loogisilla piireillä ja komponenteilla rakennetaan prosessori ja muistit Prosessorin rakenne

Lisätiedot

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen Chapel TIE-20306 Ryhmä 91 Joonas Eloranta Lari Valtonen Johdanto Chapel on Amerikkalaisen Cray Inc. yrityksen kehittämä avoimen lähdekoodin ohjelmointikieli. Chapel on rinnakkainen ohjelmointikieli, joka

Lisätiedot

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI) Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI) Muuttujat Tietorakenteet Kontrolli Optimointi Tarkistukset 1 Muuttujan X osoite on 230 Muuttujan X arvo on 12 Symbolin X arvo on 230 symbolit ovat yleensä

Lisätiedot

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI) Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI) Muuttujat Tietorakenteet Kontrolli Optimointi Tarkistukset 1 Muuttujan X osoite on 230 Muuttujan X arvo on 12 Symbolin X arvo on 230 Tieto ja sen osoite

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 2 vastaukset Harjoituksen aiheena on BNF-merkinnän käyttö ja yhteys rekursiivisesti etenevään jäsentäjään. Tehtävä 1. Mitkä ilmaukset seuraava

Lisätiedot

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005 Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005 Tällä luennolla Algebralliset tietotyypit Hahmonsovitus (pattern matching) Primitiivirekursio Esimerkkinä binäärinen hakupuu Muistattehan...

Lisätiedot

4. Lausekielinen ohjelmointi 4.1

4. Lausekielinen ohjelmointi 4.1 4. Lausekielinen ohjelmointi 4.1 Sisällys Konekieli, symbolinen konekieli ja lausekieli. Lausekielestä konekieleksi: - Lähdekoodi, tekstitiedosto ja tekstieditorit. - Kääntäminen ja tulkinta. - Kääntäminen,

Lisätiedot

Johdanto II. TIE303 Formaalit menetelmät, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos.

Johdanto II. TIE303 Formaalit menetelmät, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos. TIE303 Formaalit menetelmät, kevät 2005 Johdanto II Antti-Juhani Kaijanaho antkaij@mit.jyu.fi Jyväskylän yliopisto Tietotekniikan laitos TIE303 Formaalit mentetelmät, 2005-01-20 p. 1/21 Luento2Luentomoniste

Lisätiedot

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op Assembly ja konekieli Tietokoneen ja ohjelmiston rakenne Loogisilla piireillä ja komponenteilla rakennetaan prosessori ja muistit Prosessorin rakenne

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 5: Sijoituslause, SICP-oliot, tietorakenteen muuttaminen (mm. SICP 33.1.3, 3.33.3.2) Riku Saikkonen 6. 11. 2012 Sisältö 1 Muuttujan arvon muuttaminen:

Lisätiedot