Johdanto. TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 8. syyskuuta 2009 TIETOTEKNIIKAN LAITOS. Johdanto. Luennoija.

Samankaltaiset tiedostot
Konekielinen ohjelmointi

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

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

Ongelma(t): Miten mikro-ohjelmoitavaa tietokonetta voisi ohjelmoida kirjoittamatta binääristä (mikro)koodia? Voisiko samalla algoritmin esitystavalla

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

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

Java-kielen perusteet

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

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

4. Lausekielinen ohjelmointi 4.1

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

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

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

Harjoitustyö: virtuaalikone

Tietotekniikan valintakoe

4. Lausekielinen ohjelmointi 4.1

Luento 1 Tietokonejärjestelmän rakenne

Luento 1 Tietokonejärjestelmän rakenne. Järjestelmän eri tasot Laitteiston nopeus

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

Ongelma(t): Miten jollakin korkeamman tason ohjelmointikielellä esitetty algoritmi saadaan suoritettua mikro-ohjelmoitavalla tietokoneella ja siinä

ITKP102 Ohjelmointi 1 (6 op)

Luento 1 Tietokonejärjestelmän rakenne

5. HelloWorld-ohjelma 5.1

Luento 1 Tietokonejärjestelmän rakenne. Järjestelmän eri tasot Laitteiston nopeus

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Käännös, linkitys ja lataus

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

Silmukkaoptimoinnista

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

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

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

Attribuuttikieliopit

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

Java-kielen perusteet

Ohjelmoinnin perusteet Y Python

7. Näytölle tulostaminen 7.1

Ohjelmointikielten periaatteet Syksy Antti-Juhani Kaijanaho

ITKP102 Ohjelmointi 1 (6 op)

11/20: Konepelti auki

Laitteistonläheinen ohjelmointi

TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 7. joulukuuta 2009

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

Ongelma(t): Miten tietokoneen komponentteja voi ohjata siten, että ne tekevät yhdessä jotakin järkevää? Voiko tietokonetta ohjata (ohjelmoida) siten,

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

11. Javan toistorakenteet 11.1

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

Muita rekisteriallokaatiomenetelmiä

12. Javan toistorakenteet 12.1

ELM GROUP 04. Teemu Laakso Henrik Talarmo

TIEA241 Automaatit ja kieliopit, kevät Antti-Juhani Kaijanaho. 8. maaliskuuta 2012

// Tulostetaan double-tyyppiseen muuttujaan "hinta" tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf("%.1f euros.

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

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

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

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

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

Ohjelmoinnin perusteet Y Python

Lisää pysähtymisaiheisia ongelmia

5. HelloWorld-ohjelma 5.1

Javan perusteet. Ohjelman tehtävät: tietojen syöttö, lukeminen prosessointi, halutun informaation tulostaminen tulostus tiedon varastointi

Harjoitustyön testaus. Juha Taina

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

Ohjelmoinnin perusteet Y Python

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

12. Javan toistorakenteet 12.1

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

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

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. FT Ari Viinikainen

Luento 3 (verkkoluento 3) Ttk-91 konekielinen ohjelmointi. Ohjelman esitysmuoto Konekielinen ohjelmointi ttk-91:llä (Titokone, TitoTrainer)

Johdanto Meta Kielten jaotteluja Historia. Aloitusluento. TIES542 Ohjelmointikielten periaatteet, kevät Antti-Juhani Kaijanaho

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset

Tietorakenteet ja algoritmit syksy Laskuharjoitus 1

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

// Tulostetaan double-tyyppiseen muuttujaan "hinta" tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf("%.1f euros.

1. Omat operaatiot 1.1

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

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

Tutoriaaliläsnäoloista

9. Periytyminen Javassa 9.1

8. Näppäimistöltä lukeminen 8.1

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Pythonin Kertaus. Cse-a1130. Tietotekniikka Sovelluksissa. Versio 0.01b

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

Tiedon esitysmuodot. Luento 6 (verkkoluento 6) Lukujärjestelmät Kokonaisluvut, liukuluvut Merkit, merkkijonot Äänet, kuvat, muu tieto

Virtuaalikoneiden generointi Vmgen-kääntäjällä

ITKP102 Ohjelmointi 1 (6 op)

Kertausluento luennoista 1-3 1

Ohjelmoinnin perusteet Y Python

Luento 1 (verkkoluento 1) Ohjelman sijainti Ohjelman esitysmuoto Laitteiston nopeus

