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

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

Haskell ohjelmointikielen tyyppijärjestelmä

ELM GROUP 04. Teemu Laakso Henrik Talarmo

Luku 15. Parametripolymorfismi Kumitus

12. Monimuotoisuus 12.1

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

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

12. Monimuotoisuus 12.1

TIES542 kevät 2009 Tyyppijärjestelmän laajennoksia

Common Lisp Object System

TIES542 kevät 2009 Rekursiiviset tyypit

semantiikasta TIE448 Kääntäjätekniikka, syksy 2009 Antti-Juhani Kaijanaho 5. lokakuuta 2009 TIETOTEKNIIKAN LAITOS Ohjelmointikielten staattisesta

Geneeriset luokat. C++ - perusteet Java-osaajille luento 6/7: Template, tyyppi-informaatio, nimiavaruudet. Geneerisen luokan käyttö.

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

14.1 Rekursio tyypitetyssä lambda-kielessä

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

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

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo

15. Ohjelmoinnin tekniikkaa 15.1

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Rekursiiviset tyypit

samalla seuraavaan puoliavaruuteen (sukupolveen), jota siivotaan harvemmin.

Java-kielen perusteet

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

TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 27. lokakuuta 2009

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

Ohjelmoinnin peruskurssien laaja oppimäärä

11/20: Konepelti auki

15. Ohjelmoinnin tekniikkaa 15.1

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Tietotekniikan valintakoe

C++11 Syntaksi. Jari-Pekka Voutilainen Jari-Pekka Voutilainen: C++11 Syntaksi

815338A Ohjelmointikielten periaatteet

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

Groovy. Niko Jäntti Jesper Haapalinna Group 31

Algoritmit 1. Luento 3 Ti Timo Männikkö

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat

Koka. Ryhmä 11. Juuso Tapaninen, Akseli Karvinen. 1. Taustoja 2. Kielen filosofia ja paradigmat 3. Kielen syntaksia ja vertailua JavaScriptiin Lähteet

ITKP102 Ohjelmointi 1 (6 op)

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

Taas laskin. TIES341 Funktio ohjelmointi 2 Kevät 2006

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. II Johdanto olio-ohjelmointiin

3.5. TYYPIT 43. g(x) muuten. että tämä funktio todella kuuluu funktioalueeseen.

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

TIE Principles of Programming Languages CEYLON

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

Jakso 4 Aliohjelmien toteutus

Rajapinta (interface)

Tieto- ja tallennusrakenteet

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

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005

T Olio-ohjelmointi Osa 5: Periytyminen ja polymorfismi Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

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

1 Tavoitteet. 2 Periaatteet ja ominaisuudet. 2.1 Tyyppipäättely

11.4. Context-free kielet 1 / 17

TIES542 kevät 2009 Oliokielten erityiskysymyksiä

Kehittää ohjelmointitehtävien ratkaisemisessa tarvittavia metakognitioita!

Luento 4 Aliohjelmien toteutus

TIES542 kevät 2009 Oliokielten erityispiirteitä

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

7/20: Paketti kasassa ensimmäistä kertaa

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Mathematica Sekalaista asiaa

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

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

Aalto Yliopisto T Informaatioverkostot: Studio 1. Oliot ja luokat Javaohjelmoinnissa

812341A Olio-ohjelmointi, IX Olioiden välisistä yhteyksistä

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

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

Groovy. Samuli Haverinen, Aki Hänninen. 19. marraskuuta 2015

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Ohjelmoinnin peruskurssien laaja oppimäärä

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

Java-kielen perusteet

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset

D-OHJELMOINTIKIELI. AA-kerho, 33. Antti Uusimäki. Arto Savolainen

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

9. Periytyminen Javassa 9.1

1. Mitä tehdään ensiksi?

Java-kielen perusteet

2. Olio-ohjelmoinista lyhyesti 2.1

Ohjelmistojen mallintaminen, mallintaminen ja UML

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

Tietotyypit ja operaattorit

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

