815338A Ohjelmointikielten periaatteet

Samankaltaiset tiedostot
Aliohjelmat imperatiivisissa ohjelmointikielissä

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

2) Aliohjelma, jonka toiminta perustuu sivuvaikutuksiin: aliohjelma muuttaa parametrejaan tai globaaleja muuttujia, tulostaa jotakin jne.

Osoitin ja viittaus C++:ssa

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

4.2. ALIOHJELMAT 71. Tulosvälitteisyys (call by result) Tulosvälitteinen parametri kopioidaan lopuksi

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Jakso 4 Aliohjelmien toteutus

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Jakso 4 Aliohjelmien toteutus

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Luento 4 Aliohjelmien toteutus

1. Omat operaatiot 1.1

Jakso 4 Aliohjelmien toteutus

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

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

Tieto- ja tallennusrakenteet

11/20: Konepelti auki

Luento 4 (verkkoluento 4) Aliohjelmien toteutus

Sisältö. 2. Taulukot. Yleistä. Yleistä

Luento 4 Aliohjelmien toteutus

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

ITKP102 Ohjelmointi 1 (6 op)

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Luento 4 (verkkoluento 4) Aliohjelmien toteutus

Luento 4 Aliohjelmien toteutus

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

Ohjelmoinnin perusteet Y Python

Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat:

C++11 lambdat: [](){} Matti Rintala

ITKP102 Ohjelmointi 1 (6 op)

Sisältö. 22. Taulukot. Yleistä. Yleistä

Lyhyt kertaus osoittimista

Tutoriaaliläsnäoloista

Rakenteiset tietotyypit Moniulotteiset taulukot

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

Olio-ohjelmointi Javalla

ITKP102 Ohjelmointi 1 (6 op)

Algoritmit 1. Luento 3 Ti Timo Männikkö

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

15. Ohjelmoinnin tekniikkaa 15.1

1. Olio-ohjelmointi 1.1

TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 27. lokakuuta 2009

815338A Ohjelmointikielten periaatteet

19. Olio-ohjelmointia Javalla 19.1

Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU

815338A Ohjelmointikielten periaatteet

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Rajapinta (interface)

TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 13. lokakuuta 2009

15. Ohjelmoinnin tekniikkaa 15.1

Monipuolinen esimerkki

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Taulukot. Jukka Harju, Jukka Juslin

12 Mallit (Templates)

Kehittää ohjelmointitehtävien ratkaisemisessa tarvittavia metakognitioita!

Osoittimet ja taulukot

7. Oliot ja viitteet 7.1

Ohjelmoinnin peruskurssien laaja oppimäärä

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

Aliohjelmat. 1 Kutsusekvenssit. Antti-Juhani Kaijanaho 5. helmikuuta 2007

Imperatiivisen ohjelmoinnin peruskäsitteet. Meidän käyttämän pseudokielen lauseiden syntaksi

Java-kielen perusteet

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Sisällys. 19. Olio-ohjelmointia Javalla. Yleistä. Olioiden esittely ja alustus

Tietotekniikan valintakoe

Java kahdessa tunnissa. Jyry Suvilehto

Käännös, linkitys ja lataus

Osoittimet ja taulukot

A TIETORAKENTEET JA ALGORITMIT

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

18. Abstraktit tietotyypit 18.1

Geneeriset luokat. C++ - perusteet Java-osaajille luento 6/7: Template, tyyppi-informaatio, nimiavaruudet. Geneerisen luokan käyttö.

4. Luokan testaus ja käyttö olion kautta 4.1

Java-kielen perusteet

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

815338A Ohjelmointikielten periaatteet

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

tietueet eri tyyppisiä tietoja saman muuttujan arvoiksi

Olio-ohjelmointi Syntaksikokoelma

4. Olio-ohjelmoinista lyhyesti 4.1

5.6. C-kielen perusteet, osa 6/8, Taulukko , pva, kuvat jma

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

D-OHJELMOINTIKIELI. AA-kerho, 33. Antti Uusimäki. Arto Savolainen

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

811120P Diskreetit rakenteet

Ohjelmoinnin perusteet Y Python

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

1. Miten tehdään peliin toinen maila?

Transkriptio:

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