8. Näppäimistöltä lukeminen 8.1

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Harjoitus 3 (viikko 39)

Ohjelmoinnin perusteet Y Python

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

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

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

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

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

Transkriptio:

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

assistentti Antti-Juhani Kaijanaho matematiikan opiskelijaksi JY:oon 1997 tietotekniikan LuK 2001 (tutkielma roskienkeruusta) tietotekniikan FM 2002 (pro gradu eräästä ohjelmistotekniikan formaalista menetelmästä) jatko-opintojen aihepiiri funktiokielten toteutustekniikat

n kääntäjätekniikan kokemus keskeneräisiä kääntäjiä eri kielille 1999 2009 mallikääntäjiä ohjelmointikielten periaatteet -kurssille 2004 ja 2007 C-esikääntäjä 2006 (pääosin toimiva, ei aktiivikäytössä) Agora BASIC -kääntäjä 2006 (minimaalisesti käyttökelpoinen; kehitys pysähtynyt muiden projektien varjossa)

n yhteystiedot työhuone Ag C416.1 (tavattavissa parhaiten iltapäivisin) vastaanotto ti 14-16 työpuhelin (014) 260 2766 sähköposti antti-juhani.kaijanaho@jyu.fi IRC: ibid @ Freenode,IRCnet,OFTC kurssin IRC-kanava #ties448 @ IRCnet (kanava-avain kaantajat)

Lähiopetus Suoritus Lähiopetus Suoritus

Lähiopetus luentoja 7.9. 14.12. maanantaisin klo 12 14 ja tiistaisin klo 10 12 (yht. 58 h) pääsääntöisesti Ag C233.1 poikkeuksellisesti Ag C133.1 ti 15.9. ja ti 13.10. poikkeuksellisesti Ag D121.1 ti 6.10., ti 27.10. ja ti 10.11. ohjausta 16.9. 9.12. keskiviikkoisin klo 12 14 Finland-mikroluokassa (AgB212.1) pääosin ei läsnäolopakkoa Lähiopetus Suoritus

Muistutus: influenssapandemia influenssa A (H1N1) todennäköisesti yliopistolla yleinen tänä lukuvuonna luennoija saattaa sairastua todennäköisesti viikon tauko opetuksessa vaikutus harjoitustyöaikatauluun todennäköinen opiskelijoita todennäköisesti sairastuu ehdottomasti ei luennoille jne kuumeisena tai nuhaisena yksi kuumeeton päivä ja muiden oireiden huippu ohitettu ennen yliopistolle palaamista sairastuminen hyväksytään force majeure -esteeksi muutokset harjoitustyöaikatauluun sovitaan tarpeen mukaan erikseen Lähiopetus Suoritus

Tehdään 2 3 hengen ryhmissä. Hyväksytty tulos arvostellaan asteikolla 2 4. koko ryhmän yhteinen arvolause arvosteluperusteina työn valmiusaste tehtyjen ratkaisujen onnistuneisuus ja omintakeisuus aiheen vaativuusaste koodin selkeys ja dokumentointiaste Lähiopetus Suoritus

Tentti Tenttipäivät ovat 18.12.2009, 12.2.2010 ja 9.4.2010. Hyväksytty tentti arvostellaan asteikolla 1 2. kysymykset esseetyyppisiä, edellyttävät kokonaisuuden ymmärtämistä Lähiopetus Suoritus

Kurssin arvolause Hyväksyttyyn suoritukseen vaaditaan hyväksytty tentti tai hyväksytty harjoitustyö. Arvolause (1 5) saadaan laskemalla tentin ja harjoitustyön arvolauseet yhteen. Lähiopetus Suoritus

Peruskysymys Mitä hyötyä on kääntäjätekniikastan opiskelusta, jos ei aio kääntäjäteknikoksi?

tekeminen on haasteellista Kääntäjäprojektin tekeminen kehittää ohjelmointi- ja projektinhallintataitoja. Onnistunut kääntäjäprojekti on vahva näyttö osaamisesta.

Teoria ja käytäntö kohtaavat Kääntäjä on käytännönläheinen ja hyödyllinen ohjelma. sisällä jylläävät algoritmit ja tietorakenteeet ovat epätriviaaleja ja pitkän tutkimustyön huipentumia. Kääntäjätekniikka oli tietojenkäsittelytieteen merkittävä tutkimusalue 1960- ja 1970-luvuilla. Nykyisin tutkimus keskittyy hienosäätöön ja tämän kurssin sisältöön kuulumattomiin optimointitekniikoihin.