TIES542 kevät 2009 Tyyppiteorian alkeet

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Kielioppia: toisin kuin Javassa

Ohjelmoinnin peruskurssien laaja oppimäärä

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

7. Näytölle tulostaminen 7.1

Jakso 4 Aliohjelmien toteutus

12. Näppäimistöltä lukeminen 12.1

Transkriptio:

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 tieto indeksin alarajasta. Tyyppitarkastus (Staattinen) tyyppitarkastus on prosessi, jolla ohjelmointikielen toteutus varmistaa ennen suorituksen alkamista, ettei ohjelma aiheuta yhtään tyyppivirhettä. Useimmat tyyppitarkastimet vaativat tyyppien merkitsemistä ohjelmatekstiin ainakin jokaisen muuttujanesittelyn yhteydessä. Joissakin tapauksissa tyypit voidaan päätellä käyttöyhteydestä näin on esimerkiksi ohjelmointikielten lausekkeiden tapauksessa. Jotkin ohjelmointikielet on määritelty sellaisiksi, että niissä kaikki tyypit on pääteltävissä, jolloin mitään tyyppimerkintöjä ei yleensä tarvita. Tyyppien yhtäläisyys Ohjelmointikielessä, jossa voidaan määritellä uusia tyyppejä, nousee esiin kysymys siitä, milloin kaksi tyyppiä ovat samat. Kaksi pääasiallisinta ratkaisua ovat rakenneyhtäläisyys (structural equivalence) ja nimiyhtäläisyys (name equivalence). Rakenneyhtäläisyys Rakenneyhtäläisyyden perusidea on se, että jos kahdella tyypillä on sama rakenne, ne ovat samat. Se, mitä samalla rakenteella tarkoitetaan, vaihtelee eri kielissä. Tarkastellaanpa esimerkkiä (kirjoitettu kuvitteellisella, Pascalin kaltaisella kielellä). type päiväys1 = record pv, kk, v : integer end; type päiväys2 = record pv, kk, v : integer end; type päiväys3 = record pv : integer; kk : integer; v : integer end; type päiväys4 = record v : integer; kk : integer; pv : integer; end;

