Luentokalvot - Aliohjelmat

*x++=*y++
815338A
Ohjelmointikielten
periaatteet
2014 - 2015
IV.3 Imperatiivinen ohjelmointi
– aliohjelmat
*x++=*y++
Sisältö
1.
2.
3.
4.
5.
6.
7.
Yleistä aliohjelmista
Proseduurit ja funktiot
Parametrien välittäminen
Taulukon välittäminen parametrina
Aliohjelman välittäminen parametrina
Ylikuormittaminen ja geneerinen ohjelmointi
Aliohjelmien toteuttamisesta
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
2
*x++=*y++
IV.3.1. Yleistä aliohjelmista

Prosessien abstrahointiväline
 Esiintynyt ohjelmointikielissä alusta asti
 Liittyvät top-down-suunnitteluun: Ohjelma kuvataan
asteittain tarkennettavina toimintakokonaisuuksina,
joita kuvataan aliohjelmilla
 Aliohjelmat suorittavat jonkin tietyn toiminnon
”mustan laatikon” tapaan (yksityiskohdat piilotettu)
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
3
*x++=*y++
IV.3.1. Yleistä aliohjelmista (2)


Kaikissa ohjelmointikielissä jonkinlainen
aliohjelmatoteutus
 Yksi merkittävimmistä ohjelmointikielten käsitteistä
Tässä käsiteltävien ohjelmointikielten aliohjelmien
yhteisiä piirteitä:
1.Jokaisella aliohjelmalla täsmälleen yksi tulokohta
2.Aliohjelmaa kutsuvan ohjelman suoritus estetään
kutsun ajaksi -> vain yhtä aliohjelmaa suoritetaan
kerrallaan
3.Ohjelmakontrolli palaa kutsuvalle ohjelmalle, kun
aliohjelman suoritus loppuu
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
4
*x++=*y++
IV.3.1. Yleistä aliohjelmista (3)


Poikkeuksia ym. periaatteista
 FORTRANissa voi olla useampia tulokohtia (merkitys
vähäinen)
 Rinnakkaisessa ohjelmoinnissa useita samanaikaisesti
suoritettavia aliohjelmia (käsitellään lyhyesti
myöhemmin)
Aliohjelman määrittelyn osat: otsikko (header) ja runko
(body)
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
5
*x++=*y++
IV.3.1.1. Aliohjelman otsikko




Määrittelee aliohjelman rajapinnan = aliohjelman nimi,
muodolliset parametrit ja niiden tyypit
Paluuarvon tyyppi (mikäli on)
Joissakin kielissä (esim. Java) aliohjelman suorituksen
aiheuttamien poikkeuksien tyypit
Joissakin kielissä aliohjelmat voidaan esitellä (otsikkonsa
avulla) erillään määrittelystä = aliohjelman prototyyppi
 Prototyypit yleisiä C-kielessä, Adassa ja Pascalissa
 Javassa ei voi esitellä aliohjelmia (ei tarvita Javan
näkyvyyssääntöjen takia)
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
6
*x++=*y++
IV.3.1.2. Aliohjelman runko


Aliohjelman toimintalogiikka = lauseet, jotka suoritetaan
aliohjelmaa kutsuttaessa
Esitellään aliohjelman paikalliset muuttujat ja
määritellään aliohjelmalle alisteiset aliohjelmat (ei ole
sallittua kaikissa kielissä, esim. C – Pascalissa sisäkkäiset
aliohjelmat sallittu)
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
7
*x++=*y++
IV.3.1.3. Aliohjelman kutsu (call)



Pyyntö suorittaa aliohjelma
 Yleensä kutsutaan aliohjelman nimellä
 FORTRANissa kutsulle oma käsky CALL
(proseduureille)
Muodolliset (formaalit) parametrit
 Aliohjelman otsikossa määriteltävät parametrit
(sidotaan muistiin aliohjelmaa kutsuttaessa)
Todelliset parametrit
 Aliohjelman kutsussa oleva lista parametreista, jotka
