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

Samankaltaiset tiedostot
Alityypitys. 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

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

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

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

TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 9. marraskuuta 2009

ITKP102 Ohjelmointi 1 (6 op)

Sisältö. 2. Taulukot. Yleistä. Yleistä

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

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

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

ITKP102 Ohjelmointi 1 (6 op)

Olio-ohjelmointi Javalla

15. Ohjelmoinnin tekniikkaa 15.1

Sisältö. 22. Taulukot. Yleistä. Yleistä

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

12. Monimuotoisuus 12.1

11/20: Konepelti auki

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Javan perusteita. Janne Käki

ITKP102 Ohjelmointi 1 (6 op)

Java-kielen perusteet

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

Jäsennysalgoritmeja. TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 29. syyskuuta 2009 TIETOTEKNIIKAN LAITOS. Jäsennysalgoritmeja

TIES542 kevät 2009 Rekursiiviset tyypit

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

ITKP102 Ohjelmointi 1 (6 op)

Java-kielen perusteet

Lyhyt kertaus osoittimista

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Algoritmit 1. Luento 3 Ti Timo Männikkö

16. Javan omat luokat 16.1

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

5/20: Algoritmirakenteita III

4. Luokan testaus ja käyttö olion kautta 4.1

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Ohjelmoinnin peruskurssien laaja oppimäärä

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

7. Oliot ja viitteet 7.1

1. Omat operaatiot 1.1

15. Ohjelmoinnin tekniikkaa 15.1

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Tietueet. Tietueiden määrittely

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

14.1 Rekursio tyypitetyssä lambda-kielessä

Jakso 4 Aliohjelmien toteutus

Luento 4 Aliohjelmien toteutus

Olio-ohjelmointi Syntaksikokoelma

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

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

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Tietotekniikan valintakoe

12. Monimuotoisuus 12.1

Metodien tekeminen Javalla

Java kahdessa tunnissa. Jyry Suvilehto

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

2) Aliohjelma, jonka toiminta perustuu sivuvaikutuksiin: aliohjelma muuttaa parametrejaan tai globaaleja muuttujia, tulostaa jotakin jne.

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

Jakso 4 Aliohjelmien toteutus

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

Java-kielen perusteet

TIES542 kevät 2009 Tyyppijärjestelmän laajennoksia

Käännös, linkitys ja lataus

Listarakenne (ArrayList-luokka)

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

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

UML ja luokkien väliset suhteet

TIEA241 Automaatit ja kieliopit, kevät Antti-Juhani Kaijanaho. 2. helmikuuta 2012

TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 17. marraskuuta 2009

Rajapinta (interface)

C++11 lambdat: [](){} Matti Rintala

samalla seuraavaan puoliavaruuteen (sukupolveen), jota siivotaan harvemmin.

Java-kielen perusteita

Taulukot. Jukka Harju, Jukka Juslin

4. Olio-ohjelmoinista lyhyesti 4.1

A TIETORAKENTEET JA ALGORITMIT

Silmukkaoptimoinnista

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

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

Osoitin ja viittaus C++:ssa

Algoritmit 2. Demot Timo Männikkö

Eloisuusanalyysi. TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 16. marraskuuta 2009 TIETOTEKNIIKAN LAITOS. Eloisuusanalyysi.

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

4.2. ALIOHJELMAT 71. Tulosvälitteisyys (call by result) Tulosvälitteinen parametri kopioidaan lopuksi

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Tutoriaaliläsnäoloista

Algoritmit 2. Luento 2 To Timo Männikkö

7/20: Paketti kasassa ensimmäistä kertaa

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

Luento 4 (verkkoluento 4) Aliohjelmien toteutus

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

Mikä yhteyssuhde on?

Pino S on abstrakti tietotyyppi, jolla on ainakin perusmetodit:

Luento 4 (verkkoluento 4) Aliohjelmien toteutus

13. Loogiset operaatiot 13.1

Algoritmit 2. Luento 2 Ke Timo Männikkö

Transkriptio:

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

Sisällys

Sisällys

Seuraava deadline Vaihe B tiistai 6.10. klo 10 selaaja ja jäsentäjä toimivat Vaihe C tiistai 20.10. klo 10 kielivirheiden diagnoosi, sokerin pilkkominen

