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

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

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

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

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

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

Muita rekisteriallokaatiomenetelmiä

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

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Java-kielen perusteet

12. Monimuotoisuus 12.1

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

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

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

Java-kielen perusteet

Taulukot. Jukka Harju, Jukka Juslin

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

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

12. Monimuotoisuus 12.1

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

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

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

Olio-ohjelmointi Syntaksikokoelma

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

Rajapinta (interface)

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

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

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

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

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

15. Ohjelmoinnin tekniikkaa 15.1

Käännös, linkitys ja lataus

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

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Rakenteiset tietotyypit Moniulotteiset taulukot

7. Oliot ja viitteet 7.1

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

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

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

Tietueet. Tietueiden määrittely

15. Ohjelmoinnin tekniikkaa 15.1

Javan perusteita. Janne Käki

Rutiinin muodostaminen. 2. Rutiinin muodostaminen. specification) Määrittely (specification( Määrittelyn osapuolet. Hyvän ohjelman tunnusmerkit

Tietotekniikan valintakoe

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

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

Ohjelmoinnin jatkokurssi, kurssikoe

TIEA241 Automaatit ja kieliopit, kevät Antti-Juhani Kaijanaho. 12. tammikuuta 2012

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

Taulukoiden käsittely Javalla

Algoritmit 2. Luento 2 To Timo Männikkö

Mikä yhteyssuhde on?

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

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

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

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

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

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

Java kahdessa tunnissa. Jyry Suvilehto

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 16.3

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

20. Javan omat luokat 20.1

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

1. Omat operaatiot 1.1

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

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

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

18. Abstraktit tietotyypit 18.1

ITKP102 Ohjelmointi 1 (6 op)

Tieto ja sen osoite (3) Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI) Osoitinmuuttujat. Tieto ja sen osoite (5)

tietueet eri tyyppisiä tietoja saman muuttujan arvoiksi

13 Operaattoreiden ylimäärittelyjä

19. Olio-ohjelmointia Javalla 19.1

5.6. C-kielen perusteet, osa 6/8, Taulukko , pva, kuvat jma

7. Näytölle tulostaminen 7.1

Silmukkaoptimoinnista

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys)

Metodien tekeminen Javalla

TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 19. tammikuuta 2012

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

Taulukot. Taulukon käsittely. Tämän osan sisältö. Esimerkki. Taulukon esittely ja luonti. Taulukon alustaminen. Taulukon koko

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

1. Mitä tehdään ensiksi?

1 Tehtävän kuvaus ja analysointi

Jakso 4 Aliohjelmien toteutus

Sisällys. 19. Olio-ohjelmointia Javalla. Yleistä. Olioiden esittely ja alustus

TAMPEREEN TEKNILLINEN YLIOPISTO

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Pakkaukset ja määreet

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

Listarakenne (ArrayList-luokka)

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

Java-kielen perusteet

Luento 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Transkriptio:

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

Sisällys

Sisällys

Seuraava deadline Vaihe D tiistai 10.11. klo 10 välikielen generointi

Kääntäjän rakenne lähdeohjelma SELAAJA sanasjono JÄSENTÄJÄ VÄLIKOODIN GENEROIJA KOHDEKOODIN GENEROIJA rakennepuu välikoodi kohdeohjelma TARKASTAJA SOKERINPILKKOJA OPTIMOIJA OPTIMOIJA

Sisällys

