TIE448 Kääntäjätekniikka, syksy 2009 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 7. joulukuuta 2009
Sisällys
Sisällys
Seuraava deadline Vaihe F maanantai 14.12. klo 12 rekisteriallokaatio Arvostelukappale torstai 14.1. klo 16 valmis kääntäjä arviointiaikataulu: palautus 31.12. mennessä, arviointi 14.1. mennessä palautus 14.1. mennessä, arviointi 28.1. mennessä
Sisällys
Ei ilmaista lounasta Lause Ei ole olemassa Turing-täydellisen ohjelmointikielen kääntäjää, joka kääntää jokaisen lähdekielisen ohjelman pienimmäksi saman käyttäytymisen omaavaksi kohdekieliseksi ohjelmaksi.
Ei ilmaista lounasta: todistus Rajoitutaan tarkastelemaan lähdekielisiä ohjelmia, jotka pysähtyessään tulostavat KYLLÄ tai EI ja jotka eivät tulosta mitään jos ne eivät pysähdy. On yksinkertaista kirjoittaa pienin kohdekielinen ohjelma, joka ei tulosta mitään ja joka ei koskaan pysähdy. Tarkka ohjelma riippuu kohdekielestä; olkoon nyt esimerkkinä L: jmp L. Näin ollen lauseessa tarkoitettu kääntäjä tuottaa kaikista ei-pysähtyvistä ohjelmista kyseisen ohjelman. Mutta tällöin kyseistä kääntäjää voidaan käyttää Turingin koneen pysähtymisongelman ratkaisemiseen: kirjoitetaan sille lähdekielinen ohjelma, joka simuloi kyseistä Turingin konetta halutulla syötteellä, ja katsotaan, tuliko kohdekieliseksi ohjelmksi L: jmp L (tai vastaava).
Kääntäjän kirjoittajien täystyöllisyys Lause Olkoon meillä kääntäjä K Turing-täydellisestä lähdekielestä A kohdekieleen B. Tällöin on olemassa kääntäjä K lähdekielestä A kohdekieleen B, joka tuottaa kaikilla syötteillä vähintään yhtä lyhyen ohjelman ja ainakin yhdellä syötteellä lyhyemmän ohjelman kuin K.
Kääntäjän kirjoittajien täystyöllisyys: todistus Ei ilmaista lounasta -lauseen perusteella on ainakin yksi lähdekielinen ohjelma L, jolla K tuottaa kohdekielisen ohjelman ˆL, joka ei ole lyhin mahdollinen. Tällöin on olemassa kohdekielinen ohjelma ˆL, jolla on sama käyttäytyminen kuin ˆL:llä mutta joka on tätä lyhyempi. Kääntäjä K tarkistaa, onko syötteenä L; jos on, se tulostaa ˆL :n, muutoin se kutsuu K:ta.
Tulkinta Optimoivaa kääntäjää ei ole olemassa, on olemassa vain tulosta parantavia kääntäjiä. Aina on mahdollista kirjoittaa parempi kääntäjä.
Globaalin optimoinnin perusresepti Tietovuoanalyysillä kerätään tietoa ohjelman käyttäytymisestä. Muunnosvaiheessa muokataan kerätyn tiedon perusteella ohjelma paremmaksi. Toisin kuin rekisteriallokaatio, globaali optimointi operoi yleensä välikieltä.
Sisällys
Voiko tietty sijoitus t:hen vaikuttaa suoraan t:n arvoon tietyssä kohdassa ohjelmaa? t:n yksiselitteinen määrittely on kolmiosoitekoodin käsky, jossa t on kohteena (esim. t := a + b). defs(t) on niiden lauseiden joukko, jotka määrittelevät yksiselitteisesti t:n. t:n moniselitteinen määrittely on käsky (kuten aliohjelmakutsu), joka saattaa muuttaa t:n arvoa. unohdetaan nämä gen(s) on niiden käskyjen joukko, jotka käsky s generoi gen(s) = {s}, jos s on yksiselitteinen määrittely, ja gen(s) = muutoin. kill(s) on niiden lauseiden joukko, jotka käsky s tappaa ne määrittelevät samoja muuttujia kuin s kill(s) = defs(t) {s}, jos s määrittelee yksiselitteisesti (vain) t:n, ja kill(s) =, jos s ei määrittele yksiselitteisesti mitään.
tietovuoyhtälöt in(n) = out(p) p pred(n) out(n) = gen(n) (in(n) kill(n)) Lähtökohtana kontrollivuograafi joko käskyittäinen taikka peruslohkoittainen. in(n) on niiden määrittelevien käskyjen joukko, jotka saavuttavat solmun n alun. in(n) on niiden määrittelevien käskyjen joukko, jotka saavuttavat solmun n lopun. Yhtälöt voidaan ratkaista kiintopisteiteraatiolla (ks. eloisuusanalyysikalvot).
Vakion vyöryttäminen engl. constant propagation Olkoon lauseet L 1 : t := c, missä c on vakio, ja lause L 2 : y := t + x, ja...... L 1 in(l 2 ) ja...... kaikilla L i in(l 2 ) pätee joko L i = L 1 tai L i def (t), niin...... L 2 voidaan muokata kirjoittaa muotoon L 2 : y := c + x. Tässä siis in on saavuttavien määrittelyiden ratkaisusta.
Sisällys
Lauseke x y on saatavilla kontrollivuograafin solmussa n, jos jokaisella n:ään saapuvalla polulla x y lasketaan ainakin kerran ja millään näistä poluista ei ole x:n tai y:n määrittelyä viimeisimmän laskennan jälkeen. gen(n) on nyt niiden lausekkeiden joukko, jotka n laskee. gen(n) = {x y}, jos n on t := x y, ja gen(n) = muutoin. kill(n) on niiden lausekkeiden joukko, joiden lasketun arvon n tappaa. kill(n) = { e t FV(e) }, jos t def (n) FV(e) on niiden muuttujien joukko, jotka esiintyvät e:ssä ja kill(n) = muutoin.
tietovuoyhtälöt in(n) = out(p) p pred(n) out(n) = gen(n) (in(n) kill(n)) Huomaa eron vähyys edelliseen yhtälöryhmään! vain gen- ja kill-joukkojen määrittelyssä ja... yhdisteen vaihtumisessa leikkaukseksi kaikilla poluilla, ei vähintään yhdellä Yhtälön haluttu ratkaisu on suurin kiintopiste lähtökohtana täydet joukot, joita iteraatioilla pienennetään.
Yhteisten alilausekkeiden eliminointi Olkoon meillä käsky L 1 : t := x y, jolle pätee (x y) in(l 1 ) (missä in on saatavilla olevien lausekkeiden ratkaisu). Etsi käsky L 2 : v := x y, jolle pätee että kontrollivuograafissa on ainakin yksi polku L 2 :sta L 1 :een, jossa ei ole määritelty x:ää tai y:tä taikka laskettu x y:tä. Kirjoita L 2 muotoon L 2 : w := x y; v := w, missä w on uusi väliaikaismuuttuja. Rekisteriallokaatio kykenee toivottavasti poistamaan tuon uuden kopiointikäskyn. Kirjoita L 1 nyt muotoon L 1 : t := w.
Sisällys
kin voidaan esittää gen- ja kill-joukkojen avulla. gen(n) = uses(n) kill(n) = def (n) Yhtälöryhmä on taas samankaltainen, mutta analyysi etenee taaksepäin, ei eteenpäin kuten edellä mainituissa: out(n) = s succ in(s) in(n) = gen(n) (out(n) kill(n))
Kuolleen koodin poisto Jos on käsky L : a := b c ja...... a out(l) (eloisuusanalyysin ratkaisussa), niin... L voidaan poistaa ohjelmasta (mikäli :llä ei ole sivuvaikutuksia). Tyypillinen sivuvaikutus on esimerkiksi nollalla jakaminen -virhe.
Sisällys
Seuraava deadline Vaihe F maanantai 14.12. klo 12 rekisteriallokaatio Arvostelukappale torstai 14.1. klo 16 valmis kääntäjä arviointiaikataulu: palautus 31.12. mennessä, arviointi 14.1. mennessä palautus 14.1. mennessä, arviointi 28.1. mennessä