815338A Ohjelmointikielten periaatteet 2015-2016 IV.3 Imperatiivinen ohjelmointi aliohjelmat
Sisältö 1. Yleistä aliohjelmista 2. Proseduurit ja funktiot 3. Parametrien välittäminen 4. Taulukon välittäminen parametrina 5. Aliohjelman välittäminen parametrina 6. Ylikuormittaminen ja geneerinen ohjelmointi 7. Aliohjelmien toteuttamisesta 815338A Ohjelmointikielten periaatteet, Aliohjelmat 2
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) 815338A Ohjelmointikielten periaatteet, Aliohjelmat 3
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.Vain yhtä aliohjelmaa suoritetaan kerrallaan 3.Ohjelmakontrolli palaa kutsuvalle ohjelmalle, kun aliohjelman suoritus loppuu Aliohjelman määrittelyn osat: otsikko (header) ja runko (body) 815338A Ohjelmointikielten periaatteet, Aliohjelmat 4
IV.3.1.1. Aliohjelman otsikko Nimi, muodolliset parametrit ja niiden tyypit Aliohjelman rajapinta Paluuarvon tyyppi (mikäli on) Joissakin kielissä aliohjelman suorituksen aiheuttamien poikkeuksien tyypit (esim. Java) Joissakin kielissä aliohjelmat voidaan esitellä erillään määrittelystä = aliohjelman prototyyppi Prototyypit yleisiä C-kielessä, Adassa ja Pascalissa Javassa ei voi esitellä aliohjelmia 815338A Ohjelmointikielten periaatteet, Aliohjelmat 5
IV.3.1.2. Aliohjelman runko Aliohjelman toimintalogiikka = lauseet, jotka suoritetaan aliohjelmaa kutsuttaessa Esitellään aliohjelman paikalliset muuttujat Määritellään aliohjelmalle alisteiset aliohjelmat Pascalissa sisäkkäiset aliohjelmat yleisiä Ei sallittua kaikissa kielissä, esim. C 815338A Ohjelmointikielten periaatteet, Aliohjelmat 6
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, jotka sidotaan muistiin kutsuttaessa Todelliset parametrit Aliohjelman kutsussa oleva lista parametreista, jotka sidotaan aliohjelman muodollisiin parametreihin 815338A Ohjelmointikielten periaatteet, Aliohjelmat 7
IV.3.1.3. Aliohjelman kutsu (2) Aliohjelman runko double ali (int x, char c) { x += 2; c = z ; return 3.14; *x++=*y++ } int main(int argc, char * argv[]) { } int luku = 5; char merkki = m ; double d = ali(luku,m); Muodolliset parametrit Todelliset parametrit Aliohjelman otsikko 815338A Ohjelmointikielten periaatteet, Aliohjelmat 8
IV.3.1.3. Aliohjelman kutsu (2) Lähes kaikissa ohjelmointikielissä sidonnan määrää parametrin sijainti listassa Python, Ada ja FORTRAN 90: voi käyttää myös avainsanaparametreja Joissakin kielissä (C++, Python) oletusarvot mahdollisia: int funk(int eka,float toka,double kol=1.0) voidaan kutsua kahdella parametrilla -> kolmas saa arvon 1.0 815338A Ohjelmointikielten periaatteet, Aliohjelmat 9
IV.3.1.4. Aliohjelman parametrien välitysmekanismi *x++=*y++ Tapa, jolla muodollinen parametri sidotaan todelliseen parametriin Tärkeimpiä valittavia ominaisuuksia aliohjelman suunnittelussa Toteutukseen useita malleja 815338A Ohjelmointikielten periaatteet, Aliohjelmat 10
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ä 815338A Ohjelmointikielten periaatteet, Aliohjelmat 11
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) 815338A Ohjelmointikielten periaatteet, Aliohjelmat 12
IV.3.2.1. Proseduurit *x++=*y++ 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) 815338A Ohjelmointikielten periaatteet, Aliohjelmat 13
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 815338A Ohjelmointikielten periaatteet, Aliohjelmat 14
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) 815338A Ohjelmointikielten periaatteet, Aliohjelmat 15
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 END; writeln ('turhaa'); 815338A Ohjelmointikielten periaatteet, Aliohjelmat 16
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 815338A Ohjelmointikielten periaatteet, Aliohjelmat 17
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 815338A Ohjelmointikielten periaatteet, Aliohjelmat 18
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 815338A Ohjelmointikielten periaatteet, Aliohjelmat 19
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 815338A Ohjelmointikielten periaatteet, Aliohjelmat 20
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 Pääasiallinen haitta: suurikokoisten parametrien välittäminen -> kopiointi kuluttaa resursseja Siis in-moodi 815338A Ohjelmointikielten periaatteet, Aliohjelmat 21
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 815338A Ohjelmointikielten periaatteet, Aliohjelmat 22
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? 815338A Ohjelmointikielten periaatteet, Aliohjelmat 23
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 815338A Ohjelmointikielten periaatteet, Aliohjelmat 24
IV.3.3.6. Viitevälitys *x++=*y++ 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) Siis inout-moodi 815338A Ohjelmointikielten periaatteet, Aliohjelmat 25
IV.3.3.6. Viitevälitys (2) Turvallisuus kärsii viitevälityksessä: Virhetilanteessa ei voi palauttaa alkuperäistä muuttujaa kutsua edeltäneeseen tilaan aliohjelman muokatessa sitä 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 815338A Ohjelmointikielten periaatteet, Aliohjelmat 26
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ä 815338A Ohjelmointikielten periaatteet, Aliohjelmat 27
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 815338A Ohjelmointikielten periaatteet, Aliohjelmat 28
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 815338A Ohjelmointikielten periaatteet, Aliohjelmat 29
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); 815338A Ohjelmointikielten periaatteet, Aliohjelmat 30
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); 815338A Ohjelmointikielten periaatteet, Aliohjelmat 31
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; 815338A Ohjelmointikielten periaatteet, Aliohjelmat 32
IV.3.3.8. Mekanismit esimerkkikielissä: Pascal Parametrin välityssemantiikka voidaan valita Ellei anneta välitystyyppiä, käytetään arvovälitystä *x++=*y++ Jos halutaan inout semantiikka, määritellään parametrit muuttujaparametreiksi määreellä VAR -> viittausvälitys (aliohjelma käsittelee muistipaikkaa) 815338A Ohjelmointikielten periaatteet, Aliohjelmat 33
IV.3.3.8. Mekanismit esimerkkikielissä: Pascal (2) Aliohjelma PROCEDURE vaihda(x,y:integer); BEGIN END; var temp:integer; temp := x; x := y; y := temp; ei vaihda parametriensa arvoja 815338A Ohjelmointikielten periaatteet, Aliohjelmat 34
IV.3.3.8. Mekanismit esimerkkikielissä: Pascal (3) Aliohjelma PROCEDURE vaihdaoikein(var x,y:integer); var temp:integer; BEGIN END; temp := x; x := y; y := temp; vaihtaa parametrit Samassa aliohjelmassa voi olla sekä arvo- että muuttujaparametreja 815338A Ohjelmointikielten periaatteet, Aliohjelmat 35
IV.3.4. Taulukon välittäminen parametrina *x++=*y++ Erityisesti useampiulotteisten välittäminen parametrina vaatii monissa kielissä erityisiä toimenpiteitä Usein välitettävä 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 815338A Ohjelmointikielten periaatteet, Aliohjelmat 36
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 2- ulotteinen taulukko void matr_funktio(float matrix [][20]) { jne 815338A Ohjelmointikielten periaatteet, Aliohjelmat 37
IV.3.4.1. Taulukko parametrina: C ja C++ (2) *x++=*y++ Funktio, joka parametrinaan ottaa mielivaltaisen kokoisen 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 815338A Ohjelmointikielten periaatteet, Aliohjelmat 38
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 815338A Ohjelmointikielten periaatteet, Aliohjelmat 39
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 *x++=*y++ 815338A Ohjelmointikielten periaatteet, Aliohjelmat 40
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 815338A Ohjelmointikielten periaatteet, Aliohjelmat 41
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 voi 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ä 815338A Ohjelmointikielten periaatteet, Aliohjelmat 42
IV.3.5.1 Aliohjelma parametrina: C ja C++ *x++=*y++ Voidaan käyttää funktion nimeä parametrina Välitetään osoitin funktioon (funktion nimi) 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 815338A Ohjelmointikielten periaatteet, Aliohjelmat 43
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);... *x++=*y++ 815338A Ohjelmointikielten periaatteet, Aliohjelmat 44
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) 815338A Ohjelmointikielten periaatteet, Aliohjelmat 45
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 815338A Ohjelmointikielten periaatteet, Aliohjelmat 46
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ä 815338A Ohjelmointikielten periaatteet, Aliohjelmat 47
IV.3.6. Ylikuormittaminen ja geneerinen ohjelmointi *x++=*y++ 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 C ei salli, mutta uusissa versioissa voidaan simuloida 815338A Ohjelmointikielten periaatteet, Aliohjelmat 48
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 815338A Ohjelmointikielten periaatteet, Aliohjelmat 49
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) 815338A Ohjelmointikielten periaatteet, Aliohjelmat 50
IV.3.6.1.1. Geneerinen ohjelmointi C++:ssa *x++=*y++ C++ rakennettu vahvasti tukemaan geneeristä ohjelmointia STL (= Standard Template Library) sisältyy kaikkiin C++ -toteutuksiin 815338A Ohjelmointikielten periaatteet, Aliohjelmat 51
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; } } 815338A Ohjelmointikielten periaatteet, Aliohjelmat 52
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); 815338A Ohjelmointikielten periaatteet, Aliohjelmat 53
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 815338A Ohjelmointikielten periaatteet, Aliohjelmat 54
IV.3.7.1. Ohjelmarakenteen tyypit 1. Avoimet kielet (ei rakennetta), 2. Riippumattomat kielet (ei sisäkkäisiä ohjelman osia), 3. Alisteiset kielet (sisäkkäiset osat mahdollisia), 4. Rajoitetusti alisteiset kielet 815338A Ohjelmointikielten periaatteet, Aliohjelmat 55
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 815338A Ohjelmointikielten periaatteet, Aliohjelmat 56
IV.3.7.2. Ohjelman osittainen kääntäminen *x++=*y++ 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) 815338A Ohjelmointikielten periaatteet, Aliohjelmat 57
IV.3.7.2. Ohjelman osittainen kääntäminen (2) *x++=*y++ 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ä 815338A Ohjelmointikielten periaatteet, Aliohjelmat 58
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 815338A Ohjelmointikielten periaatteet, Aliohjelmat 59
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 815338A Ohjelmointikielten periaatteet, Aliohjelmat 60
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ä 815338A Ohjelmointikielten periaatteet, Aliohjelmat 61
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 815338A Ohjelmointikielten periaatteet, Aliohjelmat 62
IV.3.7.4.2 Aktivaatiotietueen tyypillinen rakenne Funktion paluuarvo Paikalliset muuttujat Parametrit Dynaaminen linkki Staattinen linkki Paluuosoite 815338A Ohjelmointikielten periaatteet, Aliohjelmat 63
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 815338A Ohjelmointikielten periaatteet, Aliohjelmat 64
IV.3.7.4.3 Esimerkki C-ohjelman kutsupinosta, kun pääohjelma kutsuu funktiota F ja F funktiota G Pinon huippu G:n paluuarvo, muuttujat ja parametrit G:n aktivaatiotietue Dynaaminen linkki Paluuosoite = F:n osoite F:n paluuarvo, muuttujat ja parametrit F:n aktivaatiotietue Dynaaminen linkki Paluuosoite = pääohjelman osoite Pääohjelman aktivaatiotietue 815338A Ohjelmointikielten periaatteet, Aliohjelmat 65
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 815338A Ohjelmointikielten periaatteet, Aliohjelmat 66
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 815338A Ohjelmointikielten periaatteet, Aliohjelmat 67