Staattinen semantiikka 1 semantiikka eli merkitysoppi: yleensä ohjelmointikielten tapauksessa kaikki se, mikä ei ole (kontekstittomalla) kieliopilla (helposti) kuvattavissa staattinen: käännösaikana tiedossa oleva staattinen semantiikka: mm. käännösaikaiset oikeellisuustarkastukset 1 Tämän luennon aiheista syvällisemmin (mutta ei niin käytännönläheisesti) TIES542 periaatteet -kurssilla.

Sisällys

Mitä seuraava ohjelma tulostaa? int x = 3; void main() { int x = 4; { int x = 5; print(x); } print(x); }

Lohkorakenne Vastaus on tietenkin 5 4. Useimmissa kielissä on lohkorakenne. Ohjelmateksti jaetaan lohkoihin. Kaksi lohkoa ovat kokonaan erilliset tai sitten toinen on toisen sisällä. Aktiiviset lohkot muodostavat siten pinorakenteen. Lohkoja: Koko ohjelma on lohko (ns. globaali lohko). Moduli (käännösyksikkö tms.) on lohko. Luokka on lohko. Funktio (sisältäen myös parametrilistan) on lohko. Silmukkalause on lohko.

Lohkorakenteisen kielen nimisäännöt Nimen määritelmän lohkolla tarkoitetaan sisintä lohkoa määritelmän kohdalla. Nimi saadaan määritellä useampaan kertaan vain, jos joka määritelmällä on eri sisin lohko. Toisin sanoen jos saman sisimmän lohkon alueella määritellään sama nimi kahdesti, on virhe diagnosoitava. Kullakin hetkellä näkyy vain sisin määritelmä; muut määritelmät ovat piilossa.

Symbolitaulu Kääntäjässä nimen ja sen määritelmän yhdistää symbolitaulu. Symbolitaulu on merkkijonoilla indeksoitu taulu, jonka alkioita ovat määritelmät (tai niistä tehdyt muistiinpanot). Symbolitaulun tulee ottaa huomioon ohjelman käsittelyn edetessä sen lohkorakenne. Symbolitaulun tulee hallita nimen piilotus oikein.

Symbolitaulu, vaihtoehto I Luodaan joka lohkolle oma symbolitaulunsa. Symbolitaululla voi olla viite ympäröivän lohkon (eng. enclosing scope) symbolitauluun. Jos symbolitaulu ei tiedä nimestä mitään, se kysyy ympäröivän lohkon symbolitaululta. Tietorakennevalinta? Hajautustaulu erinomainen jos nimiä on paljon (esim. globaali ja modulin symbolitaulu) mutta muuten tilasyöppö. Lineaarinen haku (linkitty lista tai taulukko) kilpailukykyinen jos nimiä vähän (esim. silmukkalohko).

class SymbolTable { public SymbolTable() { this(null); } public SymbolTable(SymbolTable enclosing) { this.enclosing = enclosing; } public Entry lookup(string name) { Entry e = tbl.get(name); return e!= null? e : enclosing!= null? enclosing.lookup(name) : null; } public void declare(string name, Entry e) throws DuplicateDeclaration { if (tbl.containskey(name)) throw new DuplicateDeclaration(); tbl.put(name, e); } } private final Map<String,Entry> tbl = new HashMap<String,Entry>(); private final SymbolTable enclosing;

Symbolitaulu, vaihtoehto II Yksi iso hajautustaulu, jota päivitetään määritelmien sekä lohkojen alun ja lopun osuessa kohdalle. Apuna pino, johon pistetään muistiin nimen vanha määritelmä. Lohkoon tultaessa pinoon pistetään merkki. Lohkosta poistuttaessa perutaan pinon avulla kaikki määritelmät lähimpään merkkiin asti. Lohkot numeroitava jotta duplikaattimääritelmä voidaan diagnosoida.

class SymbolTable { public static abstract class Entry { public final int scope; protected Entry(int scope) { this.scope = scope; } } private static class Change { public final String name; public final Entry oldentry; public Change(String name, Entry oldentry) { this.name = name; this.oldentry = oldentry; } } public Entry lookup(string name) { return tbl.get(name); } public void declare(string name, Entry e) throws DuplicateDeclaration { Entry oldentry = tbl.get(name); if (oldentry!= null && oldentry.scope == currentscope) throw new DuplicateDeclaration(); tbl.put(name, e); changes.push(new Change(name, oldentry)); } public void enterscope() { changes.push(null); currentscope++; } public void leavescope() { while (true) { Change ch = changes.pop(); if (ch == null) break; if (ch.oldentry == null) tbl.remove(ch.name); else tbl.put(ch.name, ch.oldentry); } } private int currentscope = 0; private final Map<String,Entry> tbl = new HashMap<String,Entry>(); private final Stack<Change> changes = new Stack<Change>(); }