Näkemystä kääntäjien toimintaan Kääntäjätekniikan tuntemus auttaa ymmärtämään teollisten kääntäjien aivoituksia. Olemassaolevia kääntäjiä ja kieliä oppii siten käyttämään paremmin.

Kääntäjätekniikka ei ole vain kääntäjiä varten Määritelmä Tietokonekieli on kieli, joka on tarkoitettu tietokoneen ymmärrettäväksi. Esimerkkejä monet dokumenttitiedostomuodot (.doc,.xml,.html,.odt,... ) useimmat sovellustason verkkoprotokollat (HTTP, ESMTP, NNTP, XMPP,... ) konfiguraatiotiedostot määrittelykielet (B, Z, VDM,... ) ohjelmointikielet

Konekieli Konekieli on tietokonekieli, jota tietokoneen keskusyksikkö ymmärtää sellaisenaan. Mikrokoodi Käytännössä konekieltä ei ymmärrä suoraan rauta, vaan keskusyksikön sisällä on ns. mikrokoodilla kirjoitettu tulkki tai JIT-kääntäjä. Tämä ei kuitenkaan näy ohjelmoijalle.

Instruction Set Architecture Konekieliä on erilaisia, ja tietokoneet jaetaan eri luokkiin (instruction set architecture eli ISA, suomeksi yleensä käskykanta-arkkitehtuuri) sen mukaan, mitä konekieltä kukin hallitsee: Tunnetuin on PC-koneiden x86(-32) eli IA32. PC:issä yleistymässä on x86-64 eli AMD64. Mobiililaitteissa yleisin on ARM. Macintosh-koneissa on tavallisesti m68k tai PowerPC. 1980-luvun kotitietokoneissa usein 65xx, Z80 tai m68k. 1980- ja 1990-lukujen työasemissa yleinen SPARC. Teollisessa käytössä on kuitenkin useita kymmeniä erilaisia ISA:ita.

Konekielten yleispiirteitä erittäin yksinkertainen tyypittömyys ( kaikki on sanoja ) rekisterit alkeistoimituksiin rajoittuminen abstraktiokeinojen puute

Konekielen Konekielinen ohjelma on jono käskyjä Kukin käsky koostuu (tavallisesti) operaatiokoodista eli opkoodista (engl. opcode) sekä 0 3 operandista: Käskyjen koodaustapa riippuu ISA:sta. Esimerkiksi IA32:ssa kolmitavuinen käsky 80 F1 12 käskee XORraamaan luvun 18 ja erään rekisterin arvon ja tallettamaan tuloksen ko. rekisteriin.

Symbolinen konekieli Tunnetaan myös nimellä assembly. Ihmisen luettavaksi tarkoitettu konekielen esitystapa. Yksi käsky esitetään yhdellä rivillä. Kullakin opkoodilla on lyhyt nimi eli muistikas (engl. mnemonic). Operandit esitetään havainnollisella tavalla. Yksinkertainen kääntäjä, ns. assembler, kääntää symbolisen konekielen konekieleksi. Joka ISA:lla on oma assemblynsä, joillakin on jopa useampia.

Esimerkki, osa I: C-kielinen ohjelma unsigned long str2ulong(char const * s) { unsigned long rv = 0; for (/**/; *s!= 0; s++) { rv = 10 * rv + (*s - 0 ); } return rv; }

Esimerkki, osa II: IA32:n AT&T-assembly.text.p2align 4,,15.globl str2ulong.type str2ulong, @function str2ulong: pushl %ebp xorl %edx, %edx movl %esp, %ebp movl 8(%ebp), %ecx movzbl (%ecx), %eax testb %al, %al je.l8.p2align 4,,15.L6: movsbl %al,%eax incl %ecx leal (%edx,%edx,4), %edx leal -48(%eax,%edx,2), %edx movzbl (%ecx), %eax testb %al, %al jne.l6.l8: popl %ebp movl %edx, %eax ret

