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. Tyyppiteoriaa Yksinkertaisesti tyypitetty λ-laskento Alityypitys Rekursiiviset tyypit System F Hindley Milner Damas -tyypitys 100 Luku 7. Samanaikaisuus Jaettu muisti Erilliset kommunikoivat prosessit 101 Luku 8. Abstraktit tietorakenteet ja modulit 103 Luku 9. Olioabstraktio 105 Kirjallisuutta 107 Liite A. Neloskoneen systeemikutsut 111 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 123 Liite C. Semanttiset alueet Tuloalueet Summa-alueet Funktioalueet 129 Liite D. ALKEIS-suoran kääntäjä Pääohjelma Selain Apuluokat Lauseet Tyypit Lausekkeen jäsennin Primäärilausekkeet Operaattorilausekkeet Muunnoslausekkeet 175

5

6 LUKU 6 Tyyppiteoriaa Tyyppiteoria on alun perin ollut logiikan ala, josta se on sittemmin laajentunut osaksi tietojenkäsittelyteoriaa, erityisesti tärkeäksi ohjelmointikielten teoriaa. Keskeinen perusteoria siinä on tyypitetty λ-laskento erilaisine laajennuksineen. Ohjelmointikielten näkökulmasta tyyppiteorian peruskirja on Piercen Types and Programming Languages [37]. 1. Yksinkertaisesti tyypitetty λ-laskento Yksinkertaisesti tyypitetyn λ-laskennon abstrakti syntaksi: ε ::=ι muuttuja ε 1 ε 2 applikaatio ν arvo τ ::=A perustyypit ν ::=ν A Γ ::= τ 1 τ 2 funktiotyyppi perustyypin vakio λι: τ.ε abstraktioarvo 1 tyhjä ympäristö Γ, ι : τ muuttujantyypitys Perustyyppien joukkoa merkitään A, joten A A on tosi. Kuten tyypittömässäkin λ-laskennossa, applikaatio assosioi vasemmalle. Hieman yllättäen vastaavasti funktiotyyppi assosioi oikealle: ε 1 ε 2 ε 3 = (ε 1 ε 2 )ε 3 mutta τ 1 τ 2 τ 3 = τ 1 (τ 2 τ 3 ). Operationaalinen semantiikka call by value -tyyliin: Tilat koostuvat pelkästään lausekkeista; lopputiloja ovat ne lausekkeet, jotka 1 Tarkkaan ottaen tämä on ns. heikko päänormaalimuoto (engl. Weak Head Normal Form) (WHNF). 91

7 92 6. TYYPPITEORIAA ovat arvoja. ε 1 ε 1 ε 1 ε 2 ε 1ε 2 ε ε νε νε (λι : τ.ε)ν = ε[ν/ι] Call by name (tilat samoja kuin edellä): ε 1 ε 1 ε 1 ε 2 ε 1ε 2 (λι : τ.ε 1 )ε 2 = ε 1 [ε 2 /ι] Tämä operationaalinen semantiikka ei tuota normaalimuotoja vaan heikkoja päänormaalimuotoja (engl. weak head normal form), lyhennetään WHNF. Lauseke on WHNF, jos se on vakio, muuttuja tai abstraktio. Päänormaalimuodolta (engl. head normal form, HNF) vaaditaan lisäksi, että jos se on abstraktio niin sen sisällä ei ole β-redeksejä (δ-redeksejä saa olla). WHNF riittää ohjelmointikielikäyttöön hyvin ja vastaa itse asiassa täysin ohjelmointikielten vakiintunutta semantiikkaa. Tyypityssäännöt ovat seuraavat: Γ ν A : A ι : τ Γ Γ ι : τ Γ, ι : τ 1 ε : τ 2 Γ (λι : τ 1.ε) : τ 1 τ 2 Γ ε 1 : τ 1 τ 2 Γ ε 2 : τ 1 Γ ε 1 ε 2 : τ 2 Tyyppiteorian tärkeä tehtävä on todistaa tyyppiturvallisuus (engl. type safety), Robin Milnerin sanoin well-typed programs cannot go wrong eli modernein sanakääntein: tyyppitarkastuksen hyväksymät ohjelmat eivät jumita (operationaalisen semantiikan abstraktia) konetta. Sivuutamme tämän asian tarkemman tarkastelun tässä; kiinnostuneiden kannattaa lukea edellä mainittu Piercen kirja [37].

8 1. YKSINKERTAISESTI TYYPITETTY λ-laskento 93 Kumitus (engl. erasure) määrittelee yhteyden tyypitetyn ja tyypittömän laskennon välille: erase(ι) = ι erase(λι : τ.ε) = λι. erase(ε) erase(ε 1 ε 2 ) = erase(ε 1 ) erase(ε 2 ) 1.1. Kiintopisteoperaattori. Yksinkertaisesti tyypitetyllä λ-laskennolla on se huomattava ominaisuus, että sen jokaisella lausekkeella on normaalimuoto. Huomattavaa se on siksi, että se osoittaa yksinkertaisesti tyypitetyn λ-laskennon olevan tyypitöntä λ-laskentoa heikompi: mitään kiintopisteoperaattoria ei yksinkertaisesti tyypitetyssä λ-laskennossa ole. Sen vuoksi sitä tavallisesti laajennetaan lisäämällä uusi lauseketyyppi: ε ::= fix ε Γ ε : τ τ Γ fix ε : τ ε ε fix ε fix ε fix(λx : τ.ε) ε[fix(λx : τ.ε)/x] erase(fix(ε)) = Y(erase(ε)), missä Y on Y-kombinaattori tai jokin muu tyypittömän λ-laskennon kiintopisteoperaattori. Mienkiintoista on, että kiintopisteoperaattorilla varustetussa yksinkertaisesti tyypitetyssä λ-laskennossa jokaiselle tyypille on olemassa ainakin yksi lauseke, joka on kyseistä tyyppiä. Yksi tällainen lauseke (mielivaltaiselle tyypille T) on fix(λy : T.y). Tällä lausekkeella ei ole normaalimuotoa, mutta sen tyyppi on silti T. Voidaan ajatella, että tämä lauseke edustaa tyypin T määrittelemätöntä lauseketta (engl. undefined expression) eli pohjaa. Ohjelmointikielissä, jotka rakentuvat tyypitetyn λ-laskennon päälle, on tavallisesti kielioppimakeisena (engl. syntactic sugar) 2 niinsanottu letrec-rakenne, joka mahdollistaa rekursiiviset määrittelyt. Se on 2 Syntactic sugar causes cancer of the semicolon. Alan Perlis [33].

9 94 6. TYYPPITEORIAA helppo määritellä kiintopisteoperaattorin avulla: letrec ι : τ = ε 1 in ε 2 (λι : τ.ε 2 ) fix(λι : τ.ε 1 ) 1.2. Yksikkötyyppi. Yksinkertaisesti tyypitetty λ-laskento soveltuu erinomaisesti ohjelmointikielen ytimeksi 3. Ohjelmointi raa alla λ-laskennolla on kuitenkin ohjelmoijalle raskasta ja hankala toteuttaa tehokkaasti; siksi sitä on tapana laajentaa. Ensimmäinen tällaisista ilmaisuvoiman kannalta epäolennaisista mutta käyttökelpoisuuden kannalta hyödyllisistä laajennuksista on yksikkötyyppi (engl. unit type), jossa on yksi arvo (normaalimuotoinen lauseke): τ ::= Unit ν ::= unit Γ unit : Unit Yksikkötyyppi vastaa C-sukuisten kielten void-tyyppiä, mutta toisin kuin void, Unit on täysivaltainen tyyppi ja siinä on arvo. Toteutus voi toki optimoida sen käytön kokonaan pois, sillä tyyppi, jossa on n eri arvoa, tarvitsee yhden arvon esittämiseen log 2 n bittiä, ja log 2 1 = Perustyypit. Sivuutetaan nyt lukutyyppien ja muiden sellaisten tuominen λ-laskentoon: ne eivät opeta meille mitään uutta. 3 Tällaisia ohjelmointikieliä sanotaan usein funktionaalisiksi kieliksi eli funktiokieliksi (engl. functional language), vaikka funktiokieli voi kyllä rakentua myös suoraviivaisen imperatiivisen ohjelmoinnin päälle.