sidotaan aliohjelman muodollisiin parametreihin
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
8
*x++=*y++
IV.3.1.3. Aliohjelman kutsu (2)
Aliohjelman
double ali (int x, char c)
otsikko
{
Muodolliset
Alix += 2; c = ’z’;
parametrit
ohjelman
return 3.14;
runko
}
int main(int argc, char * argv[]) {
int luku = 5;
Todelliset
char merkki = ’m’;
parametrit
double d = ali(luku,m);
…
}
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
9
*x++=*y++
IV.3.1.3. Aliohjelman kutsu (2)


Lähes kaikissa ohjelmointikielissä sidonnan määrää
parametrin sijainti listassa
 Ada ja FORTRAN 90: voi käyttää myös
avainsanaparametreja
Joissakin kielissä (C++) oletusarvot mahdollisia:
int funk(int eka,float toka,double kol=1.0)
voidaan kutsua kahdella parametrilla -> kolmas saa
arvon 1.0
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
10
*x++=*y++
IV.3.1.4. Aliohjelman parametrien
välitysmekanismi



Tapa, jolla muodollinen parametri sidotaan todelliseen
parametriin
Tärkeimpiä valittavia ominaisuuksia aliohjelman
suunnittelussa
Toteutukseen useita malleja
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
11
*x++=*y++
IV.3.1.5. Muita suunnittelukriteerejä
1. Miten tarkastetaan parametrien tyypit
2. Minkälaisia parametreja voi välittää (esimerkiksi
aliohjelmat parametreina)
3. Paikallisten muuttujien allokointitapa
4. Sallitaanko sisäkkäiset aliohjelmat
5. Voidaanko aliohjelmia ylikuormittaa
6. Sallitaanko geneeriset aliohjelmat
7. Voidaanko aliohjelmia kääntää riippumattomina
yksiköinä
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
12
*x++=*y++
IV.3.2. Proseduurit ja funktiot



Proseduuri
 Aliohjelma jolla ei paluuarvoa
 Ohjelmassa lauseen asemassa
Funktio
 Palauttaa arvon
 Ohjelmassa lausekkeen asemassa
Toteutus ohjelmointikielissä varsin samantyyppinen
 Kaikissa kielissä ei molempia tyyppejä (esim. C vain
funktiot)
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
13
*x++=*y++
IV.3.2.1. Proseduurit

FORTRANissa esitellään sanalla SUBROUTINE
SUBROUTINE OPEROI(I,J)
kutsuttaisiin pääohjelmasta esimerkiksi
CALL OPEROI(10,20)

Pascalissa:
PROCEDURE OPEROI(I:INTEGER;J:INTEGER)
kutsutaan koodissa aliohjelman nimellä
OPEROI(10,20);

C-pohjaisissa kielissä void-tyyppinen funktio:
void operoi(int x, int y)
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
14
*x++=*y++
IV.3.2.2. Funktion paluuarvo


Yleisimmin annetaan return-lauseessa, joka aiheuttaa
aliohjelman suorituksen loppumisen
Esimerkiksi C-funktiossa
double laskeArvo(int x, int y) {
double retVal;
...
retVal = ...
...
return retVal;}
-> paluuarvo muuttujan retVal se arvo, joka muuttujalla
return-lausetta suoritettaessa
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
15
*x++=*y++
IV.3.2.2. Funktion paluuarvo (2)

FORTRAN: aliohjelmasta palataan RETURN-lauseella,
mutta sen yhteydessä ei anneta paluuarvoa, joka
annetaan funktiolle sijoituslauseessa:
FUNCTION SUMMA(II,JJ)
SUMMA = II+JJ
RETURN
END
 Funktiota kutsutaan FORTRANissa nimellä, ts.
X = SUMMA(12,25)
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
16
*x++=*y++
IV.3.2.2. Funktion paluuarvo (3)

Pascal: Paluuarvo kuten FORTRANissa, mutta Pascalissa
ei return-lausetta -> funktio suoritetaan loppuun saakka.
FUNCTION
MYFUNK(para1:INTEGER;para2:INTEGER):
REAL;
var m:INTEGER;
BEGIN
MYFUNK := 2.1;
FOR m:=1 TO para1+para2 DO
writeln ('turhaa');
END;
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
17
*x++=*y++
IV.3.3. Parametrien välittäminen