Esimerkki, osa III: UltraSparc-assembly.section ".text".align 4.global str2ulong.type str2ulong, #function.proc 016 str2ulong:!#prologue# 0!#PROLOGUE# 1 ldub [%o0], %o4 sll %o4, 24, %g1 cmp %g1, 0 be.ll8 mov 0, %o3 mov %g1, %o4.ll6: add %o0, 1, %o0 ldub [%o0], %g1 sra %o4, 24, %o5 sll %g1, 24, %g1 orcc %g1, 0, %o4 sll %o3, 2, %g1 add %g1, %o3, %g1 add %g1, %g1, %o3 add %o3, %o5, %g1 bne.ll6 add %g1, -48, %o3.ll8: retl mov %o3, %o0

Esimerkki, osa IV: PowerPC-assembly.section ".text".align 2.globl str2ulong.type str2ulong,@function str2ulong: mr 11,3 lbz 0,0(11) li 3,0 cmpwi 0,0,0 bclr 12,2.L6: slwi 9,3,3 add 9,9,3 add 9,9,3 addi 9,9,-48 add 3,0,9 lbzu 0,1(11) cmpwi 0,0,0 bc 4,2,.L6 blr

Konekielen tyypit Konekielessä kaikki data on eri mittaisia bittijonoja. Kohdedatan pituus ja tulkinta riippuvat täysin opkoodista. Tyyppitarkastusta ei ole. tyypillisiä konekielen tyyppejä: n-bittinen etumerkitön kokonaisluku (aritmetiikka modulo 2 n ) n-bittinen etumerkillinen kokonaisluku (kahden komplementti) n bitin bittijono n bitin IEEE-liukuluku n = 8, 16, 32, 64 (paitsi liukuluvuilla n = 32, 64)

Tavallisimmat operandit Välitön operandi (immediate operand) Operandi on käskyyn sisältyvä lukuvakio. Rekisterioperandi (register operand) Operandi on rekisteri. Suora osoitus (direct addressing) Operandi on muistipaikka, jonka osoite sisältyy käskyyn. Epäsuora osoitus (indirect addressing) Operandi on muistipaikka, jonka osoite saadaan laskemalla yhteen rekisterin arvo ja käskyyn sisältyvä (etumerkillinen) lukuvakio.

Rekisterit keskusyksikön sisällä olevia nimettyjä muistiyksiköitä rekisterin käyttö olennaisesti muistin käyttöä nopeampaa joissakin ISA:issa laskenta mahdollista vain rekistereissä erittäin rajattu määrä, kourallisesta muutamaan kymmeneen 32-bittisiä kokonaislukurekistereitä IA32:ssa 8 kpl 32-bittisiä yleisrekistereitä ARM:ssa 16 kpl 64-bittisiä kokonaislukurekistereitä AMD64:ssa 16 kpl 64-bittisiä yleisrekistereitä SPARC:ssa 32 kpl

Käskylajit aritmeettiset alkeisoperaatiot bitittäiset alkeisoperaatiot ehdolliset ja ehdottomat hypyt muistinkäsittelyoperaatiot

Kääntäjä, lähdekieli ja kohdekieli Määritelmä Kääntäjä (engl. compiler) on tietokoneohjelma, joka ottaa yhdellä kielellä (lähdekieli, engl. source language) kirjoitetun tietokoneohjelman syötteenään ja tuottaa tulos saman tietokoneohjelman kirjoitettuna jollakin toisella kielellä (kohdekieli, engl. target language). Huomautus Usein kohdekieli on jokin konekieli tai symbolinen konekieli, mutta ei aina. Huomautus Tavallisesti kohdekieli on lähdekieltä yksinkertaisempi. Jos tilanne on päinvastainen ja kääntäjä pyrkii idiomaattiseen kohdekoodiin, puhutaan takaisinkääntäjästä (engl. decompiler).

Isäntäkieli Määritelmä Kieli, jolla kääntäjä itse on kirjoitettu, on sen isäntäkieli (engl. host language). Huomautus Toisinaan kääntäjän isäntäkieli ja lähdekieli ovat (olennaisilta osin) sama kieli. Tällöin kääntäjän odotetaan kykenevän kääntämään itsensä; tällainen kääntäjä on itsensä isännöivä (engl. self-hosting).

Isäntäarkkitehtuuri Määritelmä ISA, jossa kääntäjä on suoritettavissa, on sen isäntäarkkitehtuuri (engl. host architecture). Huomautus Tavallisimmin isäntäarkkitehtuuri on sama kuin kohdekieli. Jos näin ei ole, kääntäjä on ristiinkääntäjä (engl. cross-compiler).

