Kääntäjätekniikka

Luento 9 (26.4.2016)

Luennon livekoodaukset Yousourcessa

Kääntäjän rakenne

# compilerstructure
test src Lähdeohjelma toks Sanasjono src->toks selaaja ast Rakennepuu toks->ast jäsentäjä ast->ast tarkastaja, sokerinpilkkoja il Välikoodi ast->il välikoodin generoija il->il optimoija asm Kohdekoodi il->asm kohdekoodin generoija asm->asm optimoija

Paikalliset muuttujat

  • Deklaraatio luo muuttujan kuvaustietueen, joka tallennetaan aliohjelman metatietoihin välikoodissa. Sisältää mm.
    • viittauksen aliohjelmaan, jonka paikallinen muuttuja on kyseessä
    • riittävästi tietoa (esim. tyyppi), josta takapää pystyy päättelemään koon ja alignmentin
  • Kuvaustietue sidotaan muuttujan nimeen symbolitaulussa
  • Kuvaustietue sopii hyvin kolmiosoitekoodin operandiksi.

Paikallisten muuttujen luokittelu

  • Jaotellaan kolmeen luokkaan (ei kaikkia kaikissa kääntäjissä):
    • pakenevat muuttujat: muuttujat, joiden tulee pysyä hengissä aliohjelman päätyttyä
      • kootaan omaan tietueeseensa, joka varataan keosta
    • pinomuuttujat: muuttujat, joilla tulee olla osoite mutta jotka voivat kuolla aliohjelman päättyessä
      • varataan pinosta
    • rekisterimuuttujat: muut paikalliset muuttujat
      • rekisteriallokaattori päättää, riittääkö rekisteri vai varataanko pinosta
  • Luokittelu tallennetaan kuvaustietueeseen
    • alustetaan yleensä rekisterimuuttujaksi.
    • Muuttujaan viitattaessa luokittelua päivitetään tarvittaessa.
  • Luokittelun voi tehdä myös erillisenä AST:n tai välikoodin läpikäyntinä.

Aliohjelmat

Aliohjelmakutsut

  • Välikoodin generoijan 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, xp
  • Tällöin kutsu ja parametrit muodostavat puun, jossa kutsu on ensimmäisenä ja parametrit lineaarisesti järjestyksessä oikeassa alipuussa.

Aliohjelman määrittely

  • Aliohjelmalle luodaan oma tietueensa. Sisältää mm:
    • ABI-tiedon, jos kielessä aliohjelmalle voi määritellä eri ABI'eja
    • paikallisten muuttujien kuvaustietueet
      • parametrit käsitellään enimmälti paikallisina muuttujina
    • aliohjelman rungosta generoidun välikoodin
    • aliohjelman välikoodin generoinnissa luodut väliaikaismuuttujat
    • viittauksen ympäröivän aliohjelman tietueeseen, jos sellainen on
  • Alihjelman tietue sidotaan aliohjelman nimeen symbolitaulussa ennen aliohjelman välikoodin generointia.
    • tietue toimii näin myös välikoodin operandina

Tietueet

  • Välikoodin generaattorin ei välttämättä tarvitse välittää tietueen tarkasta layoutista.
  • Tietueoperandiin tulee sisältyä tieto sen kenttien nimistä, järjestyksestä ja tyypistä (koko ja alignment)
  • Tietueen kenttään viittaus kannattaa käsitellä omana operandinaan, joka koostuu
    • muuttuja- tai väliaikaismuuttujaoperandista, joka sisältää tietueen tai sen osoitteen
      • ei sisäkkäistä kenttäänviittausoperandia!
    • kentän nimestä

Variantit

  • Variantti on olennaisesti tietue, jossa on kaksi kenttää
    • tieto, mikä variantiin kentistä on aktiivinen
    • tila itse variantin sisältämälle datalle tai osoitin siihen

Taulukot

  • Välikielessä ei välttämättä tiedetä taulukon alkion todellista kokoa, joten indeksointi kannattaa toteuttaa omina käskyinään x := y[z] ja x[y] := z.
  • Vaihtoehtoisesti indeksointi on operandi (kuten tietueen kenttään viittaus)
  • Moniulotteisen taulukon indeksointi on peräkkäistä indeksointia.

These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.