60 LUKU 3. MUUTTUJAT, ARVOT, OLIOT JA TYYPIT type päiväys5 = record dse : integer (* days since epoch, päiviä ajanlaskun alusta *) end type taulu1 = array [1..10] of integer; type taulu2 = array [1+0..10] of integer; type taulu3 = array [0..9] of integer; Ei syntyne erimielisyyttä siitä, että päiväys1 ja päiväys2 ovat rakenneyhtäläisyyden vallitessa sama tyyppi. Myöskin päiväys3 julistettaneen yksimielisesti mutta ehkä pienen keskustelun jälkeen samaksi tyypiksi kuin kaksi edellistä. Lienee selvää, että päiväys5 on eri tyyppi kuin muut neljä päiväystyyppiä. Erimielisyyttä esiintyy vain päiväys4:n kohdalla: ML hyväksyy sen samaksi tyypiksi kuin kolme edellustä, monet muut kielet eivät. Samaan tapaan lienee selvää, että taulu1 ja taulu2 ovat sama tyyppi, ja taulu3 on eri kuin mikään muu esimerkissä mainittu tyyppi. Rakenneyhtäläisyyden vallitessa tyyppien samuuden tarkastelu tapahtuu helpoiten abstraktin syntaksin tasolla, jossa tyyppinimet korvataan määritelmillään, ja sitten verrataan abstrakteja jäsennyspuita keskenään. Rekursiiviset tyypit tekevät tämän hankalaksi, mutta tämä ongelma on ratkaistavissa palauttamalla se äärellisten automaattien yhtäläisyyden tarkasteluun. Rakenneyhtäläisyyttä käyttävät Algol 68, Modula 3, ML ja (jossakin määrin) C. Nimiyhtäläisyys Nimiyhtäläisyyden vallitessa kaksi tyyppiä ovat samat, jos niillä on sama nimi. Toisin sanoen, jos ohjelmoija kirjoittaa kaksi eri tyypinmäärittelyä, ne määrittelevät aina ja kaikissa tilanteissa eri tyypin. Edellä määritellyt esimerkkityypit päiväys1, päiväys2, päiväys3, päiväys4, päiväys5, taulu1, taulu2 ja taulu3 ovat nimiyhtäläisyyden vallitessa kaikki eri tyyppejä. Nimiyhtäläisyyden suurin ongelma tulee aliastyypeistä eli tyypeistä, jotka määritellään toisen tyypin synonyymiksi. Esimerkiksi C++:n varussäilöt (standard container) määritellään jollakin seuraavan kaltaisella tavalla: template <typename KeyT, typename DataT> class map {... public;... typedef KeyT key_type; typedef DataT mapped_type;

3.5. TYYPIT 61 }; Onko tällöin map<string,int>::mapped_type sama tyyppi kuin int? C++:ssa näin on, ja on aika vaikea kuvitella, miten tuollaisen luokan saisi olemaan yleiskäyttöinen ilman, että näin olisi. Nimiyhtäläisyyttä käyttävää kieltä, jossa aliastyypit eivät ole erillisiä tyyppejä, sanotaan käyttävän heikkoa nimiyhtäläisyyttä (weak name equivalence). Jos aliastyypit ovat erillisiä tyyppejä, kyseessä on vahva nimiyhtäläisyys (strong name equivalence). Nimiyhtäläisyyttä käytetään useimmissa nykykielissä alkaen Javasta. Tyyppimuunnokset Staattisesti tyypitetyissä kielissä tarvitaan nimenomaan tietyntyyppisiä lausekkeita tietyissä paikoissa. Esimerkiksi Haskell-lausekkeessa let f :: Integer -> Integer f x = x + 1 in f r vaaditaan, että r on tyyppiä Integer. Jos ohjelmoija haluaa käyttää näissä paikoissa jonkin toisen tyypin lauseketta, hänen tulee muuntaa (convert, cast) lausekkeen tyyppiä. Tyypinmuunnoksia on neljänlaisia: 1. Jos lausekkeen todellinen tyyppi (lähtötyyppi) ja se tyyppi, joksi se halutaan muuttaa, (kohdetyyppi) olisivat rakenneyhtäläisyyden voimassaollessa sama tyyppi, mutta kielessä käytetään nimiyhtäläisyyttä, voidaan tyyppi muuntaa toiseksi suoraan ilman mitään ajonaikaisia toimenpiteitä. 2. Jos lähtötyypillä ja kohdetyypillä on sama ajonaikainen esitys ja niillä on yhteisiä arvoja, muunnos voidaan toteuttaaa näillä yhteisillä arvoilla. Mikäli lähtötyypin arvoalue on kohdetyypin arvoalueen osajoukko, palautuu ongelma edelliseen tapaukseen. Mikäli kohdetyypin arvoalue on lähdetyypin arvoalueen aito osajoukko, voidaan tässäkin tehdä suora tyypinmuunnos, mutta turvallisuuden vuoksi on syytä tarkistaa suoritusaikana, että lausekkeen arvo on kohdetyypin arvoalueella. Tähän tapaukseen kuuluvat oliokielissä varsin usein tarvittavat muunnokset ylöspäin (upcast), jossa aliluokan muuttuja muunnetaan yliluokan muuttujaksi, sekä alaspäin (downcast), jossa tietyn luokan muuttujan tiedetään (tai toivotaan) sisältävän siitä perityn luokan olion, ja muuttuja muunnetaan tuohon aliluokkaan. 3. Varsin usein myös eri ajonaikaiset esitykset ovat muunnettavissa jollakin hyvin määritellyllä operaatiolla toisikseen. Esimerkiksi 32-bittinen