Bootstrapping Määritelmä Prosessi, jolla itsensä isännöivä kääntäjä saadaan käännetyksi suoritettavaan muotoon, on nimeltään bootstrapping. Luentotehtävä Olet suunnitellut uuden ohjelmointikielen, ja haluat kirjoittaa sille itsensä isännöivän kääntäjän. Kuinka bootstrapping voisi onnistua?

Klassinen kääntäjän liukuhihna lähdeohjelma SELAAJA sanasjono JÄSENTÄJÄ VÄLIKOODIN GENEROIJA KOHDEKOODIN GENEROIJA puu välikoodi kohdeohjelma TARKASTAJA SOKERINPILKKOJA OPTIMOIJA OPTIMOIJA

Selaaja... lekseri, selain, palastelija, tokenisoija,... syötteenä lähdeohjelmaa esittävä merkkijono tulosteena jono sanasia (engl. token), pienimpiä merkityksellisiä osia, vrt. sanat suomen kielessä; tyypillisesti: kokonaislukuvakio 521 merkkijonovakio "kissa" välimerkki ; luokan nimi Window muuttujan nimi it avainsana while Välilyönnit ym. eivät yleensä ole sanasia. Selaaja voi myös antaa virheilmoituksia ja varoituksia sekä hylätä ohjelman virheellisenä.

Jäsentäjä... parseri, parsija, syntaktinen analysaattori,... syötteenä selaajan tuottama sanasjono tulosteena puu eli abstrakti jäsennyspuu tieto, joka kuvaa ohjelman (staattisen) loogisen rakenteen kukin sisäsolmu edustaa operaatiota ja sen lapsisolmut sen operandeja Jäsentäjä voi myös antaa virheilmoituksia ja varoituksia sekä hylätä ohjelman virheellisenä.

Tarkastaja... semanttinen analysoija, staattinen tarkastaja,... syötteenä jäsentäjän tai sokerinpilkkojan tuottama puu tulosteena sama puu (mahdollisesti täydennettynä) tarkastaa, että ohjelmassa ei ole mitään sellaisia virheitä, joiden takia kääntäminen tulisi keskeyttää, esimerkiksi: muuttujaa käytetään ennen määrittelyä (jos kieli tämän kieltää) funktiolle annetaan väärä määrä parametreja tyyppimäärittelyt ovat keskenään ristiriitaisia myös usein lisää puuhun muistiinpanoja, esimerkiksi tyyppi-informaatiota Tarkastaja on viimeinen osa, joka voi hylätä ohjelman virheellisenä. Myöhemmät osat olettavat koodin olevan virheetöntä.

Sokerinpilkkoja engl. desugarer ei ole kaikissa kääntäjissä syötteenä jäsentäjän tai tarkastajan tuottama puu Valinta riippuu kääntäjästä. Sokerinpilkkojan sijoittaminen tarkastajan jälkeen on käyttäjäystävällistä mutta monimutkaistaa tarkastajaa. tulosteena puu Pilkkoo käyttömukavuutta lisääviä rakenteita (eli syntaktista sokeria) yksinkertaisempiin osiin; esimerkiksi: for (int i = 0; i < n; i++) { s(i); } { int i = 0; while (i < n) { s(i); i++; } }

Välikoodin generoija engl. intermediate code generator syötteenä tarkastajan ja sokerinpilkkojan läpikäymä puu tulosteena ohjelma välikielellä esitettynä Välikieli on samalla abstraktiotasolla kuin kohdekieli mutta yksinkertaisempi ja säännöllisempi. esim. rajatun rekisteristön sijasta käytetään rajatonta väliaikaismuuttujien joukkoa Jotkut kääntäjät lopettavat kääntämisen tähän ja luovuttavat välikoodin tulkattavaksi ns. virtuaalikoneelle.

Optimoija syö ja tulostaa välikoodia tai syö ja tulostaa kohdekoodia koostuu tavallisesti monesta erillisestä osasta Analyysiosat tutkivat koodia ja tekevät siitä päätelmiä, joista sitten tehdään muistiinpanoja koodiin jatkokäyttöä varten. Muokkausosat muuttavat koodia analyysiosien tekemien havaintojen perusteella. monesti iteroidaan useita kertoja Tällä kurssilla opimointia tarkastellaan lähinnä vain tehokkaan rekisteriallokaation osalta.

Kohdekoodin generoija engl. (target) code generator syö välikoodia tulostaa kohdekoodia jos naiivi, tarvitsee usein kohdekoodin optimoijan (tyypillisesti ovisilmäoptimoija) kaverikseen