Aliohjelma voi siirtää tietoa kutsuvan ohjelman kanssa
joko globaalien (yhteisten) muuttujien avulla tai
parametrien välityksellä
 Globaalit muuttujat -> sivuvaikutuksia
 Parametrit parempi ratkaisu
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
18
*x++=*y++
IV.3.3.1. Parametrien luokittelu semantiikan
mukaan
1. Parametrit, jotka välittävät tietoa aliohjelmaan
 Sidonnan moodi in
2. Parametrit, jotka välittävät tietoa aliohjelmasta
kutsuvaan ohjelmaan
 Sidonnan moodi out
3. Parametrit, jotka välittävät tietoa kumpaankin suuntaan
 Sidonnan moodi inout
 Joissakin kielissä parametri voidaan määritellä jonkin
tyyppiseksi, toisissa tyyppi vakio -> välitystavat
toteutettava muutoin
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
19
*x++=*y++
IV.3.3.2. Datan siirron toteutus parametrin
välityksessä
1. Välitettävä arvo kopioidaan tai
2. Tiedon saantipolku (käytännössä useimmiten
muistipaikan osoite) siirretään
 Ensimmäinen turvallisempi, jälkimmäinen
tehokkaampi
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
20
*x++=*y++
IV.3.3.2. Datan siirron toteutus parametrin
välityksessä (2)

Parametrien välitysmekanismit
1.Arvovälitys
2.Viitevälitys
3.Tulosvälitys
4.Arvo-tulosvälitys
5.Nimivälitys
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
21
*x++=*y++
IV.3.3.3. Arvovälitys





Muodollinen parametri eräänlainen paikallinen muuttuja,
joka alustetaan todellisen parametrin arvolla
Toteutetaan yleisimmin kopioimalla todellisen parametrin
data paikalliseen muuttujaan -> parametrimuuttujan
muuttaminen aliohjelmassa ei vaikuta todellisen
parametrin arvoon
Vakioparametri = parametri, jonka arvoa ei voi
aliohjelmassa muuttaa -> parametri paikallinen vakio
Pääasiallinen haitta: suurikokoisten parametrien
välittäminen -> kopiointi kuluttaa resursseja
Siis in-moodi
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
22
*x++=*y++
IV.3.3.4. Tulosvälitys





Todellisten parametrien arvoja ei välitetä aliohjelmalle
Aliohjelmassa parametri kuin paikallinen muuttuja, jonka
arvo kopioidaan kutsuvan ohjelman parametrin arvoksi
 -> todellisen parametrin on oltava muuttuja
Toimii ikään kuin arvovälitys päinvastoin
Tulosvälityksessä törmäämisongelma (ei esiinny
arvovälityksessä)
Siis out-moodi
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
23
*x++=*y++
IV.3.3.4. Tulosvälitys (2)

Esimerkki törmäämisestä tulosvälityksessä:
ali (int x, int y)
{
x = 2;
y = 3;
}
Jos pääohjelmassa kutsu ali(z,z), mikä arvo z:lle?
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
24
*x++=*y++
IV.3.3.5. Arvo-tulosvälitys






Yhdistelmä edellisistä
Toteuttaa tiedonvälityksen molempiin suuntiin
Mekanismi
1. Todellisen parametrin arvo kopioidaan paikallisena
muuttujana toimivan muodollisen parametrin arvoksi
2. Aliohjelman palatessa em. muuttujan arvo
kopioidaan todellisen parametrin arvoksi
Todellisen parametrin on oltava muuttuja
Sisältää sekä arvo- että tulosvälityksen haittapuolet
Siis inout-moodi
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
25
*x++=*y++
IV.3.3.6. Viitevälitys



Toteuttaa tiedonvälityksen molempiin suuntiin (inoutmoodi)
Ei välitetä arvojen kopioita, vaan parametrina annetaan
muuttujan muistiosoite -> aliohjelma muokkaa
alkuperäistä muuttujaa
Resurssien käytön kannalta huomattavan tehokas (dataa
ei tarvitse siirtää, eikä ylimääräistä muistia varata)
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
26
*x++=*y++
IV.3.3.6. Viitevälitys (2)