Symbolitaulu, vaihtoehto III Perusidea sama kuin vaihtoehdossa I: joka lohkolla oma symbolitaulunsa. Tehdään Copy-On-Write (COW) -kopio ympäröivän lohkon symbolitaulusta. Tietyillä tietorakenteilla (esim. binääriset hakupuut) on tämä kopiointikin mahdollista rajata koskemaan vain osaa symbolitaulusta.

Symbolitaulun (osittainen) vaihtoehto Tavallisesti jonkinlaista symbolitaulua tarvitaan koko käännöksen aikana. Tätä voidaan rajoittaa linkittämällä rakennepuussa viittaus nimeen siihen määritelmään, johon ko. nimiviittaus viittaa. Linkityksessä tarvitaan symbolitaulua, sen jälkeen ei.

Mitä seuraava ohjelma tulostaa? void main() { int x = 4; void f() { print(x); } void g() { int x = 6; f(); } g(); }

Staattinen vs dynaaminen lohkotus Vaihtoehdot: staattinen lohkotus: aliohjelma näkee (vain) ne muuttujat, jotka ovat sen määrittelykohdassa näkyvissä (ohjelma tulostaa 4) dynaaminen lohkotus: aliohjelma näkee kutsupaikalla näkyvissä olevat muuttujat (ohjelma tulostaaa 6) Tulkkaava toteutus toteuttaa dynaamisen lohkotuksen luonnostaan, staattinen lohkotus on tulkille työläämpi. Kääntäjälle staattinen lohkotus olennaisesti helpompi. Useimmiten dynaaminen lohkotus on bugi.... paitsi Lispissä jossa se muuttui bugista featureksi

Huomautus ensiluokkaisista aliohjelmista Ensiluokkainen (engl. first class) aliohjelma tarkoittaa aliohjelmaa, jota voi käsitellä vapaasti arvona: antaa argumentiksi tallettaa muuttujaan palauttaa paluuarvona Jos tällainen aliohjelma saa muuttaa ympäröivän aliohjelman paikallisten muuttujien arvoa, käännös mutkistuu! Siksi voi olla hyvä kieltää aliohjelmilta muiden aliohjelmian paikallisten muuttujien muuttaminen.... silloinkin kun niillä on oikeus lukea niitä vertaa Javan sisäluokkien vastaavaan rajoitukseen

Sisällys

Huomautus tyyppitarkastuksesta Tällä luennolla käsitellään vain staattista tyyppitarkastusta. Tarkoituksena on diagnosoida tyyppivirheet käännösaikana. Jos kieli onkin dynaamisesti tyypitetty, ei tämän osan tekniikoita tarvita.

Tyyppi Tyyppi on ohjelmatekstin osaa liitettävä tunnus, joka kertoo, minkälaisten arvojen tai olioiden kanssa kyseinen ohjelmatekstin osa on tekemisissä. Lausekkeen tyyppi luokittelee sen laskemisen tuloksena syntyvät arvot. Funktion tyyppi kertoo, minkätyyppisiä arvoja ja kuinka monta se ottaa parametriksi ja mitä se palauttaa. Lauseella ei yleensä ole tyyppiä, mutta se voi sisältää diagnosoitavia tyyppivirheitä. Määrittelyllä ei yleensä ole tyyppiä, mutta se määrittelee uuden nimen ja sille tyypin, ja saattaa sisältää diagnosoitavia tyyppivirheitä.

Yksinkertaiset tyypit Ohjelmointikieli määrittelee joukon perustyyppejä: Perustyypit edustavat yleensä matemaattisia joukkoja kuten lukuja modulo 2 32 tai totuusarvoja. Perustyypillä ei ole lainkaan ohjelman manipuolitavissa olevaa sisäistä rakennetta, joten perustyypin arvoja ja olioita käsitellään vain perusoperaatioiden (esimerkiksi +, ) ja niistä johdettujen aliohjelmien avulla. Lisäksi ohjelmointikieli määrittelee joukon tyyppikonstruktoreja 2 : funktiot vaihtelee) tietueet eli struktuurit yhdisteet taulukot 2 Luokat eivät ole yksinkertaisia tyyppejä.