päät Etupää, engl. front end etupää on se osa kääntäjästä, joka on tekemisissä lähdekielen erityispiirteiden kanssa selaaja, jäsentäjä, tarkastaja, sokerinpilkkoja sekä välikoodin generoija. Välipää, engl. middle end välipää on se osa kääntäjästä, joka ei ole sen paremmin lähdekielen kuin kohdekielenkään kanssa tekemisissä suuri osa välikoodin optimoijasta. Takapää, engl. back end takapää on se osa kääntäjästä, joka on tekemisissä kohdekielen erityispiirteiden kassa kohdekoodin generoija, kohdekoodin optimoja sekä mahdollisesti osa välikoodin optimoijasta.

Kääntäjäkokoelmat Taitavasti laadittu välipää mahdollistaa etupäiden ja takapäiden vaihtamisen tarvittaessa. Tyypillinen esimerkki on GNU Compiler Collection (GCC). C++-etupää Java-etupää C#-etupää yhteinen välipää IA32-takapää ARM-takapää PowerPC-takapää Kääntäjä, jonka takapää on vaihdettavissa, on tähdättävä kääntäjä, engl. retargetable compiler.

vaihejako Vaihe (engl. pass) tarkoittaa ohjelman (sen esitystavasta riippumatta) läpikäyntiä kerran. Monet kääntäjän eri osat (esimerkiksi selaaja ja jäsentäjä) voidaan liittää toisiinsa limittäin siten, että niiden väliin ei muodosteta koko ohjelman kattavaa välitietotta. Tällöin ne muodostavat saman vaiheen. Toisaalta sama kääntäjän osa (tyypillisesti optimoija) saattaa käydä ohjelman läpi useamman kerran, jolloin se muodostaa useamman vaiheen. Menneinä aikoina kääntäjä saattoi olla koneiden resurssipulan vuoksi jaettu useaksi eri ohjelmaksi (kukin yksi vaihe), ja ne kommunikoivat keskenään massamuistin välityksellä. Tällöin vaiheiden määrän minimointi oli kannattavaa.

Kääntäjä osana käännöstyökalustoa Nykyaikana kääntäjät tuottavat harvoin suoraan ajettavaa ohjelmaa. Tulos on yleensä joko symbolista konekieltä tai linkittämätön konekielinen ohjelmayksikkö. lähdekielinen ohjelma ohjelmakirjastot KÄÄNTÄJÄ ASSEMBLER LINKITTÄJÄ ajettava ohjelma

ajuri lyhyt ohjelma, joka yhdistää kääntäjän vaiheet sekä kääntäjän ulkopuoliset välineet (assembler, linkkeri) helpottaa kääntäjän käyttämistä esim. komento gcc ei ole kääntäjä, vaan ajuri

Tulkki vs kääntäjä lähdeohjelma TULKKI tuloste syöte lähdeohjelma KÄÄNTÄJÄ syöte kohdeohjelma tuloste syöte syöttö syöjä tulostaja tulostus tuloste

Klassinen tulkki ei työstä ohjelmaa etukäteen mitenkään suorittaa ohjelmaa sitä mukaa kuin sitä lukee tekee hypyt siirtämällä syötteen lukukohtaa simuloi siis ko. kieltä suoraan ymmärtävää tietokonetta siksi kutsutaan myös virtuaalikoneeksi tällainen tulkki mahdollinen vain yksinkertaiselle lähdekielelle

Moderni tulkki sisältää kääntäjän etupään keskipään ja takapään tilalla välikielen klassinen tulkki välikieltä kutsutaan usein tavukoodiksi lähdekielinen ohjelma ETUPÄÄ tavukoodi syöte VIRTUAALIKONE tuloste

Tehtävänanto Suunnitelma Tehtävänanto Suunnitelma

n idea Muodostetaan 2 3 hengen ryhmiä. Kukin ryhmä laatii kurssin loppuun mennessä toimivan kääntäjän. Työ jakaantuu seitsemään inkrementtiin. Kunkin inkrementin aluksi luennolla käydään läpi ko. inkrementin teoria. Kunkin inkrementin lopuksi pidetään maanantailuennon paikalla seurantapalaveri, jossa katsotaan, miten kukin ryhmä on onnistunut. Inkrementin pituus 3 viikkoa, mutta inkrementit etenevät limittäin. Tehtävänanto Suunnitelma