Koko ja tasaus Jokaisella tietotyypillä on takapään päättämä koko (kuinka monta tavua tarvitaan yhden tietotyypin muuttujan esittämiseen) ja tasaus (engl. alignment) (eli millä jaollisesta osoitteesta tietotyypin muuttuja alkaa. Esimerkiksi SYSV ABI:ssa (mm. Linux): char int long osoitin koko tasaus koko tasaus koko tasaus koko tasaus IA32 1 1 4 4 4 4 4 4 MIPS 1 1 4 4 4 4 4 4 PowerPC 1 1 4 4 4 4 4 4 PPC64 1 1 4 4 8 8 8 8 Sparc 1 1 4 4 8 8 8 8 AMD64 1 1 4 4 8 8 8 8 Välikielen generoinnissa pitää muuttujan, tietue-kentän ym. tyypistä poimia koko ja tasaus, ja kuljettaa niitä tietoja väliesityksen mukana. Esim. mallikääntäjässä takapäällä on metodit describetype useille tyypeille, ja niitä käyttäen TypeDescriber-visitori; jokaisella välikielen muuttujalla on koko- ja tasaus-kentät.

Kun lausekkeessa esiintyy nimi, se voi viitata moneen eri asiaan: globaaliin muuttujaan paikalliseen muuttujaan globaaliin aliohjelmaan paikalliseen aliohjelmaan (jos lähdekieli tukee) luokan metodiin (luokan sisällä, jos lähdekielessä implisiittinen this) Generoitava koodi riippuu symbolitaulun sisällöstä. Yksi hyvä tapa: symbolitaulussa olevalla oliolla on metodi generateaccess, joka generoi ko. nimen arvon hakemisen.

Paikallisen muuttujan esittely Paikallisen muuttujan esitystapa riippuu takapään tekemistä valinnoista. Kannattaa siis tehdä niin, että paikallisen muuttujan esittelyssä annetaan takapään päättää. Esimerkkikääntäjässä muuttuja esitetään abstraktina operandina, josta takapää perii oman toteutuksensa. public Void visit(localvariable st){ Variable v = r.addlocalvariable(st.type.accept(new TypeDescriber(tgt))); if (st.initializer!= null) { Rand iv = st.initializer.accept(new EvalGen(tgt, p, r, symtab)); r.addtriple(op.copy, v, iv); } symtab.declare(st.name, new RandAccess(v)); return null; }

Sisällys

Taulukon esitystapa Taulukko on samantyyppisten otusten jono, jossa otukset ovat saman muistialueen sisällä peräkkäin. Moniulotteinen taulukko voidaan esittää joko muuttamalla se yksiulotteiseksi (kuten C), tai sitten taulukkoviittausten taulukkona (kuten Java). Olennaista on huolehtia, että jokaisella alkiolla on tarpeeksi tilaa (vähintään tietotyyppinsä koon verran) ja jokainen alkio alkaa tasauksella jaollisesta osoitteesta. Käytännössä siis alkion koko taulukossa on koko % tasaus!= 0? koko + (tasaus - koko % tasaus) : koko;

Taulukon indeksointi Yksiulotteiset taulukot Taulukon indeksissä i oleva alkio alkaa osoitteesta b + (i i ) d missä ensimmäisen alkion indeksi on i, b on taulukon alun osoite ja d on taulukon alkion koko taulukossa (tasaus huomioon otettuna)

Taulukon indeksointi Moniulotteiset taulukot Taulukon indeksissä (i 1,..., i m ) oleva alkio alkaa osoitteesta [ ] m b + (i k ik m )d n l k=1 l=k+1 missä kunkin dimension k ensimmäinen indeksi on i k b on taulukon alun osoite, d on taulukon alkion koko taulukossa (tasaus huomioon otettuna), ja n l on dimension l alkioiden lukumäärä.

Taulukon indeksointi Edellä esitetty moniulotteisen taulukon indeksin kaava olettaa, että koko indeksointi tehdään yhdessä operaatiossa (kuten esim. Pascalissa) ja että koko taulukko esitetään yhtenä muistialueena (toisin kuin Javassa). C:n kaltaisessa kielessä sen sijaan jokaista dimensiota indeksoidaan erikseen (esim. a[i][j], ei a[i, j]). Tällöin kukin indeksointi voidaan hoitaa yksiulotteisen indeksoinnin kaavalla...... kunhan muistetaan alkion kokoa laskiessa, että taulukon alkio voi olla taulukko. Tällä tavalla ero C:n ja Javan taulukoiden välillä on helppo: tähdätäänkö kunkin indeksoinnin jälkeen aina vaiko ei. Huomaa, että kaavoissa on joka tapauksessa paljon käännösaikaisia vakioita!

Sisällys

Tietueet Tietue koostuu nimetyistä kentistä, joilla jokaisella on oma tyyppinsä. Tietueelle pitää konstruoida symbolitaulu, joka yhdistää kentän sen sijaintiin tietueessa. Kentät sijoitetaan tietueeseen yleensä esittelyjärjestyksessä. Kentän sijainnin tulee olla aina jaollinen kentän tyypin tasauksella! Näin tietueeseen voi jäädä tyhjiä pätkiä...... ja tietueen kenttien yhteenlaskettu koko voi olla vähemmän kuin tietueen koko!

Metoditaulu myös: virtuaalitaulu, vtable Luokalle, joka sisältää ainakin yhden virtuaalimetodin, tulee konstruoida metoditaulu. Metoditaulu on globaali vakio, ja sen osoite laitetaan jokaiseen olioon ensimmäiseksi kentäksi. Oletetaan ensiksi, että luokkaa ei ole peritty mistään luokasta: Tällöin kullekin metodille annetaan sijainti metoditaulussa, yleensä esittelyjärjestyksessä. Metodille varataan yleensä tilaa taulussa absoluuttisen hyppyosoitteen vaatiman tilan verran. Luokan metoditauluun laitetaan kunkin ei-abstraktin metodin kohdalle hyppyosoite ko. metodin toteuttavaan aliohjelmaan.

Aliluokan metoditaulu Jos luokka on peritty jostain (yhdestä) luokasta: Yläluokassa määriteltyjen metodien sijainniksi laitetaan sama kuin yläluokan metoditaulussa. Luokan määrittelemät metodit, joita ei yläluokassa ole, lisätään metoditauluun yläluokan metodien jälkeen. Jos luokka ei ylimäärittele jotain yläluokan metodia, ko. metodin kohdalle laitetaan sama osoite kuin yläluokan metoditaulussa on. Luokan metoditauluun laitetaan kunkin sen määrittelemän ei-abstraktin metodin kohdalle hyppyosoite ko. metodin toteuttavaan aliohjelmaan. Moniperintä on huomattavasti hankalampaa.

Downcast-tyyppimuunnokset Jos lähdeohjelmassa muutetaan luokkatyyppi alityypikseen,...... tulee välikieleen lisätä sen tarkistus, että olio on todellä ko. alityyppiä. Tätä varten metoditaulun ensimmäiseen kohtaan kirjataan yläluokan metoditaulun osoite (tai muutoin nollaosoite). Tyyppimuunnoksen (T)E kohdalla sitten tehdään seuraavaa: 1. Olkoon m E-olion metoditaulun osoite. 2. Jos m on nollaosoitin, hylätään tyyppimuunnos (heitetään poikkeus, kaadetaan ohjelma tms.). 3. Jos m on T:n metoditaulun osoite, hyväksytään tyyppimuunnos. 4. Muutoin sijoitetaan m:ään m:n ensimmäisen alkion arvo (yläluokan metoditaulun osoite) ja hypätään kohtaan 2.

Metodin dynaaminen sidonta Kun tulee tarve selvittää, mihin pitää hypätä metodikutsussa, toimitaan seuraavasti: Selvitetään käännösaikana luokan symbolitaulusta, mikä on metodin sijainti metoditaulussa. Haetaan olion metoditaulusta (jonka osoite löytyy olion alusta) ko. kohdalta hyppyosoite. Käytännössä kannattaa tehdä niin, että symbolitaulussa olevassa oliossa on genaccess-metodi, joka tekee yo. asiat. Tällöin nimiviittauksen kohdalla ei tarvitse iffitellä onko kyseessä metodi vai ei.

Sisällys

Välikoodin generoija ei tarvitse tietää aliohjelmasta sen parametrien määrää ym. Ne oletetaan olevan ok tyyppitarkastuksen pohjalta. Argumentit pitää laskea yksi kerrallaan. Laskujärjestys riippuu kielestä: vasemmalta oikealle ja oikealta vasemmalle ovat tavallisimmat. Välikielessä ei kannata esittää kutsua monimutkaisesti. Esim. kolmiosoitekoodissa riittää hyvin jokin seuraavanlainen sekvenssi kutsulle f (x, y): yp := ARG y xp := ARG x, yp res := CALL f, xs Tällöin kutsu ja parametrit muodostavat puun, jossa kutsu on ensimmäisenä ja parametrit lineaarisesti järjestyksessä oikeassa alipuussa.

esimerkkikääntäjässä public Rand gencall(call call) { EvalGen eg = new EvalGen(tgt, p, r, symtab); ArrayList<Rand> args = new ArrayList<Rand>(); for (Expression arg : call.args) { Rand ra = arg.accept(eg); args.add(ra); } Rand fr = call.fun.accept(eg); Rand rest = null; for (Rand arg : new ReverseList<Rand>(args)) { rest = r.addtriple(op.arg, arg, rest); } return r.addtriple(op.call, fr, rest); }

Sulkeuma Mallikääntäjässä aliohjelman nimen mainitseminen tuottaa sulkeuman tietueen, joka sisältää aliohjelman hyppyosoitteen, aliohjelman tarvitseman staattisen linkin (jos paikallinen aliohjelma) ja this-osoittimen (jos metodi tai metodin paikallinen aliohjelma) ja sulkeuman tulkitseminen kutsussa jätetään takapään huoleksi.

Sisällys

Seuraava deadline Vaihe D tiistai 10.11. klo 10 välikielen generointi