Turvallisuus kärsii viitevälityksessä:
 Aliohjelman muokatessa alkuperäistä muuttujaa, ei
virhetilanteessa voi palauttaa sitä aliohjelmakutsua
edeltäneeseen tilaan
 Viitevälitys voi tuottaa moninimisyyttä, yleensä eitoivottua. Esimerkki C++:
void funk(int &pi1,int &pj2)
kutsuttaessa
int muuttuja = 1;
funk(muuttuja, muuttuja);
-> funktiossa pi1 ja pj2 viittaavat samaan muuttujaan,
voi aiheuttaa hankaluuksia
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
27
*x++=*y++
IV.3.3.7. Nimivälitys




Perustuu myöhäiseen sidontaan
Harvinainen: Tunnetuista kielistä vain ALGOL 60,
SIMULA 67
Idea: tekstuaalinen kopiointi, jossa todellinen parametri
(ilmauksena) kopioituu muodollisen parametrin kaikkiin
esiintymiskohtiin. Tämän jälkeen aliohjelma kopioituu
sen kutsumiskohtaan
Tosiasiassa tapahtuva parametrin välitys riippuu
parametrin tyypistä
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
28
*x++=*y++
IV.3.3.7. Nimivälitys




Todellinen parametri on primitiivisen tietotyypin
muuttuja -> vastaa viitevälitystä
Todellinen parametri on lauseke, joka sisältää muuttujia
-> ei muistuta mitään edellä esitetyistä mekanismeista
Vaikea toteuttaa
Ohjelmoijan kannalta hankala
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
29
*x++=*y++
IV.3.3.8. Mekanismit esimerkkikielissä: C, C++, C#
ja Java

C ja Java: Aina arvovälitys parametreille -> C –kielinen
funktio
void vaihda(int x,int y){
int temp = x;
x = y;
y = temp;
}
ei vaihda todellisten parametrien arvoa
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
30
*x++=*y++
IV.3.3.8. Mekanismit esimerkkikielissä: C, C++, C#
ja Java (2)

Vaihto toteutettava C:ssä osoittimilla:
void vaihda(int *x, int *y){
int temp = *x;
*x = *y;
*y = temp;
}
int eka = 10, toka = 20;
vaihda(&eka,&toka);
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
31
*x++=*y++
IV.3.3.8. Mekanismit esimerkkikielissä: C, C++, C#
ja Java (3)


Huomaa: Javassa ei osoittimia -> primitiivisten
tietotyyppien arvoja ei voi näin vaihtaa
C++: Viitevälityksen voi tehdä viitemuuttujilla
void vaihda(int &x,int &y){
int temp = x;
x = y;
y = temp;
}
int eka = 10, toka = 20;
vaihda(eka,toka);
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
32
*x++=*y++
IV.3.3.8. Mekanismit esimerkkikielissä: C, C++, C#
ja Java (4)



C#: Oletusmekanismi arvovälitys
Voidaan toteuttaa myös viitevälitys
 Avainsanat ref ja out
 Molemmissa viitevälitys, ref-parametri alustettava
Esimerkki
public void vaihda(ref int x,ref int y){
int temp = x;
x = y;
y = temp;
}
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
33
*x++=*y++
IV.3.3.8. Mekanismit esimerkkikielissä: Pascal



Parametrin välityssemantiikka voidaan valita
Ellei anneta välitystyyppiä, käytetään arvovälitystä
Jos halutaan inout –semantiikka, määritellään parametrit
muuttujaparametreiksi määreellä VAR ->
viittausvälitys (aliohjelma käsittelee muistipaikkaa)
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
34
*x++=*y++
IV.3.3.8. Mekanismit esimerkkikielissä: Pascal (2)

Aliohjelma
PROCEDURE vaihda(x,y:INTEGER);
var temp:INTEGER;
BEGIN
temp := x;
x := y;
y := temp;
END;
ei vaihda parametriensa arvoja
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
35
*x++=*y++
IV.3.3.8. Mekanismit esimerkkikielissä: Pascal (3)

