Luento
4
Aliohjelmien toteutus
Tyypit | |
Parametrit | |
Aktivointitietue (AT) | |
AT-pino | |
Rekursio |
Korkean tason ohjelmointikielen käsitteet | |||
aliohjelma, proseduuri | |||
parametrit | |||
funktio | |||
parametrit, paluuarvo | |||
metodi | |||
parametrit, ehkä paluuarvo | |||
Konekielen tason vastaavat käsitteet | |||
aliohjelma | |||
parametrit ja paluuarvo(t) |
Muodolliset parametrit | |||
määritelty aliohjelmassa ohjelmointihetkellä |
|||
tietty järjestys ja tyyppi | |||
paluuarvot | |||
käsittely hyvin samalla tavalla kuin parametreillekin | |||
Todelliset parametrit ja paluuarvo | |||
todelliset parametrit sijoite- taan muodollisten parametrien paikalle kutsuhetkellä suoritusaikana |
|||
paluuarvo saadaan paluuhetkellä ja sitä käytetään kuten mitä tahansa arvoa |
Arvoparametri | ||
välitetään parametrin arvo (eli sen kopio) kutsuhetkellä | ||
itse parametrin arvoa ei voi muuttaa (mutta sen arvon kopiota voi muuttaa) | ||
Viiteparametri | ||
välitetään parametrin osoite | ||
arvo voidaan lukea, arvoa voi muuttaa | ||
Nimiparametri | ||
välitetään parametrin nimi | ||
nimi (merkkijono) kuvataan arvoksi kutsuhetkellä | ||
semantiikka määräytyy vasta kutsuhetkellä |
Välitetään todellisen parametrin arvo | ||
muuttuja, vakio, lauseke, pointteri, olioviite | ||
Aliohjelma ei voi muuttaa mitenkään todellisena parametrina käytettyä muuttujaa | ||
muuttujan (esim. y) arvo | ||
olioviitteen arvo | ||
lausekkeen arvo | ||
muuta arvoparametrin arvoa
aliohjelmassa Þ muutetaan todellisen parametrin arvon kopiota! |
||
todellisen parametrin ptrX arvoa ei voi muuttaa | ||
osoitinmuuttujan osoittamaa arvoa
voidaan muuttaa (osoitinmuuttuja ptrX on siis välitetty arvoparametrina) |
||
Javassa ja C:ssä vain arvoparametreja |
Välitetään todellisen parametrin osoite | ||
muuttujan osoite (tai koodin osoite) | ||
Aliohjelma voi muuttaa parametrina annettua muuttujan arvoa | ||
Pascalin var parametri |
Välitetään todellisen parametrin nimi | ||
merkkijono! | ||
Algol 60 | ||
yleensä makrot | ||
sivuvaikutuksia | ||
nimiparametri korvataan todellisella parametrilla joka viittauskohdassa tekstuaalisesti |
Aliohjelmien toteutuksen osat (5)
Paluuosoite | |||
kutsukohtaa seuraava käskyn osoite | |||
Parametrien välitys | |||
Paluuarvon välitys | |||
Paikalliset muuttujat | |||
Rekistereiden allokointi (varaus) | |||
kutsuvalla ohjelman osalla voi olla käytössä rekistereitä, joiden arvon halutaan säilyä! | |||
pääohjelma, toinen aliohjelma, sama aliohjelma, metodi, … | |||
käytettyjen rekistereiden arvot pitää aluksi tallettaa muistiin ja lopuksi palauttaa ennalleen |
Aliohjelman toteutusmuoto (ttk-91) | ||
funktion paluuarvo (tai kaikki paluuarvot) |
||
kaikkien (sisäänmeno- ja ulostulo-)
parametrien arvot |
||
paluuosoite | ||
kutsukohdan aktivointitietue | ||
kaikki paikalliset muuttujat ja tietorakenteet | ||
aliohjelman ajaksi talletettujen rekistereiden alkuperäiset arvot |
Aktivointitietueiden hallinta (4)
Aktivointitietueet (AT) varataan ja vapautetaan dynaamisesti (suoritusaikana) pinosta (muistista) | ||
SP (=R6) osoittaa pinon pinnalle | ||
Aktivointitietuepino | ||
FP (R7) osoittaa voimassa olevan AT:n sovittuun kohtaan (ttk-91: vanhan FP:n osoite) |
||
Pinossa olevaa AT:tä rakennetaan ja puretaan käskyillä: |
||
PUSH, POP, PUSHR, POPR | ||
CALL, EXIT (SVC, IRET) |
Aliohjelman käytön toteutus (12)
Toteutus jaettu eri yksiköille | ||
varaa tilaa paluuarvolle pinosta | ||
laita parametrit (arvot tai osoitteet) pinoon | ||
talleta vanha PC ja FP, aseta uudet PC ja FP | ||
varaa tilaa paikallisille muuttujille | ||
talleta käytettävien rekistereiden
vanhat arvot pinoon |
||
(itse aliohjelman toteutus – varsinainen työ) | ||
palauta rekistereiden arvot | ||
vapauta paikallisten muuttujien tila | ||
palauta PC ja FP | ||
vapauta parametrien tila | ||
ota paluuarvo pinosta |
Aliohjelma kutsuu aliohjelmaa (1)
Aliohjelma kutsuu funktiota (2)
Aliohjelma, joka kutsuu itseään | ||
Ei mitään erikoista muuten | ||
Aktivointitietue hoitaa tilanvarauksen automaattisesti paikallisille muuttujille joka kutsukerralla (uusi AT joka kutsukerralla) | ||
Rekursio ei onnistu, jos paikallisten muuttujien tilanvaraus aliohjelman ohjelmakoodin yhteydessä | ||
jotkut Fortran versiot | ||
Joka kutsukerralla suoritetaan sama
koodi- alue (aliohjelman koodi), mutta dataa varten on käytössä oma aktivointitietue |
KJ-palvelun kutsu (proseduraalisesti) (7)
Samalla tavalla kuin aliohjelman kutsu | ||
CALL käskyn asemesta SVC |
||
Tila paluuarvolle? | ||
Parametrit pinoon | ||
SVC kutsu | ||
IRET paluu | ||
Paluuarvo (OK, virhe) pois pinosta tarkistusta varten |