Alustava aikataulu luennot (kpl) seuranta A 7.9. 8.9. (2) 21.9. B Jäsennys 14.9. 22.9. (3) 5.10. C Staattiset tarkistukset 28.9. 6.10. (3) 19.10. D Välikielet 12.10. 20.10. (3) 2.11. E Staattinen analyysi 26.10. 3.11. (3) 16.11. F Naiivi koodigenerointi 9.11. 17.11. (3) 30.11. G Fiksu koodigenerointi 23.11. 1.12. (3) 14.12. H 7.12. 8.12. (2) Huomaa: muutokset ovat mahdollisia. Seurantaluennoilla on harjoitustyötä tekevien syytä olla paikalla (poislukien force majeure -esteet) Tehtävänanto Suunnitelma

Inkrementti A: ensimmäinen luento 7.9. seurantapalaveri 21.9. tehtävänä muodostaa ryhmä ja laatia harjoitustyösuunnitelma Tehtävänanto Suunnitelma

Inkrementti B: Jäsennys ensimmäinen luento 14.9. seurantapalaveri 5.10. tehtävänä toteuttaa kääntäjän selaaja ja jäsentäjä Tehtävänanto Suunnitelma

Inkrementti C: Staattiset tarkistukset ensimmäinen luento 28.9. seurantapalaveri 19.10. tehtävänä toteuttaa tarkastaja ja mahdollinen sokerinpilkkoja Tehtävänanto Suunnitelma

Inkrementti D: Välikielet ensimmäinen luento 12.10. seurantapalaveri 2.11. tehtävänä määritellä välikieli ja toteuttaa välikielen generoija tähän inkrementtiin on lupa lopettaa, jos B D hyvin tehty harjoitustyön arvolause tyypillisesti 2 Tehtävänanto Suunnitelma

Inkrementti E: Staattinen analyysi ensimmäinen luento 26.10. seurantapalaveri 16.11. tehtävänä toteuttaa myöhemmin tarkemmin esiteltävät välikoodin optimoijan analyysiosat Tehtävänanto Suunnitelma

Inkrementti F: Naiivi koodigeneraattori ensimmäinen luento 9.11. seurantapalaveri 30.11. tehtävänä toteuttaa yksinkertainen kohdekoodin generaattori tarkoitus on, että kääntäjä tuottaa tämän vaiheen päätteeksi toimivaa koodia harjoitustyön arvolause tyypillisesti 3 Tehtävänanto Suunnitelma

Inkrementti G: Fiksu koodigeneraattori ensimmäinen luento 23.11. seurantapalaveri 14.12. tehtävänä toteuttaa myöhemmin tarkemmin esiteltävät välikoodin optimoijan analyysiosat sekä täydentää kohdekooin generaattoria iottamaan tästä hyöty irti Tehtävänanto Suunnitelma

Inkrementti H: Valmis harjoitustyö Luennot 8.12 9.12. ovat varalla aikataulun lipsumisen varalta; jos lipsumista ei esiinny, ne käytetään kertaukseen ym. Inkrementti on tarkoitettu harjoitustyön viilaukseen: debuggaus, posliinin asentaminen jne. Ei seurantapalaveria; työ palautetaan luennoijalle arvioitavaksi viimeistään 31.12. Arvio valmistuu viimeistään 14.1.2010. Tehtävänanto Suunnitelma

Huomautus aikataulusta Kurssi järjestetään ensimmäistä kertaa, joten aikataulu on lähinnä alustava arvio. Aikataulua tarkistetaan kurssin edetessä. Tehtävänanto Suunnitelma

Suunnitelmassa on oltava kääntäjän työnimi ryhmäläisten nimet ja yhteystiedot (vähintään sähköpostiosoite) lähdekielen alustava määrittely (myös alustavia esimerkkiohjelmia) kohdekielen alustava määrittely isäntäkielen valinta mahdollisesti vaatimusten prioriteettijärjestys ryhmän vastuualuejako alustava testaussuunnitelma Tehtävänanto Suunnitelma

Lähdekieli suositeltavaa ottaa olemassaoleva ohjelmointikieli pohjaksi suunnitelmassa hahmoteltava poikkeamat pohjaksi otetusta kielestä Kurssin aikana keretään todennäköisesti toteuttaa vain osa kielestä, joten halutut ominaisuudet on hyvä priorisoida. Tehtävänanto Suunnitelma

