*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
© Copyright 2025