Kääntäjän rakenne
#
compilerstructure
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
- pakenevat muuttujat: muuttujat, joiden tulee pysyä hengissä aliohjelman päätyttyä
- 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ä
- muuttuja- tai väliaikaismuuttujaoperandista, joka sisältää tietueen tai sen osoitteen
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]
jax[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.