62 LUKU 3. MUUTTUJAT, ARVOT, OLIOT JA TYYPIT kokonaisluku on muunnettavissa kaksoistarkkuuden IEEE-liukuluvuksi ilman tarkkuuden menetystä. Tällöin muunnos vaatii tuon operaation tekemisen suoritusaikana. 4. Joissakin tapauksissa voi olla välttämätöntä tulkita raa asti yhden tyypin olio toisen tyypin olioksi. Tämän tulkinnan toimivuus on hyvin toteutuskohtaista, ja harva kieli edes sallii tällaisen operaation. Ne kielet, jotka sen sallivat, yleensä jättävät määrittelemättä, mitä tällaisessa tilanteessa tapahtuu. C-kielessä kaikkia neljää tapausta merkitään samalla tavalla: kohdetyyppi kirjoitetaan kaarisulkeisiin ja sen perään kirjoitetaan lauseke, jonka tyyppiä halutaan muuntaa. Tämän muunnoksen tulkinta on monimutkainen asia ja riippuu monesta yksityiskohdasta. C++:ssa tätä on parannettu ottamalla käyttöön eri notaatiot näille eri tapauksille: static_cast tekee puhtaan tyyppimuunnoksen, dynamic_cast tekee muunnoksen alaspäin, ja reinterpret_cast tekee raa an uudelleentulkinnan. Lisäksi C++ määrittelee const_cast-operaation, joka liittyy kielen vakiotyyppien käsittelyyn, sekä rakenninkutsunotaation, jossa tyypin nimeä käytetään tyypinmuunnosfunktion nimenä. Monimuotoisuus Staattinen tyyppijärjestelmä voi pahimmillaan olla mahdottoman rajoittava pakkopaita. Tämän lieventämiseksi lähes kaikki staattisesti tyypitetyt kielet tukevat monimuotoisuutta muodossa tai toisessa. Monimuotoisuudella (polymorphism) tarkoitetaan sitä, että ohjelmointikielen aliohjelmalla voi olla useampi kuin yksi tyyppi. Luca Cardelli ja Peter Wegner 13 jaottelevat monimuotoisuuden kahteen lajiin ja neljään alalajiin seuraavasti: yleinen monimuotoisuus (universal polymorphism) Yleisesti monimuotoinen aliohjelma toimii periaatteessa äärettömän monella, jollakin tapaa samanoloisella tyypillä. Tämä jaotellaan kahteen alalajiin: parametrinen monimuotoisuus (parametric polymorphism) Parametrisesti monimuotoinen aliohjelma ottaa parametrinaan tyypin, ja sen muiden parametrien tyypit saattavat riippua tuosta tyypistä. Kullekin tyypille funktion ohjelmakoodi on sama. sisällytysmonimuotoisuus (inclusion polymorphism) Sisällytysmonimuotoisuudessa oliolla voi olla useita tyyppejä, jotka ovat joukkoopin mielessä sisäkkäisiä. Kullakin näistä tyypeistä on oma versionsa sisällytysmonimuotoisesta aliohjelmasta, ja se, mikä tulee 13. Luca Cardelli ja Peter Wegner: On Understanding Types, Data Abstraction, and Polymorphism. ACM Computing Surveys, vol. 17 no. 4, December 1985.

3.5. TYYPIT 63 suoritettua, kun aliohjelmaa kutsutaan, riippuu siitä, mikä on pienin (eli spesifisin) tyyppi, joka oliolla on. satunnainen monimuotoisuus (ad hoc polymorphism) Satunnaisesti monimuotoinen aliohjelma toteuttaa eri tyypeille jossakin mielessä saman operaation, mutta tämän toteuttava koodi on tyypillisesti täysin erilainen kullekin tyypille ja tyypeillä ei ole mitään erityistä yhteyttä toisiinsa monimäärittely (overloading) Monimäärittelyssä useammalla aliohjelmalla voi olla sama nimi. Aliohjelma tulee valittua parametrien määrän ja tyyppien perusteella. automaattinen tyypinmuunnos (coercion) Automaattinen tyypinmuunnos on tyypinmuunnos, joka tehdään ilman, että ohjelmoija sitä erikseen pyytää.

64 LUKU 3. MUUTTUJAT, ARVOT, OLIOT JA TYYPIT