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 | ||