Kääntäjätekniikka
Luento 10 (20.4.2017)
Lähiviikkojen aikatauluista
- perjantaina 21.4. ei ohjauksia
- maanantaina 24.4. ohjaukset normaalisti
- perjantaina 28.4. pelkkä ohjaus
- maanantaina 1.5. ei opetusta
- perjantaina 5.5. vaihepalautus (tarkastaja) ja sen jälkeen ohjausta
Inkrementit
(deadlineja päivitetty 1.6.2017)
Alustava deadline sulkeissa (klo 16 kyseisenä päivänä ellei muuta ilmoitettu)
- Suunnittelu ja ryhmien muodostaminen (20.3.)
- Jäsentäjä valmis (perjantai 7.4. klo 10)
- Tarkastaja valmis (perjantai 5.5. klo 10)
- Välikielen generointi valmis [tai muita ominaisuuksia 1 op:n arvosta lisää] (15.5.)
- Kohdekielen generointi (naivi rekisteriallokaatio) valmis [tai muita ominaisuuksia 1 op:n arvosta lisää] (19.6.)
- Fiksu rekisteriallokaatio valmis [tai muita ominaisuuksia 1 op:n arvosta lisää] (14.8. klo 12)
- Koko työ viimeistelty ja valmis tarkastettavaksi (28.8. klo 12)
Jatketaan tyyppitarkastuksesta
Koostealkio vai viitealkio?
- Yksinkertaisin tapa toteuttaa tietuetyyppinen kenttä tietuetyypissä on sisällyttää kenttä sellaisenaan tietueeseen.
- Tämä ei toimi, jos tyyppirekursio 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.
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 ongelmallinen jos rekursiiviset tyyppimäärittelyt ovat sallittuja.
- Yksinkertainen ratkaisu on nimiyhtäläisyys:
- Kaksi tyyppinimeä ovat samat jos ne viittaavat samaan tietuetyypin määrittelyyn.
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).
- Tavanomaisessa mallissa 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 monissa kielissä luokkien väliset perintäsuhteet.
- Kaksi tyyppiä ovat ekvivalentit, jos ne ovat toistensa alityyppejä.
Alityypityksen laajentaminen
- 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 ong
:n tyypin alityyppi, niinf
:n paluuarvon tyyppi ong
:n paluuarvon tyypin alityyppi. - Kontravarianssi tarkoittaa, että jos
f
:n tyyppi ong
:n tyypin alityyppi, niing
:n argumentin tyypin tulee ollaf
:n argumentin tyypin alityyppi.
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.
- Moni kieli rikkoo invarianssisääntöjä. Tästä seuraa velvoite dynaamiseen tarkastukseen.
Suorasta tulkista
- 3 op:n harjoitustyöhön riittää AST:n perusteella toimiva tulkki
- kannattaa tehdä testaustarkoituksessa muihinkin harjoitustöihin
- rakennetaan kuten tyyppitarkastin, mutta lasketaan eikä tarkasteta
- symbolitaulussa muuttujiin sidotaan tyyppien asemesta arvoja
These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.