Luento 4
Aliohjelmien toteutus
Tyypit
Parametrit
Aktivointitietue (AT)
AT-pino
Rekursio

Aliohjelmatyypit (2)
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)

Parametrit ja paluuarvo (2)
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

Parametrityypit (4)
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ä

Arvoparametri (10)
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

Viiteparametri (5)
Välitetään todellisen parametrin osoite
muuttujan osoite (tai koodin osoite)
Aliohjelma voi muuttaa parametrina annettua muuttujan arvoa
Pascalin var parametri

Nimiparametri (6)
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

Aktivointitietue (7)
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

Aliohjelmaesimerkki (13)

Aliohjelma-
esimerkki (11)

Viiteparametri esimerkki (2)

Viiteparam.
(jatk) (1)

Aliohjelma kutsuu aliohjelmaa (1)

Aliohjelma kutsuu funktiota (2)

Rekursiivinen aliohjelma (5)
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

Rekursio esimerkki (1)

Rekursion toteutus (2)

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

-- Luennon 4 loppu --