Aliohjelma
PROCEDURE vaihdaoikein(VAR x,y:INTEGER);
var temp:INTEGER;
BEGIN
temp := x;
x := y;
y := temp;
END;
vaihtaa parametrit
 Samassa aliohjelmassa voi olla sekä arvo- että
muuttujaparametreja
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
36
*x++=*y++
IV.3.4. Taulukon välittäminen parametrina

Erityisesti useampiulotteisten välittäminen parametrina
vaatii monissa kielissä erityisiä toimenpiteitä
 Usein välitettävä aliohjelmalle taulukko, jonka kokoa
ja dimensioita ei tunneta
 Alkuperäinen Pascal: taulukon indeksirajat osa
taulukon tyyppiä -> mahdotonta välittää parametrina
erikokoisia taulukoita

Pascalissa nykyään yleisesti käytössä avoimet taulukot
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
37
*x++=*y++
IV.3.4.1. Taulukko parametrina: C ja C++


Yksiulotteinen taulukko voidaan antaa parametrina ilman
taulukon rajoja
Moniulotteisissa taulukoissa tunnettava dimensiot ylintä
lukuun ottamatta -> Muodollisissa parametreissa
annettava taulukon muut dimensiot, esimerkiksi 2ulotteinen taulukko
void matr_funktio(float matrix [][20])
{
jne
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
38
*x++=*y++
IV.3.4.1. Taulukko parametrina: C ja C++ (2)
Funktio, joka parametrinaan ottaa mielivaltaisen
kaksiulotteisen taulukon:
void matr_funktio(float *mat_ptr, int cols,
int rows){jne


Parametreina taulukko, taulukon rivien ja sarakkeiden
lukumäärä. Ohjelmoijan vastuulla kirjoittaa indeksointi
ottamalla huomioon, että taulukon alkio
mat_ptr[x,y]
on sama kuin
*(mat_ptr + x*rows +y)
koska C:ssä tallennetaan rivi kerrallaan
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
39
*x++=*y++
IV.3.4.2. Taulukko parametrina: Java



Taulukot ovat olioita, dimensiot tunnetaan aina
Taulukot aina yksiulotteisia, mutta niiden alkiot voivat
olla taulukoita -> saadaan rakennettua useampiulotteisia
taulukoita
Voidaan välittää mielivaltaisia taulukoita parametreina
 Taulukon koko selville kysymällä length –attribuutin
arvoa kullekin dimensiolle
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
40
*x++=*y++
IV.3.5. Aliohjelman välittäminen parametrina

Takaisinkutsu (callback)
 Välitetään aliohjelma parametrina toiselle
aliohjelmalle, joka kutsuu sitä
 Funktionaalisessa ohjelmoinnissa olennainen
 Monissa imperatiivisissa kielissä mahdollista
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
41
*x++=*y++
IV.3.5. Aliohjelman välittäminen parametrina (2)

Ongelmia
 Tarkistetaanko parametrina saadun aliohjelman
kutsuissa esiintyvien parametrien tyypit
 Parametrina välitetyn aliohjelman viiteympäristön
määräytyminen

Viiteympäristö = aliohjelmassa näkyvien tunnisteiden joukko
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
42
*x++=*y++
IV.3.5. Aliohjelman välittäminen parametrina (3)



Olio-ohjelmoinnissa ei aliohjelmatyyppisiä parametreja
välttämättä tarvita
 Voidaan toteuttaa välittämällä olio, jonka metodia
kutsutaan
 Esimerkiksi Javassa ei ole mahdollista välittää metodia
aliohjelmaparametrina
Adassa kielletty, Pascalissa harvoissa versioissa käytössä
FORTRAN 77:ssä voidaan aliohjelman nimi välittää
parametrina aliohjelmalle
 Tyypin tarkistuksia ei tehdä
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
43
*x++=*y++
IV.3.5.1 Aliohjelma parametrina: C ja C++




Voidaan käyttää funktion nimeä parametrina
Välitetään osoitin funktioon (funktion nimi toimii funktion
osoittimena)
Funktion parametrit kuuluvat funktion tyyppiin ->
parametrien tyyppiyhteensopivuus voidaan varmistaa
käännösaikana
 C-kääntäjät vapaamielisiä, C++ -kääntäjät tarkempia
C++:ssa voidaan käyttää funktio-olioita = olioita jotka
käyttäytyvät kuin funktiot
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
44
*x++=*y++
IV.3.5.1 Aliohjelma parametrina: C ja C++ (2)

Esimerkki:
void para_ali(int x){
printf("x=%d \n",x);
}
void cbfun(void ali(int)){
ali(-200);
}
Pääohjelmassa kutsutaan:
...
cbfun(para_ali);
...
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
45
*x++=*y++
IV.3.5.2. Parametrina välitettävän aliohjelman
viiteympäristön määräytyminen
1. Pinnallinen sidonta (matala sidonta, shallow binding),
2. Syvä sidonta (deep binding),
3. Tilanteen mukainen sidonta (ad hoc binding)
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
46
*x++=*y++
IV.3.5.2. Parametrina välitettävän aliohjelman
viiteympäristön määräytyminen (2)
1. Pinnallinen sidonta
• Viiteympäristö on kutsuvan aliohjelman ympäristö
• Joissakin dynaamiseen sidontaan perustuvissa
kielissä
2. Syvä sidonta
• Funktion viiteympäristö on sama kuin välitettävän
aliohjelman viiteympäristö muutenkin
• Staattista sidontaa käyttävät kielet suosivat yleensä
syvää sidontaa -> syvä sidonta ylivoimaisesti yleisin
malli
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
47
*x++=*y++
IV.3.5.2. Parametrina välitettävän aliohjelman
viiteympäristön määräytyminen (3)
3. Tilanteen mukainen sidonta
 Viiteympäristön määrää aliohjelmaparametrin saavaa
aliohjelmaa kutsuva aliohjelma
 Periaatteessa mahdollinen
 Ei tiettävästi käytössä missään kielessä
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
48
*x++=*y++
IV.3.6. Ylikuormittaminen ja geneerinen
ohjelmointi

Aliohjelman ylikuormittaminen (overloading) =
samannimisellä aliohjelmalla on useita määrittelyjä, jotka
eroavat toisistaan parametrilistoiltaan
 Ohjelmassa päätellään aliohjelman kutsun muodosta,
mitä versiota aliohjelmasta käytetään
 Yleisesti paluuarvon tyypillä ei voida erottaa
aliohjelmia toisistaan
 Ei mahdollista FORTRANissa, uudemmat kielet
yleensä sallivat aliohjelmien ylikuormittamisen
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
49
*x++=*y++
IV.3.6.1. Geneerinen ohjelmointi




Parametrisoitujen tyyppien käyttö konkreettisten
tyyppien asemasta
Tietorakenteita toteutettaessa hyödyllinen
Geneeriset aliohjelmat sallivat tyyppiriippumattomien
aliohjelmien toteuttamisen
Geneerisiä aliohjelmia kutsutaan joskus myös
polymorfisiksi aliohjelmiksi
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
50
*x++=*y++
IV.3.6.1. Geneerinen ohjelmointi (2)


Dynaamista tyypinsidontaa käyttävissä kielissä
yleisimmillään
 Parametrien tyyppiä ei tarvitse etukäteen määritellä
Tavallisin muoto parametrisoitu polymorfismi
 Käytetään parametrisoituja tyyppejä
 Tyypit sidotaan käännösaikaisesti johonkin
konkreettiseen tyyppiin
 Lisää koodin uudelleenkäytettävyyttä
 Esim. Ada ja C++ (molemmissa käännösaikainen
parametrisoitu polymorfismi)
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
51
*x++=*y++
IV.3.6.1.1. Geneerinen ohjelmointi C++:ssa

C++ rakennettu vahvasti tukemaan geneeristä
ohjelmointia
 STL (= Standard Template Library) sisältyy kaikkiin
C++ -toteutuksiin
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
52
*x++=*y++
IV.3.6.1.1. Geneerinen ohjelmointi C++:ssa (2)
Esimerkki. Taulukon lajittelu:
template <class T>
void lajittele(T taulu[], int pituus) {
int i, j; T temp;
for (i=0; i < pituus-1; i++)
for (j=i+1; j < pituus; j++)
if (taulu[i] > taulu[j]) {
temp = taulu[i];
taulu[i] = taulu[j];
taulu[j] = temp;
}
}

Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
53
*x++=*y++
IV.3.6.1.1. Geneerinen ohjelmointi C++:ssa (3)

Edelläolevaa funktiota voitaisiin käyttää esimerkiksi
seuraavasti:
double dblList[] =
{-1.2, 3.4, -5.4, 9.9, 2.5};
int intList[] =
{-1, 2, 3, -5, 10, 25, 11};
lajittele<double>(dblList,5);
lajittele<int>(intList,7);
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
54
*x++=*y++
IV.3.7. Aliohjelmien toteuttamisesta

Ohjelmarakenne vaikuttaa aliohjelmien toteutukseen
aliohjelman tapaan kommunikoida muun ohjelman
kanssa
1. Välittämällä aliohjelmalle parametreja
2. Ei-paikallisen informaation välityksellä
 Ohjelmarakenne määrää informaation näkyvyyden
aliohjelmassa
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
55
*x++=*y++
IV.3.7.1. Ohjelmarakenteen tyypit
1.
2.
3.
4.
Avoimet kielet (ei rakennetta),
Riippumattomat kielet (ei sisäkkäisiä ohjelman osia),
Alisteiset kielet (sisäkkäiset osat mahdollisia),
Rajoitetusti alisteiset kielet
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
56
*x++=*y++
IV.3.7.1. Ohjelmarakenteen tyypit




BASIC, COBOL avoimia
FORTRAN riippumaton
 Pääohjelma, riippumattomia ei-sisäkkäisiä aliohjelmia,
globaalit muuttujat COMMON-lauseella
Pascal ja Ada alisteisia
 Ohjelma yhtenäinen kokonaisuus, jonka osia sen
aliohjelmat ovat. Lisäksi aliohjelmat voivat sisältää
aliohjelmia
C/C++ rajoitetusti alisteisia
 Ei sisäkkäisiä aliohjelmia
 Aliohjelmien yläpuolella globaali alue
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
57
*x++=*y++
IV.3.7.2. Ohjelman osittainen kääntäminen
Välttämätöntä suurten ohjelmistojen rakentamisessa
 Voidaan tehdä kahdella tavalla:
1. Erillinen kääntäminen (separate compilation)
2. Riippumaton kääntäminen (independent compilation)
 Erikseen käännettävät ohjelman osat ovat
käännösyksiköitä (compilation units)

Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
58
*x++=*y++
IV.3.7.2. Ohjelman osittainen kääntäminen (2)


Riippumaton kääntäminen - käännösyksikköjen välisiä
riippuvuuksia ei tarkisteta -> käännösyksiköt voidaan
kääntää täysin toisistaan piittaamatta
 Esimerkiksi C ja FORTRAN 77
 Mahdotonta alisteisissa kielissä
Erillinen kääntäminen - käännösyksiköt voidaan kääntää
erikseen, mutta käännöstulos riippuu kuitenkin muista
käännösyksiköistä
 Yleensä alisteisissa kielissä
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
59
*x++=*y++
IV.3.7.3. Aliohjelman linkitys (subprogram linkage)



Kutsun ja paluun muodostama operaatio
Toteutettava tiedonsiirto aliohjelman ja kutsuvan
ohjelman välillä kaikilla sallituilla tavoilla
Kontrolli voitava palauttaa aliohjelmasta poistuttaessa ->
kutsuvan ohjelman ajonaikainen tila on tallennettava
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
60
*x++=*y++
IV.3.7.3. Aliohjelman linkitys (2)

Aliohjelmissa tarvitaan paikallisia muuttujia -> varattava
muistitilaa
 Päämenetelmät staattinen ja dynaaminen allokointi
 Staattisessa menetelmässä varataan käännösaikana.
Suorituksen kannalta tehokas, mutta resursseja
kuluttava
 FORTRANissa käytettiin staattista menetelmää (ei
dynaamisia tietoalkioita eikä rekursiivisia aliohjelmia)
 Yleensä nykyään dynaaminen allokointi, vaadittava
tila varataan dynaamisesti aliohjelmapinosta
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
61
*x++=*y++
IV.3.7.4. Aktivaatiotietue



Alue, johon tietoalkiot luodaan
Aliohjelmaa kutsuttaessa aktivaatiotietue laitetaan
pinoon, poistetaan jälleen aliohjelmasta palattaessa.
FORTRANissa staattinen aktivaatiotietue, pinomuistia ei
käytetä
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
62
*x++=*y++
IV.3.7.4.1 Aktivaatiotietueen osat
1. Aliohjelman paikalliset muuttujat
2. Tila funktion paluuarvolle
3. Paluuosoite kutsuvaan ohjelmaan kontrollin siirtämiseksi
4. Kutsuvan ohjelman aktivaatiotietueen sijainti, ts. pinon
vanha huippuosoite eli dynaaminen linkki
 Näillä tiedoilla pino voidaan palauttaa
aliohjelmakutsua edeltävään tilaan ja jatkaa ohjelman
suoritusta aliohjelman päättyessä
 Joissakin kielissä tarvitaan vielä staattinen linkki eli
näkyvyyslinkki
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
63
*x++=*y++
IV.3.7.4.2 Aktivaatiotietueen tyypillinen rakenne
Funktion paluuarvo
Paikalliset muuttujat
Parametrit
Dynaaminen linkki
Staattinen linkki
Paluuosoite
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
64
*x++=*y++
IV.3.7.4.2 Aktivaatiotietueen tyypillinen rakenne


Jos kielessä ei sisäkkäisiä aliohjelmia, aliohjelmien
aktivaatiotietueiden ei tarvitse tietää mitään muiden
aliohjelmien tietueista
 Esim. C-kielessä ei-paikalliset viittaukset kohdistuvat
aina globaaliin alueeseen
Alisteisilla kielillä aktivaatiotietueessa informaatiota,
jonka avulla aliohjelmassa voidaan käyttää muiden
aliohjelmien aktivaatiotietueita
 Tarvitaan ei-paikallisten viittausten arvojen
hakemiseksi
 Ei-paikallinen muuttuja voi olla esitelty
pääohjelmassa tai ylemmässä aliohjelmassa
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
65
*x++=*y++
IV.3.7.4.3 Esimerkki C-ohjelman kutsupinosta, kun
pääohjelma kutsuu funktiota F ja F funktiota G
Pinon huippu
G:n aktivaatiotietue
G:n paluuarvo, muuttujat ja parametrit
Dynaaminen linkki
Paluuosoite = F:n osoite
F:n paluuarvo, muuttujat ja parametrit
F:n aktivaatiotietue
Dynaaminen linkki
Paluuosoite = pääohjelman osoite
Pääohjelman aktivaatiotietue
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
66
*x++=*y++
IV.3.7.5. Näkyvyyslinkki





Käytetään myös nimitystä staattinen linkki (static link,
access link)
Tallennetaan aliohjelman aktivaatiotietueeseen
Osoittaa pinossa viimeiseen aliohjelman sisältävän
aliohjelman aktivaatiotietueeseen
Käytetään hakemaan tunniste ylemmästä aliohjelmasta
linkkiä seuraamalla
Menetelmä ei kovin tehokas, mikäli ohjelman rakenne on
monimutkainen
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
67
*x++=*y++
IV.3.7.6. Näkyvyystaulu (display table)





Tehokkaampi kuin näkyvyyslinkki
Ainoa yleisesti käytetty vaihtoehtoinen menetelmä
näkyvyyslinkille
Näkyvyyslinkit kootaan yhteen tauluun, ei säilytetä
aktivaatiotietueissa
Jokaisen aliohjelmakutsun ja aliohjelmasta paluun
yhteydessä näkyvyystilanne muuttuu -> ylläpito
työläämpää kuin näkyvyyslinkkien
Ks. tarkemmin Sebestan luku 10
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Aliohjelmat
68