Lähdekielen vaatimukset Pakollisia (korkein prioriteeti): lukukelpoinen (ei siis binäärimössöä) kommentit vähintään kaksi eri tietotyyppiä (tyyppivirheet huomattava viimeistään ajon aikana) kokonaislukuaritmetiikka valintojen tekeminen (if tai muu vastaava) toisto (silmukka tai muu vastaava) paikalliset muuttujat parametrisoitavat aliohjelmat (esim. funktiot tai metodit) Tehtävänanto Suunnitelma

Hyviä kohdekieliä 1. simuloidussa ympäristössä suoritettava RISC-tyyppinen (symbolinen) konekieli Donald E. Knuthin MMIX (simulaattori asennettu mikroluokkiin) ARM (simuloituna) MIPS (simuloituna) PowerPC (simuloituna) Sparc (simuloituna) 2. aidossa ympäristössä suoritettava (symbolinen) konekieli IA-32 (hankala, erityisesti liukulukujen käsittelyssä) AMD64 PowerPC ARM 3. standardoitu välikieli (ei suositella turhan helppoa) LLVM JVM Parrot CIL Tehtävänanto Suunnitelma

Isäntäkielen valinnasta mikä tahansa ohjelmointikieli, jonka tulkkaaminen tai kääntäminen onnistuu luentosalissa (viimeistään omalla läppärillä) kiinnitä huomiota: Kuinka hyvin kieli tukee laajojen ohjelmien tekemistä? Kuinka helppoa sillä on käsitellä puu- ja graafitietorakenteita? Onko sille olemassa kielioppityökaluja (vrt. yacc, CUP)? Kuinka hyvin osaat kieltä jo valmiiksi? Suosittelen Haskellia ja muita ML-suvun kieliä (SML, OCaml), vain jos osaat niitä jo valmiiksi. Tehtävänanto Suunnitelma

Vastuun jako Ryhmässä on hyvä jakaa seuraavat vastuut: ryhmänjohtaja, joka huolehtii siitä, että tekeminen etenee ja ratkaisee kiistat siitä, kuka tekee mitäkin (lähde)kielitsaari, joka ratkaisee kiistat lähdekielen ominaisuuksista testi-inkvisiittori, joka vastaa testauksen kattavuudesta kohdekieliguru, joka tutustuu kohdekielen saloihin ja selvittää tarvittaessa vastaukset kohdekieltä koskeviin kysymyksiin työkaluguru, joka tutustuu valittuihin työkaluihin ja selvittää tarvittaesa vastaukset työkaluja koskeviin kysymyksiin Luonnollisesti samalla henkilöllä voi olla useita rooleja. Jokainen tietenkin osallistuu itse tekemiseen! Tehtävänanto Suunnitelma

Luennoilla mallina käytettävä esimerkkikääntäjä. Lähdekieli on C-kielestä mallia ottava kieli, joka tukee yksinkertaista olio-ohjelmointia ja yksinkertaista innokasta funktio-ohjelmointia. Kohdekielenä on AMD64:n symbolinen konekieli (nasm) Linuxissa. Isäntäkielenä on Java...... koska se on kaikille toivottavasti tuttu. En varsinaisesti suosittele.

Lähdekieli neljä sisäänttua tyyppiä: void (kuten C:ssä), bool (true ja false), byte (0 255) ja int (64 bittiä, etumerkillinen) taulukot pääosin kuten C:ssä funktiot pääosin kuten C:ssä sisäkkäiset funktiot sallittuja ylikuormitus kuin Javan metodeilla yksinkertaiset luokat ei moniperintää, ei Javan kaltaisia rajapintoja syntaksi kuin Javassa metodien ylikuormitus kuten Javassa rakentimet kuin Javassa roskienkeruu, ei finalisoijaa ei parametrisoituja tyyppejä

Hello, World! void main() { print("hello"); }

Kissa naukuu class Elain { public void aantele(); } class Kissa extends Elain { public void aantele() { print("miau!") } } void main() { Elain foo = new Kissa(); foo.aantele(); }

Taulukko-mapsum int mapsum(int(int) f, int[] a, int n) { int rv = 0; for (int i = 0; i < n; i = i + 1) { rv = rv + f(a[i]); } return rv; }

Testaussuunnitelma yksikkötestausta junitilla esimerkkiohjelmakokoelma

Seuraava deadline maanantai 21.9. klo 12 ryhmä muodostettu ja harjoitustyösuunnitelma laadittu