10 1. YKSINKERTAISESTI TYYPITETTY λ-laskento 95 Sen sijaan hyödyllistä on laajentaa laskentoa vielä totuusarvoilla, vaikka ne voitaisiinkin esittää Churchin koodauksina: τ ::= Bool ν ::= true false ε ::= if ε 1 then ε 2 else ε 3 Γ true : Bool Γ false : Bool Γ ε 1 : Bool Γ ε 2 : τ Γ ε 3 : τ Γ if ε 1 then ε 2 else ε 3 : τ ε 1 ε 1 if ε 1 then ε 2 else ε 3 if ε 1 then ε 2 else ε 3 if true then ε 1 else ε 2 ε 1 if false then ε 1 else ε 2 ε ALKEIS-while ja λ-laskento. Jos λ-laskennossa noudatetaan call by value -semantiikkaa, niin peräkkäistys voidaan saada aikaan seuraavasti: ε 1 ; ε 2 (λx : Unit.ε 2 ) ε 1, kunhan x ei esiinny ε 1 :ssä vapaana. Meillä on nyt riittävästi koneistoa sen osoittamiseen, että ALKEISwhilen keskeiset rakenteet on mahdollista kääntää edellä laajennettuun λ-laskentoon: T var ι 1 : τ 1 ; ; ι n : τ n begin κ end σ = T κ (σ {(ι 1, τ 1 ),..., (ι n, τ n )}) { (λι : τ.t κ σ) jos ε : τ ja (ι, τ ) σ T ι ε; κ σ = muuten T κ 1 ; κ 2 σ = T κ 1 σ;t κ 2 σ

11 96 6. TYYPPITEORIAA missä κ 1 ei ole sijoituslause T if ε then κ 1 else κ 2 σ = if ε then T κ 1 σ else T κ 2 σ T while ε do κ {(ι 1 : τ 1 ),..., (ι n, τ n )} = fix(λr, τ 1 τ n Unit. λι 1 : τ λι n : τ n.t κ ; r (ι 1 ( (ι n ) )) ) (ι 1 ( (ι n ) )), missä r on uusi muuttuja. Tässä muunnoksessa oletetaan yksinkertaisuuden vuoksi, että jokainen ALKEIS-whilen lauseke tai tyyppi on myös laajennetun λ-laskennon lauseke tai tyyppi. Ainoa keskeinen ALKEIS-whilen ominaisuus, joka ei tällä tekniikalla luonnistu suoraan, on päivitettävät taulukot Monikot. Monikko (engl. tuple) on tietorakenne, joka on muuten kiinteäkokoisen taulukon kaltainen, mutta sen kukin alkio voi olla omaa tyyppiään ja indeksi ei voi olla lauseke vaan sen on oltava vakio: τ ::= (τ 1,..., τ n ) ν ::= (ν 1,..., ν n ) ε ::= (ε 1,..., ε n ) ε 1 [k]

12 1. YKSINKERTAISESTI TYYPITETTY λ-laskento 97 k on kokonaislukuvakio Γ ε 1 : τ 1 Γ ε n : τ n Γ (ε 1,..., ε n ) : (τ 1,..., τ n ) Γ ε : (τ ) Γ ε : τ Γ ε : () Γ ε : Unit Γ ε : (τ 1,..., τ n ) Γ ε[k] : τ k (ν 1,..., ν n )[k] ν k ε ε ε[k] ε [k] ε k ε k (ν 1,..., ν k 1, ε k, ε k+11,..., ε n ) (ν 1,..., ν k 1, ε k, ε k+11,..., ε n ) (ε) ε () unit Tässä samastettiin 1-alkioinen monikko alkioonsa ja 0-alkioinen monikko yksikkötyypin arvoon. Kaksialkioista monikkoa sanotaan pariksi (engl. pair), kolmealkioista monikkoa kolmikoksi (engl. triplet), nelialkioista monikkoa nelikoksi (engl. quadruple), viisialkioista monikkoa viisikoksi (engl. quintuple), kuusialkioista monikkoa kuusikoksi (engl. sextuple) ja seitsenalkioista monikkoa seitsikoksi (engl. septuple). Enemmänkin nimiä on, mutta jo nelikkoa pidempien monikkojen nimet ovat harvinaisia. Monikkotyyppejä sanotaan toisinaan tulotyypeiksi (engl. product types) Tietueet. Muistetaan aluksi, että monikko on kiinteäkokoinen taulukonomainen tietorakenne, jossa kukin alkio voi olla eri tyyppiä ja jossa alkioiden indeksin tulee olla käännösaikainen vakio.

13 98 6. TYYPPITEORIAA Tietue on monikon kaltainen vekotin, jossa alkioiden indeksien tilalla on alkioiden nimet: esimerkiksi {a = 4, b = true} on tietue, jonka tyyppi on {a : Int, b : Bool}. Toisin kuin useimmissa ohjelmolintikielissä tyyppiteoriassa ajatellaan tavallisesti, että tietueen kenttien järjestyksellä ei ole väliä vaan esimerkiksi tietuetyypit {a : Int, b : Bool} ja {b : Bool, a : Int} ovat sama tyyppi ja vastaavasti tietueet {a = 4, b = true} ja {b = true, a = 4} ovat sama tietue. Tietueen kentän arvo saadaan lausekkeella t.l, missä t on tietue ja l on kentän nimi. TEHTÄVÄ 6.1. Määrittele tietueet formaalisti Variantit. Variantti eli erillinen yhdiste (engl. tagged union) on tietueen kaltainen vekotin, joka eroaa tietueesta siinä, että se tallentaa vain yhden kentän arvoa kerrallaan. Esimerkiksi varianttityyppiin a : Int, b : Bool kuuluvat muiden muassa varianttiarvot a = 4 ja b = true. Sen sijaan varianttiarvoa a = 4, b = true ei ole olemassakaan! Varianttityypeille kuuluu sama tyyppien samuussääntö kuin tietuetyypeille: kenttien järjestyksellä ei ole merkitystä. Variantin kentän arvon saaminen ei ole yhtä helppoa kuin tietueissa. Periaatteessa ohjelmoijan tulee varautua siihen, että variantti voi sisältää mitä vain tyyppinsä sisältämää dataa. Tämän vuoksi järkevin rakenne variantin arvon saamiseksi on case-lauseke: case v of a = x x + 2 b = x not x Jos tässä lausekkeessa v:n arvo on a = 4, niin lausekkeen arvo on 6; jos taas v:n arvo on b = true, niin lausekkeen arvo on false. TEHTÄVÄ 6.2. Määrittele variantit formaalisti. Variantit ovat läheistä sukua summatyypeille (engl. sum type). Summatyyppi voidaan käsittää varianttityypiksi, jossa kunkin kentän nimi on kyseisen kentän tyypin nimi ja kahdella kentällä ei ole samaa tyyppiä Algebralliset tietotyypit. Haskellissa voidaan kirjoittaa seuraavasti: data Lauseke = Plus Lauseke Lauseke Miinus Lauseke Lauseke Kerto Lauseke Lauseke Jako Lauseke Lauseke Jaannos Lauseke Lauseke Kokonaisluku Integer Liukuluku Double Tämä määrittelee tyypin nimeltä Lauseke. Määrittelyn vaikutusalueella voidaan nimiä Plus, Miinus, Kerto, Jako, Jaannos, Kokonaisluku

14 1. YKSINKERTAISESTI TYYPITETTY λ-laskento 99 ja Liukuluku käyttää koostinfunktioina (engl. constructor), joista kaksi viimeistä ottavat yhden parametrin (Kokonaisluku ottaa parametrin tyyppiä Integer, Liukuluku ottaa Doublen) ja loput ottavat kaksi Lauseke-tyyppistä parametria. Tässä määritelty tyyppi toimii vastaavasti kuin λ-laskennon monikoita ja variantteja käyttäen esitelty tyyppi Plus : (Lauseke, Lauseke), Miinus : (Lauseke, Lauseke), Kerto : (Lauseke, Lauseke), Jako : (Lauseke, Lauseke), Jaannos : (Lauseke, Lauseke), Kokonaisluku : Integer, Liukuluku : Double Lauseke-parametrin ottavia funktioita voidaan Haskellissa määritellä paloittain hahmontunnistuksella siten, että parametrin paikalle kirjoitetaan jokin koostimista ja sen parametreiksi nimiä (tai sitten muita samanlaisia hahmoja): sievenna :: Lauseke -> Lauseke sievenna (Plus (Kokonaisluku i) (Kokonaisluku j)) = Kokonaisluku (i + j) sievenna (Miinus (Kokonaisluku i) (Kokonaisluku j)) = Kokonaisluku (i - j) sievenna (Kerto (Kokonaisluku i) (Kokonaisluku j)) = Kokonaisluku (i * j)... Tyyppejä, (1) jotka ovat oleellisesti monikoita sisältäviä variantteja, joissa variantin kenttien nimet voidaan valita vapaasti, (2) joiden kentännimet toimivat koostinfunktioina lausekkeissa, ja (3) joiden arvoja voidaan sovittaa kentännimistä ja muista hahmoista koostettuun hahmoon, kun funktioita määritellään paloittain, sanotaan algebrallisiksi (algebraic types). Algebrallisia tietotyyppejä on nykyisin lähinnä sellaisissa kielissä kuin ML, Haskell ja Pizza 4. Algebralliset tyypit ovat luonnostaan rekursiivisia: on mahdollista kirjoittaa tyypinmäärittely, jossa määriteltävä tyyppi itse esiintyy koostimen parametrityyppinä. Tätä ominaisuutta tarvitaan useimpien kehittyneiden tietorakenteiden (kuten puut ja verkot) toteuttamiseen. 4 Ks.

15 TYYPPITEORIAA 1.9. Viitteet. 2. Alityypitys Alityypityksessä oleellista on subsumptiosääntö: Jos tyyppi τ 1 on tyypin τ 2 alityyppi (merkitään τ 1 <: τ 2 ), niin kaikki τ 1 :n arvot käyvät τ 2 :n arvoista ja τ 1 - tyyppistä lauseketta voidaan käyttää missä vain missä τ 2 -tyyppistä lauseketta voidaan käyttää. 3. Rekursiiviset tyypit Rekursiiviset tyypit mahdollistavat mielivaltaisen kokoisten tietorakenteiden tyypittämisen. FIXME 4. System F Geneerisen polymorfismin perusteoria. FIXME 5. Hindley Milner Damas -tyypitys Let-polymorfismin perustekniikka. FIXME

16

17 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. Compiling with Continuations. Cambridge University Press, Cambridge, [6] Andrew W. Appel ja Jens Palsberg. Modern Compiler Implementation in Java. Cambridge University Press, Cambridge, 2. laitos, [7] 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 [8] C. J. Burgess. Software quality issues when choosing a programming language. Kirjassa Software Quality Management III Vol. 2, sivua Computational Mechanics Publications, [9] O.-J. Dahl, E. W. Dijkstra, ja C. A. R. Hoare. Structured Programming. Academic Press, Lontoo, [10] Edsger W. Dijkstra. Go to statement considered harmful. Communications of the ACM, 11(3), Maaliskuu Letter to the editor. [11] Edsger W. Dijkstra. A Discipline of Programming. Prentice-Hall, Englewood Cliffs, NJ, [12] Erich Gamma, Richard Helm, Ralph Johnson, ja John Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley, Boston, [13] 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, [14] C. A. R. Hoare. A hard act to follow. Higher-Order and Symbolic Computation, 13(1 2):71 72, [15] C. A. R. Hoare. Assertions: a personal perspective. IEEE Annals of the History of Computing, 25(2), [16] 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, [17] International Organization for Standardization. Information lechnology Syntactic metalanguage Extended BNF, ISO/IEC 14977:1996(E). [18] International Organization for Standardization. Programming languages C, ISO/IEC 9899:1999. [19] Antti-Juhani Kaijanaho ja Benjamin Fallenstein. Totally different structural programming: Programming languages in ZigZag. WWW: 107

18 108 KIRJALLISUUTTA jyu./antkaij/plinzz.pdf, Elokuu An invited talk presented at the First International ZigZag Conference, part of ACM Hypertext Conference 2001 in Århus, Denmark on August 14, [20] Richard Kelsey, William Klinger, Jonathan Rees, et al. Revised 5 report on the algorithmic language Scheme. ACM SIGPLAN Notices, 33(9):26 76, Syyskuu [21] Heiko Kießling ja Uwe Krüger. Blocks and procedures. SIGPLAN Notices, 28(11), [22] Donald E. Knuth. Backus normal form vs. backus naur form. Communications of the ACM, 7(12), Joulukuu Letter to the editor. [23] Donald E. Knuth. Structured programming with go to statements. Computing Surveys, 6(4), Joulukuu [24] 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 [28]. [25] Thomas E. Kurtz. BASIC. ACM SIGPLAN Notices, 13(8): , Elokuu Preprints, First ACM SIGPLAN History of Programming Languages Conference. [26] Patricia K. Lawlis. Guidelines for choosing a computer language: Support for the visionary organization, Elokuu [27] John McCarthy. History of LISP. ACM SIGPLAN Notices, 13(8): , Elokuu Preprints, First ACM SIGPLAN History of Programming Languages Conference. [28] N. Metropolis, J. Howlett, ja Gian-Carlo Rota (toim.). A History of Computing in the Twentieth Century. Academic Press, New York, [29] Robin Milner. A theory of type polymorphism in programming. Journal of Computer and System Sciences, 17(3): , [30] Hanspeter Mössenböck. Treating statement sequences as block objects. SIGPLAN Notices, 27(8), [31] Peter Naur et al. Revised report on the algorithmic language ALGOL 60. Communications of the ACM, 6(1):1 17, Tammikuu [32] John K. Ousterhout. Scripting: Higher-level programming for the 21st century. Computer, 31(3):23 30, Maaliskuu [33] Alan J. Perlis. Epigrams on programming. ACM SIGPLAN Notices, 17(9), Syyskuu [34] Simon Peyton Jones (toim.). Haskell 98 Language and Libraries: The Revised Report. Cambridge University Press, Huhtikuu [35] Simon Peyton Jones. Haskell 98 language and libraries: The revised report. Journal of Functional Programming, 13(1), Tammikuu [36] Simon L. Peyton Jones. The Implementation of Functional Programming Languages. Prentice-Hall, New York, [37] Benjamin C. Pierce. Type and Programming Languages. MIT Press, Cambridge, MA, [38] Eric S. Raymond. The Art of Unix Programming. Addison-Wesley, Boston, [39] John C. Reynolds. Theories of Programming Languages. Cambridge University Press, Cambridge, [40] 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, 1977.

19 KIRJALLISUUTTA 109 [41] Christopher Strachey. Fundamental concepts in programming languages. Higher-Order and Symbolic Computation, 13:11 49, Perustuu Stracheyn vuonna 1967 pitämiin luentoihin. [42] A. van Wijngaarden et al. (toim.). Revised Report on the Algorithmic Language Algol 68. Springer, Berliini, [43] Larry Wall. Perl, the first postmodern computer language. org/ larry/pm.html, A talk given in Linux World Spring 1999.

20

21

22 LIITE B Ohjelmointikielten historia Tässä liitteessä esitetään ohjelmointikielten historian päävaiheet. 1. Kaksi ensimmäistä sukupolvea: ennen vuotta 1955 Ensimmäiset ohjelmointikielet olivat konekieliä ja niillä kirjoitetut ohjelmat olivat bittijonoja tietokoneen muistissa. Ohjelmat syötettiin koneelle kytkimiä kääntelemällä. Konekieli on ratkaisuavaruuden sydämessä: konekielellä ei ole kääntäjää tai tulkkia, joka auttaisi ihmistä ongelman tuomisessa ratkaisuavaruuteen. Ohjelmien kirjoittaminen konekielellä on erittäin virhealtista ja toisaalta hyvin mekaanista puuhaa. Jo hyvin varhaisessa vaiheessa alettiin kirjoittaa ohjelmia, jotka auttoivat tässä prosessissa. Ihmiset kirjoittivat sopivalla tavalla muotoiltua tekstiä, ja nämä ohjelmat muunsivat sen konekieleksi. Tyypillisesti tässä syötteessä yksi rivi vastaa yhtä konekielen käskyä. Tätä ohjelmointikieltä kutsutaan symboliseksi konekieleksi (engl. assembler language), ja ohjelmaa, joka kääntää tällä kirjoitetun ohjelman konekielellä, sanotaan assembleriksi. Konekielet muodostavat ohjelmointikielten ensimmäisen sukupolven ja symboliset konekielet ohjelmointikielten toisen sukupolven. Ongelmana näissä on ohjelmoinnin virhealttius ja vahva mekaanisuus sekä se, että jokaisella konetyypillä on oma konekielensä ja sitä vastaava symbolinen konekieli. Ohjelmia ei voitu siirtää konetyyppien välillä, vaan ne jouduttiin kirjoittamaan uudestaan aina kullekin uudelle konetyypille. 2. Automaattinen ohjelmointi ja ohjelmointikielten synty: Ongelman ratkaisuksi esitettiin automaattista ohjelmointia, joksi sitä silloin 1950-luvun alkupuolella sanottiin. Kyse oli siitä, että ohjelmoija esittää tietokoneelle ongelman kuvauksen jollakin formaalilla kielellä, ja jokin erityinen ohjelma tuottaa siitä konekielisen ohjelman, joka ratkaisee ongelman. Eivät ne formaalit kielet mitenkään kummoisia olleet, mutta senaikaiseen tietämykseen nähden ne 117

23 118 B. OHJELMOINTIKIELTEN HISTORIA olivat tekoälytutkimuksen (josta ei tuota nimeä vielä käytetty) huippua. Nykyään näitä formaaleja kieliä sanotaan korkean tason tai kolmannen sukupolven ohjelmointikieliksi ja ohjelmia, jotka tekevät niillä kirjoitetuista ongelmakuvauksista konekielisiä ohjelmia, sanotaan kääntäjiksi (engl. compiler). Näitä varhaisia kieliä on esitelty Knuthin ja Trabb Pardon artikkelissa vuodelta 1977 [24]. Automaattiseen ohjelmointiin eivät useimmat ihmiset uskoneet, ennen kuin Fortran tuli kuvioihin 1950-luvun lopulla ensimmäinen versio julkaistiin keväällä 1957, mutta kielestä oli siinä vaiheessa puhuttu jo monta vuotta. Fortran oli ensimmäinen merkittävää kannatusta saavuttanut korkean tason ohjelmointikieli (ja kiinnostavaa kyllä, edelleen laajassa käytössä, tosin reilusti muuttuneena). Ensimmäinen Fortran-kääntäjä oli vaikea tehtävä: sitä tehtiin kolme vuotta ja siihen kului 18 ihmistyövuotta. Tätä työtä johti John Backus, joka on myöhemminkin ollut merkittävä tekijä ohjelmointikieliteknologian alalla. Fortanin merkitys ohjelmointikielten kehitykselle on kiistaton. Se oli alan pioneerityö: se sai ihmiset uskomaan korkean tason ohjelmointikieliin ylipäätään. Lisäksi monet sen ominaisuudet ovat edelleen ohjelmointikielissä tärkeitä: taulukkomuuttujat, muuttujan ohjaamat silmukat (ns. for-silmukat) sekä haarautuva if-lause (if statement) ovat nykykielissäkin peruskamaa. Fortran oli tarkoitettu tieteellisen laskennan ohjelmien kirjoittamiseen. John McCarthy, tekoälytutkimuksen kantaisä, halusi kielen symbolista tiedonkäsittelyä (esimerkiksi algebrallisten funktioiden symbolista derivointia) varten. McCarthy ja muutamat muut laajensivat Fortrania aluksi symbolista laskentaa varten, mutta tämän rajat tulivat pian vastaan. He aloittivat uuden kielen, Lispin, kehittämisen ensin paperilla ja käsikääntäen sillä kirjoitettuja ohjelmia paperille. Kun sitten huomattiin, että teoreettiseksi leluksi tarkoitettu Lisp-funktio eval toimii mainiosti Lisp-tulkkina, oli Lisp-toteutus valmis [27]. Fortranin tapaan Lispin merkitys myöhemmille ohjelmointikielille on merkittävä. Lispin mukana näkivät päivänvalon mm. rekursiiviset aliohjelmat, muistinsiivous (engl. garbage collection) ja if-lauseke (if expression). Nykyisin Lispistä on käytössä kolme merkittävää murretta: Emacs Lisp, Common Lisp ja Scheme. Algoritmien julkaisemiseen kehitettiin komiteatyönä 1950-luvun lopulla uusi kieli, Algol (tämän sanotaan usein olevan lyhenne sanoista Algorithmic language, mutta se viittaa myös samannimiseen kolmoistähteen). Algol 60 [31] oli kolmas 1950-luvun loppupuolella kehitetty kieli, jolla on ollut merkittävää merkitystä ohjelmointikielten tulevalle kehitykselle. Algol 60 oli ensimmäinen lohkorakenteinen kieli. Sillä oli vapaamuotoinen, rakenteinen syntaksi.

24 3. BAABELIN TORNI: 1960-LUKU 119 Siinä oli muuttujien tyyppien esittelyt ja arvovälitteiset (engl. call-byvalue) aliohjelmaparametrit. Nämäkin kaikki ovat lähes välttämättömiä nykykielissä. Tony Hoare kirjoitti Algol 60:stä vuonna 1973 seuraavasti: [13] Tässä on kieli, joka on niin edellä aikaansa, että se oli paitsi edeltäjiään myös lähes kaikkia seuraajiaan parempi luvun lopulla kehitettiin myös kaksi muuta suosiota saavuttanutta kieltä, Cobol ja APL. Kummankin merkitys ohjelmointikielten kehitykselle kokonaisuutena on kuitenkin vähäinen, joten niihin ei tämän enempää puututa. 3. Baabelin torni: 1960-luku 1960-luvulla suunniteltiin satoja uusia ohjelmointikieliä, joista hyvin harva jäi eloon. Nimet Adam, AED, Altran, CLP, Dyana ja Unicode eivät nykyään liity ohjelmointikieliin lainkaan mutta ne kaikki olivat vuonna 1967 käytössä olleita ohjelmointikieliä. Monet näistä kielistä oli tarkoitettu johonkin erityiseen tarkoitukseen. Algol-perhe sai uuden jäsenen, Algol 68:n, joka kokonsa ja vaikealukuisen määrittelynsä [42] vuoksi jäi pääosin käyttämättä. Samoihin aikoihin Niklaus Wirth ja Tony Hoare suunnittelivat oman seuraajansa Algol 60:lle, jota on kutsuttu Algol W:ksi. Norjalaiset Kristen Nygaard ja Ole-Johan Dahl kehittivät Simulakielen simulointien kirjoittamiseen. Simulan merkitys nykykielille on ollut valtava, samaa suuruusluokkaa kuin Algol-perheen ja Lispin: Simulasta alkoi olio-ohjelmoinnin perinne jo Simula I:n yhteydessä puhuttiin olioista ja luokista. Perintä lisättiin Simula 67:ään. David Farber, Ralph Griswold ja Ivan Polonsky kehittivät Snobolkielen merkkijonojen käsittelyä varten Snobol vaikutti suuresti tulevien kielten (esimerkiksi Perlin) merkkijono-ominaisuuksiin luvun lapsia on myös BASIC. Dartmouth Collegessa haluttiin luoda tietokonejärjestelmä ja sille ohjelmointikieli, jotka ovat niin helppoja, että niiden käyttöä voitaisiin opettaa kaikille humanisteille. BASIC sai monia vaikutteita Algol 60:stä, mutta jätti monta (näin jälkiviisaasti sanoen: hyvin tärkeätä) sen ominaisuutta pois. Esimerkiksi lohkorakenne tiputettiin pois, koska sitä ei haluttu selittää humanisteille [25]. IBM:n ja muun teollisuuden yhteistyönä kehitettiin 60-luvulla PL/I (oikeastaan PL/1, mutta ykkönen on tapana tässä tapauksessa kirjoittaa isona I-kirjaimena), joka oli yritys luoda eräänlainen universaali ohjelmointikieli. Aiemmin oli ohjelmointitehtävät ja ohjelmoijat jakautuneet kahteen selvään ryhmään: tieteellinen laskenta, jossa

25 120 B. OHJELMOINTIKIELTEN HISTORIA tarvittiin liukulukulaskentaa, taulukoita ja aliohjelmia, sekä hallinnollinen tietojenkäsittely, jossa tarvittiin kiintolukulaskentaa (engl. fixedpoint arithmetic), tehokasta siirräntää (engl. input/output) ja merkkijonojen käsittelyä luvulla tämä jako alkoi hämärtyä, ja eräs PL/I:n oleellisimmista tavoitteista oli toimia molempien ryhmien ohjelmointikielenä. Kieli oli 60- ja 70-luvuilla varsin suosittu ja IBM tukee sitä edelleen, mutta nykyisin sitä pidetään (yhdessä Algol 68:n kanssa) lähinnä varoittavana esimerkkinä laajasta ja vaikeasta kielestä. PL/I oli ensimmäinen ohjelmointikieli, joilla on muodollisesti (PL/I:n tapauksessa VDM:llä) määritelty merkitysoppi (engl. semantics). 4. Modernismi: 1970-luku 1970-luvulla alettiin rakentaa edellisen vuosikymmenen Baabelin tornin raunioiden päälle. Tärkeinä lähtökohtina pidettiin kielen yksinkertaisuutta ja johdonmukaisuutta. Samaan aikaan puhuttiin paljon rakenteisesta ohjelmoinnista [9] (engl. structured programming), ja monet 70-luvulla suunnitelluista kielistä oli nimenomaisesti suunniteltu rakenteista ohjelmointia ajatellen luvun kielet ovat ensimmäisiä, joita voi kutsua moderneiksi. Edellisinä kahtena vuosikymmenenä oli kehitetty niin paljon kieliä, että niiden virheistä saattoi oppia jotain merkittävää luvun jälkeen on myöskin ilmaantunut hyvin vähän radikaaleja, uusia ideoita ohjelmointikielten alalla kielet ovat kyllä kehittyneet mutta vähittäin. Niklaus Wirth ei todellakaan pitänyt Algol 68:sta. Hän alkoi suunnitella uutta kieltä Algol-perinteen sisällä aiemman Algol W:nsä pohjalta. Tulos oli Pascal, toisaalta opetukseen mutta toisaalta myös käytännön ohjelmointityöhön tarkoitettu kieli. Pascalin eräs varhainen, aikoinaan suosittu toteutus perustui samantyyppiselle virtuaalikoneratkaisulle kuin Java nykyisin. Toinen Algol-perinteeseen kytkeytynyt uusi kieli oli Dennis Ritchien C. C oli tarkoitettu raakaan järjestelmäohjelmointiin: sillä oli tarkoitus kirjoittaa (ja kirjoitettiinkin) UNIX kokonaan uudestaan. C:n merkitystä myöhemmille kielille on vaikea yliarvioida, vaikka se sinänsä ei sisältänytkään juuri mitään kieliteknologista uutta sen merkittävyys johtuu siitä, että se on erittäin suosittu. Olio-ohjelmointi ei vielä 1970-luvulla ollut kovin merkittävässä asemassa. Xeroxin PARC-laboratorioissa kehitettiin WIMP-käyttöliittymää, ja merkittävä osa tätä kehitystyötä oli Smalltalk-kielen kehitys. Smalltalk on edelleen yksi puhtaimmista oliokielistä. Itse kieli on hyvin pieni, mutta sen peruskirjasto on järkyttävän suuri.

26 5. POSTMODERNISMI: 1980-LUKU 121 Funktio-ohjelmointi oli 1970-luvulla rajoittunut lähinnä Lisp-sukuisten kielten käyttöön. Robin Milner kehitti Edinburghin yliopiston päättelyavustimen käyttöön metakielen (kielen, jolla kuvataan kieliä), jota hän kutsui ML:ksi (lyhenne sanasta meta-language). Sen tapa ajatella ohjelmia sai paljon vaikutteita Lispistä mutta sen syntaksi on Algol-tyyppinen. ML:n ehkä suurin merkitys ohjelmointikielten kehitykselle on Hindley Milner-tyyppijärjestelmä [29], jota mm. Generic Java käyttää tietyin muunnoksin. Samoihin aikoihin Guy Lewis Steele, Jr. ja Gerald Jay Sussman kehittivät uutta Lisp-varianttia, jonka he nimesivät Schemeksi. Scheme käytti Lispin omintakeista Cambridgen-puolalaista [27] syntaksia mutta otti käyttöön Algoleista tutun lohkorakenteisuuden. Schemen kehittäjät olivat vahvasti sitä mieltä, että aliohjelmakutsun ei todellakaan tarvitse olla hidas operaatio [40], ja he suunnittelivat kielensä (ja sen toteutukset) tuon käsityksen ympärille. Schemen määrittelyyn kuuluu edelleen vaatimus häntäkutsun poistamisesta, mitä juuri mikään muu kieli ei nykyisin vaadi, vaikka syytä olisi luvun alussa syntyi ohjelmointikieli nimeltään Prolog, joka oli täysin erilainen kuin aiemmat kielet, eikä nykyisistäkään kielistä kovin monta samantyyppistä löydy. Prologin perusidea on predikaattilogiikan kaavojen tulkitseminen proseduraalisesti siten, että ohjelma koostuu kaavoista, jotka tulkitaan aliohjelmiksi, ja jonkin näistä aliohjelmista kutsuminen vastaa sitä vastaavan kaavan todistamista muiden toimiessa aksioomina. 5. Postmodernismi: 1980-luku 1980-lukua voi hyvällä syyllä sanoa olio-ohjelmoinnin popularisoinnin vuosikymmeneksi. Tällä vuosikymmenellä kehitettiin monta merkittävää olio-ohjelmointiin käytettyä kieltä. Samalla myös funktioohjelmoinnin tutkimus eteni, ja vaikka funktio-ohjelmointi ei saavuttanutkaan samaa suosiota kuin olio-ohjelmointi, myös sen kannalta merkittäviä kieliä kehitettiin luvun alussa alkoi Bjarne Stroustrup kehitellä oliolaajennusta Ritchien C-kieleen. Hän kutsui tuota kieltä nimellä C with classes, mutta varsin pian nimi vaihtui C++:ksi. Vaikka C++ alkoikin oliokielenä, on siihen myöhemmin lisätty paljon muitakin ohjelmointityylejä tukevia ominaisuuksia esimerkiksi C++:n tyyppijärjestelmästä kehittyi oma funktiopohjainen ohjelmointikielensä C++:n sisälle! Toinen tunnettu 1980-luvulla kehitetty oliokieli on Bertrand Meyerin Eiffel. Se on puhdas oliokieli ja sisältää myös tukea ohjelmien formaalille verifioinnille (esi- ja jälkiehdot sekä luokkainvariantit on mahdollista esitellä ja tarkastaa ajoaikana samoja ominaisuuksia löytyi muutamasta aiemmasta kielestä kuten Alphard ja Euclid).

27 122 B. OHJELMOINTIKIELTEN HISTORIA 1980-luvulla saatiin valmiiksi Yhdysvaltain puolustusministeriön toimeksiannosta kehitetty kieli Ada (Augusta Ada Byronin, Lovelacen kreivittären mukaan, jonka on sanottu olleen maailman ensimmäinen ohjelmoija). Adan tärkeimpiä sovelluskohteita olivat alunperin sulautetut järjestelmät ja tosiaikaohjelmistot, erityisesti asejärjestelmät. David Turner kehitti funktiokielen Miranda 1980-luvun puolessa välissä. Se muistutti monessa suhteessa ML:ää, mutta se käytti johdonmukaisesti laiskaa laskentaa (tähän palataan vielä) ja oli puhdas funktiokieli. Mirandan käyttöä rajoitti Turnerin tapa pitää kielestään voimakkaasti kiinni: hän jopa patentoi osia siitä. Samantyyppisiä omia kieliä oli lähes jokaisella funktio-ohjelmoinnista kiinnostuneella tutkijalla, joten vähän myöhemmin perustettiin komitea suunnittelemaan uutta Mirandan kaltaista ohjelmointikieltä luvun loppupuolella syntyi kaksi merkittävää juontokieltä (engl. scripting languages): John Ousterhoutin Tcl ja Larry Wallin Perl. Tcl:n pääideana oli olla kieli, jonka voisi upottaa ohjelmistoihin, Perl syntyi tarpeesta käsitellä tekstitiedostoja mitä erilaisimmin tavoin. Larry Wall [43] kuvaa Perliä maailman ensimmäiseksi postmodernistiseksi ohjelmointikieleksi. Eräässä mielessä koko 1980-lukua voisi kuvailla postmodernismin vuosikymmeneksi. 6. Internetin nousu: 1990-luku Vuonna 1993 alkoi Internetin ikuinen syyskuu, kun Internet alkoi vähitellen nousta tavallisten ihmisten tietoisuuteen. Samalla ohjelmoinnin fokus siirtyi kohti verkkosovelluksia. James Gosling työryhmineen kehitti Java-kielen, vuonna 1995 julkaistun C-sukuisen oliokielen, joka on niin konservatiivisesti suunniteltu, ettei siinä ole juuri mitään uutta. Javan, kuten muidenkin C-sukuisten kielten, merkitys on sen suosikkiasemassa. Aivan 1990-luvun alussa sai edellisellä vuosikymmenellä muodostettu funktiokielikomitea työnsä päätökseen. Tulos oli Haskell, jonka tarkoitus on olla se oikea laiskasti laskeva, puhdas funktiokieli. Tämä tavoite onkin onnistunut. Vuonna 1999 valmistui kielen nykyinen määrittely, Haskell 98. Haskell näyttäisi ratkaisseen funktiokieliä vaivanneen ongelman siirrännästä varsin omintakeisella monadisen tietotyypin käsitteellään. Jo 1980-luvulla alkanut juontokielten kehitys jatkui 1990-luvulla. Guido van Rossum kehitti Pythonin vuosikymmenen alussa, Yukihiro Matsumoto kehitti Rubyn. 90-luvun lapsia ovat myös PHP ja ECMAScript (tunnetaan myös nimellä Javascript).

28 7. SUKUPOLVISTA Sukupolvista Olen edellä viitannut ohjelmointikielten ensimmäiseen, toiseen ja kolmanteen sukupolveen. Kukaan ei näytä tietävän, mistä koko sukupolvijaottelu on peräisin, ja lähteet määrittelevät sukupolvet kukin omalla tavallaan. Edellä esittelemäni määritelmät kolmelle ensimmäiselle sukupolvelle ovat jonkinlainen lähteiden konsensus, vaikka poikkeaviakin esityksiä olen nähnyt. Useimmat lähteet puhuvat myös neljännestä ja viidennestä sukupolvesta, mutta mitään yksimielisyyttä niiden sisällöstä ei ole.

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

Johdantoa ohjelmointikielten periaatteisiin

Johdantoa ohjelmointikielten periaatteisiin Johdantoa ohjelmointikielten periaatteisiin Antti-Juhani Kaijanaho 12. tammikuuta 2009 1 Kurssin järjestelyitä 1.1 Opettajat Luennot Antti-Juhani Kaijanaho (antti-juhani.kaijanaho@jyu.fi), Ag C416.1, vastaanotto

Lisätiedot

Tällä kurssilla tarkastellaan ohjelmointikieliä. Lienee tarpeen yrittää rajata, mitä

Tällä kurssilla tarkastellaan ohjelmointikieliä. Lienee tarpeen yrittää rajata, mitä Luku 1 Johdanto Ohjelmointi on ongelmien ratkaisemista. Asiaa voi katsoa kahdelta kannalta: voi keskittyä ymmärtämään ongelmaa tai ratkaisumalleja. Voidaan ajatella, että maailma jakautuu kahteen osaan,

Lisätiedot

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla 2.5. YDIN-HASKELL 19 tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla kirjaimilla. Jos Γ ja ovat tyyppilausekkeita, niin Γ on tyyppilauseke. Nuoli kirjoitetaan koneella

Lisätiedot

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

Geneeriset tyypit. TIES542 Ohjelmointikielten periaatteet, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos Geneeriset tyypit TIES542 Ohjelmointikielten periaatteet, kevät 2007 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 6. maaliskuuta 2007 Kysymys Mitä yhteistä on seuraavilla funktioilla?

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

Ohjelmointikielten periaatteiden taustaa

Ohjelmointikielten periaatteiden taustaa Ohjelmointikielten periaatteiden taustaa Antti-Juhani Kaijanaho 8. tammikuuta 2007 How many times do I have to tell you? The right tool for the right job! Scotty elokuvassa Star Trek V Ohjelmointi on ongelmien

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

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

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

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

Ydin-Haskell Tiivismoniste

Ydin-Haskell Tiivismoniste Ydin-Haskell Tiivismoniste Antti-Juhani Kaijanaho 8. joulukuuta 2005 1 Abstrakti syntaksi Päätesymbolit: Muuttujat a, b, c,..., x, y, z,... Tyyppimuuttujat α, β, γ,... Koostimet (data- ja tyyppi-) C, D,...,

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

OHJELMOINTIKIELTEN PERIAATTEET ANTTI-JUHANI KAIJANAHO

OHJELMOINTIKIELTEN PERIAATTEET ANTTI-JUHANI KAIJANAHO OHJELMOINTIKIELTEN PERIAATTEET ANTTI-JUHANI KAIJANAHO SYKSY 2002 Copyright c 2002 Antti-Juhani Kaijanaho Permission is granted to copy, distribute and/or modify this document under the terms of the GNU

Lisätiedot

Ohjelmointikielen määritteleminen (tai edes tyhjentävä luonnehtiminen) on todella vaikeaa. Voisi yrittää vaikka näin:

Ohjelmointikielen määritteleminen (tai edes tyhjentävä luonnehtiminen) on todella vaikeaa. Voisi yrittää vaikka näin: Luku 1 Johdanto 1.1 Ohjelmoinnista Ohjelmointi on ongelmien ratkaisemista. Asiaa voi katsoa kahdelta kannalta: voi keskittyä ymmärtämään ongelmaa tai ratkaisumalleja. Voidaan ajatella, että maailma jakautuu

Lisätiedot

Yksinkertaiset tyypit

Yksinkertaiset tyypit Yksinkertaiset tyypit TIES542 Ohjelmointikielten periaatteet, kevät 2007 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 13. helmikuuta 2007 Tyypitön puhdas λ-laskento E ::= I E 1 E 2

Lisätiedot

Ohjelmointikielten periaatteet. Antti-Juhani Kaijanaho

Ohjelmointikielten periaatteet. Antti-Juhani Kaijanaho Ohjelmointikielten periaatteet Antti-Juhani Kaijanaho 3. marraskuuta 2010 2 Esipuhe Tämä moniste on tarkoitettu oheislukemistoksi ja luentojen tueksi Jyväskylän yliopiston tietotekniikan laitoksen kurssilla

Lisätiedot

Ohjelmointikielten periaatteet. Antti-Juhani Kaijanaho

Ohjelmointikielten periaatteet. Antti-Juhani Kaijanaho Ohjelmointikielten periaatteet Antti-Juhani Kaijanaho 26. marraskuuta 2010 2 Esipuhe Tämä moniste on tarkoitettu oheislukemistoksi ja luentojen tueksi Jyväskylän yliopiston tietotekniikan laitoksen kurssilla

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

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

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

sama tyyppi (joka vastaa kaikkien mahdollisten arvojen summa-aluetta). Esimerkiksi

sama tyyppi (joka vastaa kaikkien mahdollisten arvojen summa-aluetta). Esimerkiksi 3.5. TYYPIT 51 3.5.3 Kielitason tyypit Staattinen tyypitys Kielitasolla tyyppejä käytetään sulkemaan pois joitakin merkittäviä ja automaattisesti tunnistettavissa olevia merkitysopillisia virheitä (oliotason

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

PERL. TIE Principles of Programming Languages. Ryhmä 4: Joonas Lång & Jasmin Laitamäki

PERL. TIE Principles of Programming Languages. Ryhmä 4: Joonas Lång & Jasmin Laitamäki PERL TIE-20306 Principles of Programming Languages Ryhmä 4: Joonas Lång & Jasmin Laitamäki 1. Johdanto Perl on ohjelmointikielten perhe, johon kuuluu Perl 5 ja Perl 6. Kielet ovat kuitenkin erilliset ohjelmointikielet

Lisätiedot

815338A Ohjelmointikielten periaatteet

815338A Ohjelmointikielten periaatteet 815338A Ohjelmointikielten periaatteet 2015-2016 II Ohjelmointikielten kehityshistoriaa Sisältö 1. Ohjelmointikielten sukupolvet 2. Pääohjelmointikielten kehitys 815338A Ohjelmointikielten periaatteet,

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

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

TIEA241 Automaatit ja kieliopit, syksy 2015. Antti-Juhani Kaijanaho. 3. joulukuuta 2015

TIEA241 Automaatit ja kieliopit, syksy 2015. Antti-Juhani Kaijanaho. 3. joulukuuta 2015 TIEA241 Automaatit ja, syksy 2015 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 3. joulukuuta 2015 Sisällys Formaalisti Määritelmä Nelikko G = (V, Σ, P, S) on kontekstiton kielioppi (engl. context-free

Lisätiedot

812341A Olio-ohjelmointi, I Johdanto

812341A Olio-ohjelmointi, I Johdanto 812341A Olio-ohjelmointi, 2016 I Johdanto Sisältö 1. Abstraktiosta 2. Olio-ohjelmoinnin historiaa 3. Olioparadigmasta 4. Peruskäsitteiden kertausta 812341A Olio-ohjelmointi, Johdanto 2 1 Abstraktiosta

Lisätiedot

ELM GROUP 04. Teemu Laakso Henrik Talarmo

ELM GROUP 04. Teemu Laakso Henrik Talarmo ELM GROUP 04 Teemu Laakso Henrik Talarmo 23. marraskuuta 2017 Sisältö 1 Johdanto 1 2 Ominaisuuksia 2 2.1 Muuttujat ja tietorakenteet...................... 2 2.2 Funktiot................................

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

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

2.4 Normaalimuoto, pohja ja laskentajärjestys 2.4. NORMAALIMUOTO, POHJA JA LASKENTAJÄRJESTYS 13

2.4 Normaalimuoto, pohja ja laskentajärjestys 2.4. NORMAALIMUOTO, POHJA JA LASKENTAJÄRJESTYS 13 2.4. NORMAALIMUOTO, POHJA JA LASKENTAJÄRJESTYS 13 Toisinaan voi olla syytä kirjoittaa α- tai β-kirjain yhtäsuuruusmerkin yläpuolelle kertomaan, mitä muunnosta käytetään. Esimerkki 4 1. (λx.x)y β = y 2.

Lisätiedot

14.1 Rekursio tyypitetyssä lambda-kielessä

14.1 Rekursio tyypitetyssä lambda-kielessä Luku 14 Rekursiiviset tyypit Edellisessä luvussa esitetyt tietue- ja varianttityypit eivät yksinään riitä kovin mielenkiintoisten tietorakenteiden toteuttamiseen. Useimmissa ohjelmissa tarvitaan erilaisia

Lisätiedot

1. Olio-ohjelmointi 1.1

1. Olio-ohjelmointi 1.1 1. Olio-ohjelmointi 1.1 Sisällys Olio-ohjelmointi on eräs ohjelmointiparadigma. Olio-ohjelmoinnin muotoja. Ohjelmiston analyysi ja suunnittelu. Olioparadigman etuja ja kritiikkiä. 1.2 Ohjelmointiparadigmoja

Lisätiedot

lausekkeiden tapauksessa. Jotkin ohjelmointikielet on määritelty sellaisiksi,

lausekkeiden tapauksessa. Jotkin ohjelmointikielet on määritelty sellaisiksi, 3.5. TYYPIT 59 indeksit voidaan siirtää kielitasolta oliotasolle siirryttäessä alkamaan nollasta. Vain mikäli indeksin alin arvo oliotasolla ei ole tiedossa ennen suorituksen alkua, on tarpeen lisätä taulukko-olioon

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

Ruby. Tampere University of Technology Department of Pervasive Computing TIE Principles of Programming Languages

Ruby. Tampere University of Technology Department of Pervasive Computing TIE Principles of Programming Languages Tampere University of Technology Department of Pervasive Computing TIE-20306 Principles of Programming Languages Ruby Ryhmä 8 Juho Rintala Sami Paukku Sisällysluettelo 1 Johdanto... 3 2 Paradigma... 3

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

Rajoittamattomat kieliopit (Unrestricted Grammars)

Rajoittamattomat kieliopit (Unrestricted Grammars) Rajoittamattomat kieliopit (Unrestricted Grammars) Laura Pesola Laskennanteorian opintopiiri 13.2.2013 Formaalit kieliopit Sisältävät aina Säännöt (esim. A -> B C abc) Muuttujat (A, B, C, S) Aloitussymboli

Lisätiedot

Rekursiiviset tyypit

Rekursiiviset tyypit Rekursiiviset tyypit TIES542 Ohjelmointikielten periaatteet, kevät 2007 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 20. helmikuuta 2007 Hiloista Kiintopisteet (Ko)rekursio Rekursiiviset

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

Lisää laskentoa. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Lisää laskentoa. TIEA341 Funktio ohjelmointi 1 Syksy 2005 Lisää laskentoa TIEA341 Funktio ohjelmointi 1 Syksy 2005 Kertausta: Laajennettu aritmetiikka Lasketaan rationaaliluvuilla vakiot yhteen, vähennys, kerto ja jakolasku Laajennetaan sitä määrittelyillä: vakio

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

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

Laajennetaan vielä Ydin-Haskellia ymmärtämään vakiomäärittelyt. Määrittely on muotoa

Laajennetaan vielä Ydin-Haskellia ymmärtämään vakiomäärittelyt. Määrittely on muotoa 2.6. TIETOKONE LASKIMENA 23 Edellä esitetty Ydin-Haskell on hyvin lähellä sitä kieltä, jota GHCi (Glasgow Haskell Compiler, Interactive) sekä muut Haskell-järjestelmät suostuvat ymmärtämään. Esimerkiksi:

Lisätiedot

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

TIES542 kevät 2009 Tyyppiteorian alkeet

TIES542 kevät 2009 Tyyppiteorian alkeet TIES542 kevät 2009 Tyyppiteorian alkeet Antti-Juhani Kaijanaho 9. helmikuuta 2009 [Staattinen t]yyppijärjestelmä on ratkeava, kieliopillinen menetelmä, jota käytetään todistamaan tiettyjen käytösten puuttuminen

Lisätiedot

Edward Sapir ja Benjamin Whorf esittivät viime vuosisadan alkupuolella kielitieteellisen

Edward Sapir ja Benjamin Whorf esittivät viime vuosisadan alkupuolella kielitieteellisen Luku 1 Johdanto Edward Sapir ja Benjamin Whorf esittivät viime vuosisadan alkupuolella kielitieteellisen hypoteesin, joka tunnetaan nykyisin nimellä Sapirin Whorfin hypoteesi. Sen heikompi muoto, johon

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 3 vastaukset Harjoituksen aiheena ovat imperatiivisten kielten muuttujiin liittyvät kysymykset. Tehtävä 1. Määritä muuttujien max_num, lista,

Lisätiedot

.NET ajoympäristö. Juha Järvensivu 2007

.NET ajoympäristö. Juha Järvensivu 2007 .NET ajoympäristö Juha Järvensivu juha.jarvensivu@tut.fi 2007 Käännösprosessi C# lähdekoodi C# kääntäjä CILtavukoodi JITkäännös Ajettava natiivikoodi Kehitysympäristössä ohjelmoijan toimesta Ajonaikana.NET

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

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

Oliot ja tyypit. TIES542 Ohjelmointikielten periaatteet, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos Oliot ja tyypit TIES542 Ohjelmointikielten periaatteet, kevät 2007 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 19. maaliskuuta 2007 Olion tyyppi? attribuutti on oikeastaan metodi,

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

Aloitus. TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 14. maaliskuuta 2011 TIETOTEKNIIKAN LAITOS. Aloitus.

Aloitus. TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 14. maaliskuuta 2011 TIETOTEKNIIKAN LAITOS. Aloitus. TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 14. maaliskuuta 2011 Sisällys Sisällys Kurssin käytännöt Kurssin sivuilla http://users.jyu.fi/~antkaij/opetus/auki/2011/

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

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

Samanaikaisuuden hallinta

Samanaikaisuuden hallinta Samanaikaisuuden hallinta TIES542 Ohjelmointikielten periaatteet, kevät 2007 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 20. maaliskuuta 2007 Samanaikaisuus engl. concurrency useampaa

Lisätiedot

Johdatus ohjelmointiin

Johdatus ohjelmointiin Johdatus ohjelmointiin Ohjelmistot tietokonejärjestelmissä Jaana Holvikivi Ohjelmistojen tehtävät Sovellusohjelmat tekstinkäsittely ja muut toimistosovellukset kirjanpito, tuotannonohjaus selaimet, mediaohjelmat

Lisätiedot

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta C++ - perusteet Java-osaajille luento 5/7: operaattoreiden ylikuormitus, oliotaulukko, parametrien oletusarvot, komentoriviparametrit, constant, inline, Operaattoreiden ylikuormitus Operaattoreiden kuormitus

Lisätiedot

TIE Principles of Programming Languages CEYLON

TIE Principles of Programming Languages CEYLON TIE-20306 Principles of Programming Languages CEYLON SISÄLLYSLUETTELO 1. YLEISTIETOA KIELESTÄ JA SEN KEHITTÄMISESTÄ... 1 2. CEYLONIN OMINAISUUKSIA... 2 2.1 Modulaarisuus... 2 2.2 Tyypit... 2 2.3 Muita

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

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

Abstraktit tietotyypit. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Abstraktit tietotyypit. TIEA341 Funktio ohjelmointi 1 Syksy 2005 Abstraktit tietotyypit TIEA341 Funktio ohjelmointi 1 Syksy 2005 Data abstraktio Abstraktio on ohjelmoinnin tärkein väline Data abstraktio abstrahoi dataa Abstrakti tietotyyppi Koostuu kolmesta asiasta:

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

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

Luku 3. Listankäsittelyä. 3.1 Listat

Luku 3. Listankäsittelyä. 3.1 Listat Luku 3 Listankäsittelyä Funktio-ohjelmoinnin tärkein yksittäinen tietorakenne on lista. Listankäsittely on paitsi käytännöllisesti oleellinen aihe, se myös valaisee funktio-ohjelmoinnin ideaa. 3.1 Listat

Lisätiedot

Demo 7 ( ) Antti-Juhani Kaijanaho. 9. joulukuuta 2005

Demo 7 ( ) Antti-Juhani Kaijanaho. 9. joulukuuta 2005 Demo 7 (14.12.2005) Antti-Juhani Kaijanaho 9. joulukuuta 2005 Liitteenä muutama esimerkki Ydin-Haskell-laskuista. Seuraavassa on enemmän kuin 12 nimellistä tehtävää; ylimääräiset ovat bonustehtäviä, joilla

Lisätiedot

TIEA241 Automaatit ja kieliopit, kesä Antti-Juhani Kaijanaho. 26. kesäkuuta 2013

TIEA241 Automaatit ja kieliopit, kesä Antti-Juhani Kaijanaho. 26. kesäkuuta 2013 ja ja TIEA241 Automaatit ja kieliopit, kesä 2012 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 26. kesäkuuta 2013 Sisällys ja ja on yksi vanhimmista tavoista yrittää mallittaa mekaanista laskentaa. Kurt

Lisätiedot

Tietojenkäsittelyteorian alkeet, osa 2

Tietojenkäsittelyteorian alkeet, osa 2 TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 12. syyskuuta 2016 Sisällys vs Ovat eri asioita! Älä sekoita niitä. Funktiot Funktio f luokasta A luokkaan B, merkitään

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

Ohjelmointikielten kehityshistoriaa

Ohjelmointikielten kehityshistoriaa Ohjelmointikielten kehityshistoriaa Tässä osassa tarkastellaan tavallisimpien ja ohjelmointikielten kehityksen kannalta merkittävien kielten kehityshistoriaa. Pääasiallisena lähteenä on käytetty Sebestan

Lisätiedot

Kielioppia: toisin kuin Javassa

Kielioppia: toisin kuin Javassa Object Pascal Pascal kielen oliolaajennus (Inprise/Borland:n oma) luokat Voit uudelleenkäyttää luomiasi objekteja esim. komponentteja Periytyminen Kielioppia: toisin kuin Javassa Ei eroa isojen ja pienien

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

815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset

815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset Harjoituksen aiheena ovat aliohjelmat ja abstraktit tietotyypit sekä olio-ohjelmointi. Tehtävät tehdään C-, C++- ja Java-kielillä.

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

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python 31. tammikuuta 2009 Ohjelmointi Perusteet Pythonin alkeet Esittely Esimerkkejä Muuttujat Peruskäsitteitä Käsittely

Lisätiedot

Jatkeet. TIES341 Funktio ohjelmointi 2 Kevät 2006

Jatkeet. TIES341 Funktio ohjelmointi 2 Kevät 2006 Jatkeet TIES341 Funktio ohjelmointi 2 Kevät 2006 Havainto: häntäkutsu (1) Funktiokutsun yleinen toimintaperiaate: (koskee vain täysiä kutsuja, ts. jotka eivät palauta funktiota) kutsuja kirjaa pinoon paluuosoitteen

Lisätiedot

11.4. Context-free kielet 1 / 17

11.4. Context-free kielet 1 / 17 11.4. Context-free kielet 1 / 17 Määritelmä Tyypin 2 kielioppi (lauseyhteysvapaa, context free): jos jokainenp :n sääntö on muotoa A w, missäa V \V T jaw V. Context-free kielet ja kieliopit ovat tärkeitä

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 11: Tulkin muokkaaminen, sisäiset määrittelyt, makrot (mm. SICP 3.2.4, 4-4.1.6) Riku Saikkonen 29. 11. 2012 Sisältö 1 Kirjan tulkin muokkaaminen 2 Yksityiskohta:

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 2.3.2009 T-106.1208 Ohjelmoinnin perusteet Y 2.3.2009 1 / 28 Puhelinluettelo, koodi def lue_puhelinnumerot(): print "Anna lisattavat nimet ja numerot." print

Lisätiedot

Tyyppejä ja vähän muutakin. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Tyyppejä ja vähän muutakin. TIEA341 Funktio ohjelmointi 1 Syksy 2005 Tyyppejä ja vähän muutakin TIEA341 Funktio ohjelmointi 1 Syksy 2005 Viime luennolla... Haskellin alkeita pääasiassa Hello World!... ja muita tutunoloisia ohjelmia Haskellilla Haskellin voima on kuitenkin

Lisätiedot

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008 TIEA341 Funktio-ohjelmointi 1, kevät 2008 Luento 4 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 17. tammikuuta 2008 Modulin viimeistelyä module Shape ( Shape ( Rectangle, E l l i p

Lisätiedot

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 3. lokakuuta 2016

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 3. lokakuuta 2016 TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 3. lokakuuta 2016 Sisällys n tunnistin Jay : An Efficient Context-Free Parsing Algorithm. Communications of the

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

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

Common Lisp Object System

Common Lisp Object System Common Lisp Object System Seminaarityö Tomi Vihtari Ohjelmointikielten periaatteet kevät 2004 Helsingin Yliopisto Tietojenkäsittelytieteen laitos Järvenpää 5. huhtikuuta 2004 Sisältö 1 Johdanto... 1 2

Lisätiedot

Sisällys. Ratkaisumallien historia. Ratkaisumalli. Ratkaisumalli [2] Esimerkki: Composite [2] Esimerkki: Composite. Jaakko Vuolasto 25.1.

Sisällys. Ratkaisumallien historia. Ratkaisumalli. Ratkaisumalli [2] Esimerkki: Composite [2] Esimerkki: Composite. Jaakko Vuolasto 25.1. Sisällys Ratkaisumallien historia Jaakko Vuolasto 25.1.2001! Ratkaisumalli! Christopher Alexander! Ohjelmistotuotannosta arkkitehtuuriin! Henkilöhistoriaa! Ensimmäisiä käyttökokemuksia! Yhteenveto 25.1.2001

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

Tietueet. Tietueiden määrittely

Tietueet. Tietueiden määrittely Tietueet Tietueiden määrittely Tietue on tietorakenne, joka kokoaa yhteen eri tyyppistä tietoa yhdeksi asiakokonaisuudeksi. Tähän kokonaisuuteen voidaan viitata yhteisellä nimellä. Auttaa ohjelmoijaa järjestelemään

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

Laskennan rajoja. TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 10. joulukuuta 2015 TIETOTEKNIIKAN LAITOS.

Laskennan rajoja. TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 10. joulukuuta 2015 TIETOTEKNIIKAN LAITOS. TIEA241 Automaatit ja kieliopit, syksy 2015 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 10. joulukuuta 2015 Sisällys TM vs yleiset kieliopit Lause Jokaiselle kielelle A seuraavat ovat yhtäpitävät: 1.

Lisätiedot

Algoritmit 1. Luento 3 Ti Timo Männikkö

Algoritmit 1. Luento 3 Ti Timo Männikkö Algoritmit 1 Luento 3 Ti 17.1.2017 Timo Männikkö Luento 3 Algoritmin analysointi Rekursio Lomituslajittelu Aikavaativuus Tietorakenteet Pino Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 2/27 Algoritmien

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 4 vastaukset Harjoituksen aiheena ovat imperatiivisten kielten lauseisiin, lausekkeisiin ja aliohjelmiin liittyvät kysymykset. Tehtävä 1. Mitä

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

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python 8. marraskuuta 2010 Ohjelmointi Perusteet Peruskäsitteitä Olio-ohjelmointi Pythonin alkeet Esittely Esimerkkejä Muuttujat

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

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