Lausekkeen tyyppitarkastus Tarkastus etenee rakennepuussa alhaalta ylös, lehtisolmuista juureen. läpikäynti jälkijärjestyksessä kunkin solmun käsittelyssä tiedossa sen lapsisolmujen tyyppi; solmun tehtävä selvittää oma tyyppinsä Lehtisolmuja ovat vakiot ja muuttujat: Vakion tyyppi on yleensä trivialiteetti. Muuttujan tyyppi haetaan symbolitaulusta ko. muuttujan nimellä. Sisäsolmut ovat operaatioita. Pääsääntö: 1. Tarkastetaan ensin, onko lapsisolmuilla operaation vaatimat tyypit. 2. Solmun oma tyyppi riippuu operaatiosta (ja joskus lapsisolmujen tyypeistä). Lause tyyppitarkastetaan kuten lauseke, mutta lausesolmuilla ei ole tyyppiä.

Sijoituslauseen tarkastus Usein sijoituslause on muotoa E = E, missä E on lauseke. Vasen lauseke kertoo muistipaikan, johon oikean arvo tallennetaan. Left value eli lvalue tarkoittaa lausekkeen tulkintaa sijoituslauseen vasemmalla puolella, ja Right value eli rvalue tarkoittaa lausekkeen tulkintaa sijoituslauseen oikealla puolella. Vain osa lausekkeista kelpaa vasemmalle puolelle (eli vain osalla lausekkeista on lvalue). Esimerkiksi a[i] on lvalue mutta x + y ei ole. Sijoituslauseen tarkastus: Tee tyyppitarkastus molemmille lausekkeille. Tarkista, että molemmilla on sama tyyppi. Tarkista vielä, että vasemmalla lausekkeella on lvalue.

Aliohjelman määrittely Aliohjelmatyypin arvo luodaan yleensä funktion määrittelyssä. Tällöin aliohjelmatyypin arvo tulee ko. aliohjelman nimen (vakio)arvoksi. Aliohjelman määrittelystä on tarkastettava että sen nimeä ei ole jo määritelty samassa sisimmässä lohkossa, että sen parametrien nimissä ei esiinny toistoa, että sen parametreille on annettu hyväksyttävät tyypit, että sen runko on hyvin tyypitetty 3 silloin kun parametrinimeillä on ne tyypit, jotka niille on määrittelyssä annettu, ja että sen rungossa palautetaan määrittelyn vaatimaa tyyppiä oleva arvo (mikäli määritelmä sen vaatii) silloin kun parametrinimillä on ne tyypit, jotka niille on määrittelyssä annettu. 3 Hyvin tyypitetty tarkoittaa, että tyyppitarkastus ei anna virhediagnooseja.

Aliohjelmakutsu Aliohjelmatyypin arvoa voi käyttää aliohjelmakutsun vasemmalla puolella. Aliohjelmakutsusta f (a 1,..., a n ) on tarkastettava että f :n tyyppi on n-parametrisen aliohjelman tyyppi, että f :n tyypissä on paluutyyppi, jos kutsu esiintyy lausekkeessa, tai että f :n tyypissä ei ole paluutyyppiä, jos kutsu esiintyy lauseena, ja että kunkin a i :n tyyppi kelpaa f :n tyypin i:nnen parametrin tyypiksi. Kutsun tyyppi on f :n paluutyyppi (jos sellainen on). Onko aliohjelmakutsu lvalue?

Tietueet Tietuemääritelmä määrittelee uuden tyyppinimen ja koostuu tietueen sisällä näkyvistä muuttujamäärittelyistä (ilman alustusta) eli kentistä. Tietuemäärittelystä on tarkastettava että samaa kenttää ei määritellä useasti, että kenttien tyypit ovat sellaiset, että ne kelpaavat tähän käyttöön. Tietuetta käytetään selektio-operaattorilla e.l; siitä on tarkastettava että e:llä on tietuetyyppi ja että l on e:n tyypissä määritelty kenttä. Tällaisen lausekkeen tyyppi on l:n e:n tyypissä määritelty tyyppi. Tällainen lauseke on yleensä lvalue.

