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