Varianttityyppi Varianttityyppi on kuin tietue, mutta sen kentät ovat muistissa päällekkäin, ei peräkkäin. Vain yksi variantin kentistä on aktiivinen kulloinkin. Varianttiin sisältyy lisäksi tieto siitä, mikä kentistä on aktiivinen. ns. tagged union (toisin kuin C:n union) kuten tietueelle. Lisäksi variantti tarjoaa jonkin tavan selvittää, mikä kenttä on kulloinkin aktiivinen, esim. sopivasti muokattu switch case-lause.

Tyyppien yhtäläisyys Tyyppitarkastuksessa olennainen kysymys on, milloin kaksi tyyppiä ovat yhtäläiset. Pääsääntö: Perustyypit ovat yhtäläisiä vain itsensä kanssa. Rakenteiset tyypit (funktiot ym.) ovat yhtäläisiä jos niiden rakennepuut ovat samanlaiset sen jälkeen, kun tyyppinimet on korvattu niiden määritelmillä Tätä sanotaan rakenneyhtäläisyydeksi. Rakenneyhtäläisyys on epätriviaalia jos rekursiiviset tyyppimäärittelyt ovat sallittuja. Yksinkertainen ratkaisu on nimiyhtäläisyys: Kaksi tyyppinimeä ovat samat jos ne viittaavat samaan tietuetyypin määrittelyyn.

Koostealkio vai viitealkio? Yksinkertaisin tapa toteuttaa tietuetyyppinen kenttä tietuetyypissä on sisällyttää kenttä sellaisenaan tietueeseen. Tämä ei toimi, jos rekursio on sallittu. C-kielen ratkaisu: lisätään kieleen osoitintyyppi ja sallitaan rekursio vain osoitintyypin kautta. tyyppitarkastajan huomioitava! Java-kielen ratkaisu: tietuetyyppiset kentät ovat oikeasti viittauksia erillisiin tietueisiin. Mahdollista myös sallia rekursio vain varianttityypin kautta.

Luokat Luokat ei enää sisälly yksinkertaiset tyypit -järjestelmään. Yksinkertaisimmillaan luokka on tietue, jossa on lisäksi mahdollisuus määritellä yläluokka. Tarkastuksen huomattava yläluokan nimien overriding ja siihen liittyvät virheet. Lisäksi mahdollisesti näkyvyysaluetarkastukset (private jne). Luokka määrittelee tyypin; jos sillä on yläluokka, niin luokan ja yläluokan välille muodostuu alityypityssuhde.

Alityypitys Alityypitys on tyyppien välinen osittaisrelaatio. Sen pohjana on luokkien väliset perintäsuhteet. Kaksi tyyppiä ovat ekvivalentit, jos ne ovat toistensa alityyppejä.

Alityypityksen laajentaminen 4 Tietue ei voi alityypittyä, jos sen kenttiin voi sijoittaa. Aliohjelmatyyppi on kovariantti paluutyyppinsä suhteen mutta kontravariantti parametrityyppinsä suhteen. Epäintuitiivista! Kovarianssi tarkoittaa, että jos f :n tyyppi on g:n tyypin alityyppi, niin f :n paluuarvon tyyppi on g:n paluuarvon tyypin alityyppi. Kontravarianssi tarkoittaa, että jos f :n tyyppi on g:n tyypin alityyppi, niin g:n argumentin tyypin tulee olla f :n argumentin tyypin alityyppi. 4 periaatteet -kurssilla pohditaan tätä problematiikkaa tarkemmin.

Varianssin muistisäänöt Arvon lähde alityypittyy kovariantisti. Esimerkiksi tietue, jonka kenttiin ei saa sijoittaa. Myös: aliohjelman paluuarvo. Arvon kohde alityypittyy kontravariantisti. Tyypillinen esimerkki on aliohjelman parametri. Arvon yhdistetty lähde kohde ei alityypity (eli on invariantti). Tyypillisiä esimerkkejä ovat osoitintyyppi, taulukkotyyppi ja tietuetyyppi.

Sisällys

Seuraava deadline Vaihe B tiistai 6.10. klo 10 selaaja ja jäsentäjä toimivat Vaihe C tiistai 20.10. klo 10 kielivirheiden tarkistukset, sokerin pilkkominen