815338A Ohjelmointikielten periaatteet

Samankaltaiset tiedostot
Muuttujat imperatiivisissa ohjelmointikielissä

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

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

Tietueet. Tietueiden määrittely

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Java-kielen perusteet

11/20: Konepelti auki

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

Java-kielen perusteet

Tietorakenteet ja algoritmit

Tieto- ja tallennusrakenteet

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

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

815338A Ohjelmointikielten periaatteet

15. Ohjelmoinnin tekniikkaa 15.1

15. Ohjelmoinnin tekniikkaa 15.1

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

Dynaaminen muisti. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät 2017.

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

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

Sisällys. 6. Muuttujat ja Java. Muuttujien nimeäminen. Muuttujien nimeäminen. salinovi tai syntymapaiva

6. Muuttujat ja Java 6.1

7. Oliot ja viitteet 7.1

Osoitin ja viittaus C++:ssa

1. Esittelyt ja vakiot 1.1 Esittelyt (declarations) Ennen nimen, tunnuksen (identifier) käyttöä se on

Ohjelmointi 1 Taulukot ja merkkijonot

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

Rakenteiset tietotyypit Moniulotteiset taulukot

7/20: Paketti kasassa ensimmäistä kertaa

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

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

Sisällys. 6. Muuttujat ja Java. Muuttujien nimeäminen. Muuttujien nimeäminen. Muuttujien nimeäminen. Muuttujan tyypin määritys. Javan tietotyypit:

Osoittimet ja taulukot

Java-kielen perusteet

Dynaaminen muisti Rakenteiset tietotyypit

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset

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

Taulukot. Jukka Harju, Jukka Juslin

Sisällys. 6. Muuttujat ja Java. Muuttujien nimeäminen. Muuttujien nimeäminen. salinovi tai syntymapaiva

6. Muuttujat ja Java 6.1

samalla seuraavaan puoliavaruuteen (sukupolveen), jota siivotaan harvemmin.

811120P Diskreetit rakenteet

Tyypit (eri näkökulmia)

ITKP102 Ohjelmointi 1 (6 op)

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

tietueet eri tyyppisiä tietoja saman muuttujan arvoiksi

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Ruby. Tampere University of Technology Department of Pervasive Computing TIE Principles of Programming Languages

Jakso 4 Aliohjelmien toteutus

12. Monimuotoisuus 12.1

ITKP102 Ohjelmointi 1 (6 op)

Lyhyt kertaus osoittimista

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

lausekkeiden tapauksessa. Jotkin ohjelmointikielet on määritelty sellaisiksi,

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

Kielioppia: toisin kuin Javassa

ITKP102 Ohjelmointi 1 (6 op)

Tietotyypit ja operaattorit

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Tietorakenteet ja algoritmit

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

815338A Ohjelmointikielten periaatteet

815338A Ohjelmointikielten periaatteet

TIES542 kevät 2009 Tyyppijärjestelmän laajennoksia

Luento 4 Aliohjelmien toteutus

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö C-ohjelmassa

ITKP102 Ohjelmointi 1 (6 op)

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Tieto ja sen osoite (3) Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI) Osoitinmuuttujat. Tieto ja sen osoite (5)

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla

Ohjelmoinnin perusteet Y Python

13. Loogiset operaatiot 13.1

1. luento. Ohjelmointi (C) T0004 Syksy luento. 1. luento. 1. luento. 1. luento. kurssin sisältö ja tavoitteet työmuodot.

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

Olio-ohjelmointi Javalla

18. Abstraktit tietotyypit 18.1

Olio-ohjelmointi Syntaksikokoelma

C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. Operaatioiden suoritusjärjestys

Algoritmit 1. Luento 3 Ti Timo Männikkö

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

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

ELM GROUP 04. Teemu Laakso Henrik Talarmo

Jakso 4 Aliohjelmien toteutus

Luento 4 (verkkoluento 4) Aliohjelmien toteutus

sama tyyppi (joka vastaa kaikkien mahdollisten arvojen summa-aluetta). Esimerkiksi

815338A Ohjelmointikielten periaatteet

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Sisällys. 15. Lohkot. Lohkot. Lohkot

12. Monimuotoisuus 12.1

Luento 4 (verkkoluento 4) Aliohjelmien toteutus

20. Javan omat luokat 20.1

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

C++ Kuva 1-1. C- ja C++ kielien perustana olevat kielet.

17. Javan omat luokat 17.1

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 15.3

Transkriptio:

815338A Ohjelmointikielten periaatteet 2015-2016 IV.1 Imperatiivinen ohjelmointi muuttujat ja tietotyypit

Sisältö 1. Yleistä muuttujista 2. Sidonta 3. Tyypin tarkistus 4. Näkyvyysalue 5. Yleistä tietotyypeistä 6. Primitiiviset tietotyypit 7. Rakenteelliset tietotyypit 8. Osoitintyyppi 815338A Ohjelmointikielten periaatteet, Muuttujat 2

IV.1.1 Yleistä muuttujista Imperatiivisen ohjelmoinnin keskeisimpiä käsitteitä Muuttuja mallintaa tietokoneen muistipaikkaa Muuttujaan liittyy 1. Nimi (name) Tapa yksilöidä muuttuja 2. Osoite (address) Muistiosoite, jossa muuttujan arvo sijaitsee 3. Arvo (value) Data joka kulloinkin on muuttujan osoitteen osoittamassa muistipaikassa 815338A Ohjelmointikielten periaatteet, Muuttujat 3

IV.1.1 Yleistä muuttujista (2) Muuttujan ominaisuuksia 1. Tyyppi (type) Muuttujan tietorakenteen nimi 2. Näkyvyysalue (scope) Se ohjelman osa, jossa muuttuja on käytettävissä 3. Elinaika (lifetime, extent) Muuttujan muistinvaraamisen ja muistinvapauttamisen välinen aika 815338A Ohjelmointikielten periaatteet, Muuttujat 4

IV.1.1.1 Muuttujan nimi Merkkijono, jota käytetään tunnistamaan muuttuja FORTRAN77: max. kuuden merkin mittaiset nimet FORTRAN 90 käyttää 31 merkin rajoitusta C-kieli: Nimen erottelupituutena vähintään 31 ensimmäistä merkkiä Nykyään useimmissa kielissä (C++, Java) mielivaltaisen pitkät nimet Useimmiten nimen alettava kirjaimella (tai alaviivalla) Isojen/pienien kirjainten erottelu Pascal, FORTRAN ei eroa Useimmiten erotetaan (C, Java jne) 815338A Ohjelmointikielten periaatteet, Muuttujat 5

IV.1.1.1.1 Erikoissanat Erottavat kielen kontrollirakenteita kuvaavat sanat muuttujista Varatut sanat (reserved words) Ei voi käyttää muuten kuin sille varattuun tarkoitukseen Avainsanat (keywords) Avainsana on erikoismerkityksessä ainoastaan tietyissä yhteyksissä Nykykielissä yleensä ainoastaan varattuja sanoja FORTRAN käyttää avainsanoja 815338A Ohjelmointikielten periaatteet, Muuttujat 6

IV.1.1.2. Muuttujan osoite Muuttujaan liittyvän fyysisen muistiosoitteen arvo Yleensä ilmaistaan heksalukuna Ei yleensä staattinen, muuttujan osoite saattaa vaihdella ohjelman suorituksen aikana Usein käytetään nimitystä l-value (left value) Osoite tiedettävä, kun muuttuja sijaitsee sijoituslauseen vasemmalla puolella Moninimisyys, aliasing Kaksi erinimistä muuttujaa viittaa samaan muistipaikkaan Yleensä muodostaminen ei suotavaa 815338A Ohjelmointikielten periaatteet, Muuttujat 7

IV.1.1.3. Muuttujan tyyppi Määrittelee 1. Muuttujan arvoalueen 2. Minkälaisia operaatioita tyypin muuttujalle voidaan tehdä Esimerkki: Java-kielessä Suurin kokonaisluku: Integer.MAX_VALUE 2147483647 pienin: Integer.MIN_VALUE -2147483648 Muuttujiin voidaan soveltaa perusaritmetiikan operaatioita. 815338A Ohjelmointikielten periaatteet, Muuttujat 8

IV.1.1.4. Muuttujan arvo Muuttujan muistiosoitteen kulloinenkin sisältö Tässä muistiosoite = sellainen muistialue, johon koko muuttujan data mahtuu Esimerkki: Javan double-tyyppinen muuttuja kahdeksan tavun kokoinen -> muuttujan osoite kahdeksan tavun kokoinen muistialue, jossa säilytetään muuttujan arvoa. Usein nimitetään r-valueksi (right value) Tarvitaan sijoituslauseen oikealla puolella. Huom! Jotta päästäisiin käsiksi r-valueen, on l-value aina määritettävä ensin 815338A Ohjelmointikielten periaatteet, Muuttujat 9

IV.1.2. Sidonta Yksi keskeisimmistä muuttujiin liittyvistä käsitteistä Jonkin ominaisuuden liittämistä ohjelman itsenäiseen kokonaisuuteen Muuttujan tapauksessa tyypinsidonta tai muistinsidonta Tyypinsidonta liittää muuttujaan jonkin tietotyypin Muistinsidonta liittää muuttujaan muistiosoitteen (varaa riittävästi muistia, jotta muuttujan arvo voidaan tallentaa) 815338A Ohjelmointikielten periaatteet, Muuttujat 10

IV.1.2. Sidonta (2) Sidonta-aika (binding time) = milloin tietty sidonta tehdään Varhainen sidonta lisää tehokkuutta Myöhäinen sidonta lisää joustavuutta Staattinen sidonta (static binding) ennen ohjelman ajoa ei muutu ajon aikana Dynaaminen sidonta (dynamic binding) = ajonaikainen sidonta 815338A Ohjelmointikielten periaatteet, Muuttujat 11

IV.1.2.1. Tyypinsidonta Muuttujaan on liitettävä tietotyyppi ennen kuin sitä voi ohjelmassa käyttää Voidaan tehdä: 1. Staattisesti i. eksplisiittisellä tai ii. implisiittisellä esittelyllä 2. Dynaamisesti 815338A Ohjelmointikielten periaatteet, Muuttujat 12

IV.1.2.1.1 Tyypin staattinen sidonta Eksplisiittinen esittely: ohjelmalauseessa määritellään muuttuja tietyn tyyppiseksi, esimerkiksi C:ssä float f1; Useimmissa staattista tyypinsidontaa käyttävissä kielissä pakollinen Implisiittinen esittely liittää muuttujaan tietotyypin jonkin sopimuksen mukaan ilman erillistä esittelyä Esim. FORTRANissa muuttuja INTEGER-tyyppinen jos nimi alkaa I, J, K, L, M tai N-kirjaimella; muuten REAL -tyyppinen Haitta: Esittelyn poisjäänti vahingossa voi johtaa hankalasti löydettäviin virhetoimintoihin 815338A Ohjelmointikielten periaatteet, Muuttujat 13

IV.1.2.1.2 Tyypin dynaaminen sidonta Tyyppi määrittyy ohjelman suorituksen aikana sijoituslausetta suoritettaessa Dynaamista tyypinsidontaa käyttävät kielet eroavat voimakkaasti staattiseen tyypinsidontaan perustuvista Joustavia ja geneerinen ohjelmointi yksinkertaista Esim. 1960-luvun APL ja SNOBOL Esimerkki. JavaScript: xz = [1.5, 2.2, 3.7] // Nyt xz taulukko xz = 234 // Nyt xz kokonaisluku Haittoja tehokkuuden menetys ja koodin luotettavuuden heikkeneminen 815338A Ohjelmointikielten periaatteet, Muuttujat 14

IV.1.2.2. Muistin sidonta Muuttujan tietotyyppi on määrätty -> voidaan varata muistista alue (osoite) muuttujan arvon tallentamiseen Muistin varaaminen = allokointi (allocation) Allokoinnin käänteisprosessi on varatun muistin vapauttaminen = deallokointi (deallocation) Ohjelman muistialue: Staattinen eli globaali alue Pinomuisti Varaamatonta muistia Kekomuisti Yleensä pinomuisti ja kekomuisti kasvavat toisiaan kohti 815338A Ohjelmointikielten periaatteet, Muuttujat 15

IV.1.2.2.1. Muuttujan elinikä Muuttujan käyttämän muistin varaamisen ja vapauttamisen välinen aika Muuttujat eliniän perusteella: 1. Staattiset, 2. Pinodynaamiset, 3. Kekodynaamiset (explicit heap dynamic) ja 4. Implisiittisesti kekodynaamiset (implicit heap dynamic) 815338A Ohjelmointikielten periaatteet, Muuttujat 16

IV.1.2.2.1.1 Staattiset muuttujat Sidotaan muistiosoitteeseen ennen ohjelman suoritusta, säilyvät sidottuna samaan osoitteeseen ohjelman päättymiseen saakka Käyttö tuo tehokkuutta Aiheuttaa joustamattomuutta Rekursiivisten aliohjelmien toteuttaminen mahdotonta FORTRANin varhaisemmissa versioissa kaikki muuttujat staattisia C:ssä static-määreellä muuttuja staattiseksi Pascal-kielessä ei staattisia muuttujia 815338A Ohjelmointikielten periaatteet, Muuttujat 17

IV.1.2.2.1.2. Pinodynaamiset muuttujat Tyyppi staattisesti sidottu, mutta muistiosoite sidotaan ajonaikaisesti esittelylausetta suoritettaessa Perua Algol 60-kielestä: paikallisten muuttujien muisti varattu pinomuistista dynaamisesti Näin toimivat yleisimmät imperatiiviset nykykielet Mahdollistavat rekursion Aliohjelman muuttujalle varataan jokaisella kutsulla kohti uusi muistiosoite Säästää muistia - yhteinen muistialue kaikkien aliohjelmien paikallisille muuttujille Dynaaminen muistinvaraus hidastaa vähän suoritusta 815338A Ohjelmointikielten periaatteet, Muuttujat 18

IV.1.2.2.1.3. (Eksplisiittisesti) Kekodynaamiset muuttujat Yleisimmin kekomuistista varattavat muuttujat Varataan kekomuistista ohjelmoijan käskystä ajonaikaisesti Voidaan viitata ainoastaan osoitinmuuttujan tai viitetyypin muuttujan avulla Voidaan varata 1. Operaattorilla (Java ja C++: new) tai 2. Kirjastofunktiolla (C: malloc()) 815338A Ohjelmointikielten periaatteet, Muuttujat 19

IV.1.2.2.1.3. (Eksplisiittisesti) Kekodynaamiset muuttujat (2) Muistin vapauttaminen Jotkin kielet: Automaattinen roskien keruu (garbage collection) (esim. Java) Joissakin kielissä ohjelmoijan vastuulla: C++: operaattori delete C: funktio free() 815338A Ohjelmointikielten periaatteet, Muuttujat 20

IV.1.2.2.1.3. (Eksplisiittisesti) Kekodynaamiset muuttujat (3) *x++=*y++ Esimerkki. Kekodynaamisen muuttujan varaaminen (ja vapauttaminen) C ja C++ -kielissä. C: C++: int *pnewint; pnewint = malloc(sizeof(int)); *pnewint = 10; free(pnewint); int *pnewint; pnewint = new int; *pnewint = 10; delete pnewint; 815338A Ohjelmointikielten periaatteet, Muuttujat 21

IV.2.2.1.4. Implisiittisesti kekodynaamiset muuttujat *x++=*y++ Sidotaan kekomuistiin vasta sijoituslauseen yhteydessä Käyttö sallii hyvin joustavan ohjelmoinnin ja erittäin geneerisen koodin kirjoittamisen Monissa skriptikielissä (Perl, JavaScript) merkkijonomuuttujat ja taulukot 815338A Ohjelmointikielten periaatteet, Muuttujat 22

IV.1.3. Tyypin tarkistus (type checking) Varmistetaan että ohjelman operaatioissa käytettävien muuttujien tyypit ovat yhteensopivat Dynaaminen tarkistus: tyypit tarkistetaan ajonaikaisesti Staattinen tarkistus: viimeistään käännösaikana 815338A Ohjelmointikielten periaatteet, Muuttujat 23

IV.1.3.1. Tyyppiyhteensopivuus (type compatibility) 1. Nimityypin yhteensopivuus (name type compatibility) Muuttujat yhteensopivaa tyyppiä ainoastaan, jos ne on määritelty samannimisen tyyppisiksi 2. Rakennetyypin yhteensopivuus (structure type compatibility) Toteutuu, jos muuttujien rakenne on identtinen Yleensä tyypintarkistukseen käytetään jotain välimuotoa Nimityypin tarkistus liian rajoittava Rakennetyypin tarkistus liian hankala toteuttaa 815338A Ohjelmointikielten periaatteet, Muuttujat 24

IV.1.3.1. Tyyppiyhteensopivuus (2) Esimerkki. Pascal-kielisessä määrittelyssä TYPE MYINT = INTEGER; var a: INTEGER; var ma:myint; muuttujat a ja ma eivät nimityyppiyhteensopivat, mutta ovat rakennetyyppiyhteensopivat Pascal-kielessä ei käytetä nimityypin yhteensopivuutta, sijoitus ma := a; on laillinen 815338A Ohjelmointikielten periaatteet, Muuttujat 25

IV.1.3.1. Tyyppiyhteensopivuus (2) Esimerkki. C: typedef struct { int x; int y; } mystruct; typedef struct { int xx; int yy; } myotherstruct; mystruct str1; myotherstruct str2; str1 = str2 ei sallittu: C-kielessä muuten rakenneyhteensopivuus paitsi tietueiden (struct) ja unionien (union) suhteen C++ ja Java käyttävät nimityyppiyhteensopivuutta C++: typedefillä samat tyypit 815338A Ohjelmointikielten periaatteet, Muuttujat 26

IV.1.3.2. Vahvasti tyypitetty (strongly typed) kieli 1. Jokaisella muuttujalla oltava hyvin määritelty tyyppi 2. Tyyppivirheet havaitaan aina Pidetään tavoittelemisen arvoisena piirteenä Estää ohjelmointivirheet, jotka johtuvat 1. Vääräntyyppisen muuttujan sijoittamisesta tai 2. Käyttämisestä parametrina aliohjelmakutsussa Varsin harvat kielet täyttävät, jos sovelletaan tiukasti Muunnossäännöt (coercion) Vaikuttavat tyypintarkistukseen Vahvasti tyypitetyssäkin kielessä esim. aritmeettisille operaatioille sääntöjä, jotka rikkovat periaatteessa tyypitystä vastaan 815338A Ohjelmointikielten periaatteet, Muuttujat 27

IV.1.3.2. Vahvasti tyypitetty (strongly typed) kieli (2) Pascal vaihtelevia tietueita lukuun ottamatta C:ssä tapauksia, joissa tyyppivirhe voi jäädä havaitsematta -> C ei niin vahvasti tyypitetty kuin Pascal C++: tyypintarkistus vahvempi kuin C:ssä, ei vahvasti tyypitetty Ada, Java ja C# (lähes) vahvasti tyypitettyjä Tyyppivirhe voi syntyä ohjelmoijan itse pakottamana Python vahvasti tyypitetty 815338A Ohjelmointikielten periaatteet, Muuttujat 28

IV.1.4. Näkyvyysalue (scope) Niiden ohjelman lauseiden kokonaisuus, joiden alueella muuttuja on näkyvä (visible), t.s. käytettävissä. Globaali (global) muuttuja: koko ohjelma Paikalliset eli lokaalit (local) muuttujat (ohjelmalohkon tai muun vastaavan yksikön) määritelty kyseisessä yksikössä Ei-paikalliset (nonlocal) muuttujat: Lohkon sisällä näkyvät lohkon ulkopuolella määritellyt muuttujat Voi määräytyä Staattisesti ennen ohjelman suoritusta tai Dynaamisesti ohjelman suorituksen aikana 815338A Ohjelmointikielten periaatteet, Muuttujat 29

IV.1.4.1. Staattinen näkyvyysalueen määräytyminen *x++=*y++ Yleisin menetelmä imperatiivisissa kielissä Muuttujien näkyvyysalueet määräytyvät ennen ohjelman suoritusta ohjelman rakenteen perusteella Rakenteet voivat olla toisilleen alisteisia -> näkyvyysalueiden sisäkkäisyys Aliohjelmalla useimmiten oma näkyvyysalue Nykykielissä voidaan muodostaa uusia näkyvyysalueita määrittelemällä ohjelmalohkoja (blocks) C: aaltosulkujen välinen osa on lohko Kootun lauseen (compound statement) sisällä ei voida esitellä uusia muuttujia (kuten lohkossa) 815338A Ohjelmointikielten periaatteet, Muuttujat 30

IV.1.4.1. Staattinen näkyvyysalueen määräytyminen *x++=*y++ Jos sisemmissä näkyvyysalueissa esitellään samannimisiä muuttujia kuin alueen sisältävässä lohkossa, on ulomman alueen muuttuja piilotettava sisemmässä lohkossa Pascalissa BEGIN END pari määrittelee kootun lauseen -> Pascalissa ei lohkoja, aliohjelmilla oma näkyvyysalue ja aliohjelmat voivat olla sisäkkäisiä 815338A Ohjelmointikielten periaatteet, Muuttujat 31

IV.4.2. Dynaaminen näkyvyysalueen määräytyminen *x++=*y++ Hyvin harvat ohjelmointikielet käyttävät Esim. APL, SNOBOL, Perlissä mahdollinen Perustuu aliohjelmien suoritusjärjestykseen -> aktiivisen aliohjelman muuttujat näkyvät kaikille aliohjelmille, joita kutsutaan kyseisen aliohjelman käynnistämisen jälkeen Ongelmia: Koodin luettavuus huononee Ohjelman luotettavuus heikkenee Etu: Aliohjelmien tiedonvälityksen helpottuminen Haitat suuremmat -> ei juuri käytetä 815338A Ohjelmointikielten periaatteet, Muuttujat 32

IV.1.5. Yleistä tietotyypeistä Tietotyyppi (data type): Joukko arvoja, joihin liittyy joukko näihin arvoihin sovellettavia operaatioita Keskeinen käsite ohjelmoinnissa, koska luokittelee ohjelman datan Primitiivinen tietotyyppi (primitive data type): määrittelemiseen ei käytetä muita tietotyyppejä Lähes jokaisessa kielessä määritellään joukko primitiivisiä tietotyyppejä valmiiksi Louden: yksinkertainen (simple) tietotyyppi: tietotyyppi, jolla ei ole muuta rakennetta kuin sisäänrakennettu aritmeettinen tai peräkkäinen rakenne 815338A Ohjelmointikielten periaatteet, Muuttujat 33

IV.1.6. Primitiiviset tietotyypit Jaetaan tyypillisesti numeeriseen, loogiseen ja merkkitietoon Useissa varhaisissa ohjelmointikielissä ainoat primitiiviset tietotyypit numeerisia Alkuperäisessä BASIC-kielessä ainoastaan liukulukutyyppi 815338A Ohjelmointikielten periaatteet, Muuttujat 34

IV.1.6.1. Numeeriset tyypit Kokonaislukutyyppi yleisin numeerinen primitiivinen tietotyyppi Pituus voi vaihdella; 32 bittiä nykyään yleisin Liukulukutyyppi (floating-point type) Esittää reaalilukuja (likimääräisesti) tietokoneessa Esitetään useimmiten IEEE:n standardilla 754 Diskreettien rakenteiden kurssissa esityksestä tarkemmin Desimaalityyppi Tietynmittaisille desimaaliluvuille tarkka esitys Rajoittaa esitettävien lukujen kokoa Käytössä C#-kielessä (decimal), pituus 128 bittiä 815338A Ohjelmointikielten periaatteet, Muuttujat 35

IV.6.2. Looginen tietotyyppi (boolean, logical type) Periaatteessa tietotyypeistä yksinkertaisin - tarvitsee vain arvot tosi ja epätosi Esitystapa vaihtelee C: mikä tahansa nollasta poikkeava lukuarvo tulkitaan todeksi ja nolla epätodeksi. Yleensä mahdollisuus saada arvot true ja false 815338A Ohjelmointikielten periaatteet, Muuttujat 36

IV.1.6.3. Merkkityypit Merkkitieto esitetään tietokoneen sisäisesti numeerisina koodeina. Aiemmin yleisin koodauskäytäntö ASCII (American Standard Code for Information Interchange) Nykyään UNICODE (2 tavua/merkki) yleistyy, esimerkiksi Java, C#: char kahden tavun kokoinen Merkkijonotyyppi (character string type) Useimmiten ei ole primitiivinen FORTRANissa (77 jälkeen) ja BASICissä primitiivisiä Monessa kielessä valmiiksi määriteltyjen perustietotyyppien joukossa 815338A Ohjelmointikielten periaatteet, Muuttujat 37

IV.1.6.3. Merkkityypit (2) C-kielen merkkijono Merkkiin \0 päättyvä yksiulotteinen merkkitaulukko Oliokielissä yleensä jonkin kirjastoluokan olioita 815338A Ohjelmointikielten periaatteet, Muuttujat 38

IV.1.6.4. Ordinaalityyppi (ordinal type) Arvot voidaan yhdistää positiivisiin kokonaislukuihin luonnollisella tavalla Useissa kielissä käyttäjän määrittelemiä ordinaalityyppejä; eivät täytä primitiivisen tyypin määritelmää, ovat kuitenkin yksinkertaisia tietotyyppejä Luetellut tyypit (enumeration types) Rajoitetut tyypit (subrange type) Luetellun tyypin muuttujien arvot määritellään luettelemalla symbolisiksi vakioiksi Tyyppiin liittyy järjestys -> arvoja voidaan vertailla 815338A Ohjelmointikielten periaatteet, Muuttujat 39

IV.1.6.4. Ordinaalityyppi (2) *x++=*y++ Esimerkki. Viikonpäivät lueteltuna tyyppinä Pascalilla: TYPE paiva = (su,ma,ti,ke,tor,pe,la); Sama C-kielellä: enum paiva {su, ma, ti, ke, tor, pe, la}; Vertailu Pascalissa: var ps,pt:paiva; begin ps:=su; pt:=tor; if pt > ps then begin (* lauseet *) end; end. Vertailu C kielessä: enum paiva x = su,y = tor; if(x < y) { // Lauseet } 815338A Ohjelmointikielten periaatteet, Muuttujat 40

IV.1.6.4. Ordinaalityyppi (3) Luetellun tyypin etuja Määritellyt tyypit ovat helposti tulkittavissa Rajojen ylityksen virhemahdollisuudet poistuvat mikäli tarkistetaan lueteltujen tyyppien yhteensopivuus Ellei lueteltua tyyppiä, on käytettävä numeerisia muuttujia kuvaamaan lueteltuja tyyppejä -> Tähän verrattuna: 1. Koodin luettavuus paranee 2. Luotettavuus paranee 815338A Ohjelmointikielten periaatteet, Muuttujat 41

IV.1.6.4. Ordinaalityyppi (4) Javassa versiosta 1.5 lähtien enum-tyyppi Esim. enum Paiva { } SUNNUNTAI, MAANANTAI, TIISTAI, KESKIVIIKKO, TORSTAI, PERJANTAI, LAUANTAI Vakiot olioita -> monipuolisempi kuin aiemmin mainitut C++11:ssa myös luokkatyyppinen enum enum class Paiva { }; SUNNUNTAI, MAANANTAI, TIISTAI, KESKIVIIKKO, TORSTAI, PERJANTAI, LAUANTAI 815338A Ohjelmointikielten periaatteet, Muuttujat 42

IV.1.6.4.1 Rajoitettu tyyppi Jonkin ordinaalityypin peräkkäisten arvojen osajono Ensimmäiseksi Pascalissa Voidaan käyttää myös Adassa Pascalissa: TYPE allesata = 1..100; pienetkirjaimet = a.. z ; Käyttäminen lisää luotettavuutta mikäli kääntäjä tarkistaa virheelliset operaatiot Ei käytetä muissa yleisissä kielissä Pascalin ja Adan lisäksi 815338A Ohjelmointikielten periaatteet, Muuttujat 43

IV.1.7. Rakenteelliset tietotyypit *x++=*y++ Koostuvat yhdestä tai useammasta yksinkertaista tai rakenteista tyyppiä olevasta komponentista 1. Taulukot 2. Tietueet 3. Unionit 4. Joukkotyyppi 815338A Ohjelmointikielten periaatteet, Muuttujat 44

IV.1.7.1. Taulukot Yleisimmin käytettyjä tietorakenteita Kiinteä määrä samaa tyyppiä olevia tietoalkioita, jotka sijaitsevat peräkkäin yhtenäisessä muistialueessa -> Käyttö tehokasta, koska minkä tahansa alkion muistiosoite voidaan suoraan laskea Alkiot mitä tahansa tietotyyppiä, joko primitiivistä, kielessä määriteltyä tai ohjelmassa määriteltyä Alkioihin viitataan taulukon nimellä ja alkion indeksillä taulukossa C pohjaisissa kielissä indeksit alkavat nollasta 815338A Ohjelmointikielten periaatteet, Muuttujat 45

IV.1.7.1. Taulukot (2) Esimerkki: Kokonaislukutaulukko eri kielissä C: int lukutaulu[50]; lukutaulu[10] = 34; Pascal: VAR lukutaulu: ARRAY [0..49] OF INTEGER; begin lukutaulu[10] := 34; FORTRAN: INTEGER LTAULU(0:49) LTAULU(10) = 34; 815338A Ohjelmointikielten periaatteet, Muuttujat 46

IV.1.7.1.1 Taulukkojen tyypit Neljä tyyppiä indeksien rajojen sidonnan ja muistin allokoinnin tapahtuma-ajan perusteella 1. Staattiset taulukot (static arrays) Rajat sidotaan staattisesti, taulukon muisti varataan staattisesti Suoritusajan tehokkuus 2. Kiinteät pinodynaamiset taulukot (fixed stackdynamic arrays) Rajat sidotaan staattisesti, muisti varataan ajonaikaisesti pinomuistista Muistin käyttö tehokkaampaa kuin staattisilla taulukoilla 815338A Ohjelmointikielten periaatteet, Muuttujat 47

IV.1.7.1.1 Taulukkojen tyypit (2) 3. Pinodynaamiset taulukot (stack-dynamic arrays) Rajat sidotaan dynaamisesti, muisti varataan pinomuistista. Molemmat pysyvät vakioina taulukon elinajan Taulukon kokoa ei tarvitse tietää etukäteen -> lisää joustavuutta 4. Kekodynaamiset taulukot (heap-dynamic array) Rajat sidotaan dynaamisesti, taulukon muisti varataan dynaamisesti kekomuistista Taulukon rajat ja varattu muisti voivat muuttua sen elinaikana -> joustavin tyyppi 815338A Ohjelmointikielten periaatteet, Muuttujat 48

IV.1.7.1.2. Taulukkotyypit eri kielissä Staattiset taulukot FORTRANin taulukot (versio 77 ja ennen) REAL REAALILUVUT(4) C/C++-kielessä taulukko voidaan esitellä staticmääreellä staattiseksi Kiinteät pinodynaamiset taulukot Yleisimmin pinosta varattavat taulukot, esim. C, C++ (aiemmat versiot), Pascal 815338A Ohjelmointikielten periaatteet, Muuttujat 49

IV.1.7.1.2. Taulukkotyypit eri kielissä (2) Pinodynaamiset taulukot Aiemmin harvinaisia imperatiivisissa kielissä Adassa alusta saakka AR_LEN := 25; declare AR: array(1..ar_len) of INTEGER; C/C++-kielissä uusimmissa versioissa sallittu int i,koko = 15; for(i=5; i < 10; i++){ } int taulu[koko]; // Nykyään käy C/C++:ssa 815338A Ohjelmointikielten periaatteet, Muuttujat 50

IV.1.7.1.2. Taulukkotyypit eri kielissä (3) Kekodynaamiset taulukot Javan, C#:n kaikki taulukot int[] lukutaulu = new int[50]; C/C++ -kielissä varataan kuten muutkin dynaamiset muuttujat C:ssä malloc int *lukutaulu; lukutaulu = malloc(50*sizeof(int)); lukutaulu[10] = 34; free(lukutaulu); C++:ssa new int[] lukutaulu; lukutaulu = new int[50]; lukutaulu[10] = 34; delete[] lukutaulu; 815338A Ohjelmointikielten periaatteet, Muuttujat 51

IV.1.7.1.3. Moniulotteiset taulukot Tarvitaan useampia indeksejä viittaamaan taulukon alkioihin Yleensä tarkoittaa sitä että taulukon ensimmäisen indeksin alkiot (n-1) ulotteisia taulukoita jne. Esimerkki: Pascalissa ARRAY[1..6,3..21,0..3] OF INTEGER on sama kuin ARRAY[1..6] OF ARRAY[3..21] OF ARRAY[0..3] OF INTEGER Yleensä dimensioille ei ylärajaa 815338A Ohjelmointikielten periaatteet, Muuttujat 52

IV.1.7.1.4. Taulukko-operaatiot Yleensä kielissä ei juuri operaatioita, jotka käsittelevät taulukkoa itsenäisenä yksikkönä Tavallisesti toteutettu kirjastofunktioina tai sisällytetty luokkakirjastoihin FORTRAN 90: Sisältää taulukko-operaatioita, esimerkiksi taulukkojen summan (alkioittain) Ada: Mahdollista viitata taulukon osiin indeksirajoilla -> voidaan käsitellä matriisin rivejä tai sarakkeita vektoreina 815338A Ohjelmointikielten periaatteet, Muuttujat 53

IV.1.7.1.4. Taulukko-operaatiot (2) APL Laaja kokoelma kieleen rakennettuja vektori- ja matriisioperaatioita Suunniteltu tällaisten tehtävien ohjelmoimiseen Sisältää operaattorit mm. matriisin transponointiin, käänteismatriisin etsimiseen, vektoreiden piste- ja ristituloille 815338A Ohjelmointikielten periaatteet, Muuttujat 54

IV.1.7.2.Tietueet (records) Erityyppisten tietoalkioiden kooste, jossa tiettyyn alkioon eli kenttään (field) viitataan sen nimellä Muodostetaan loogisia kokonaisuuksia, jotka koostuvat erilaisista tietoalkioista Aiemmin sisältynyt kaikkiin yleisiin kieliin Paitsi FORTRANiin Oliokielissä ei tarvetta (C++:ssa mukana) Muisti varataan peräkkäisistä muistipaikoista Yleisarvio: Käyttökelpoisia tietotyyppejä Toteutus varsin suoraviivainen eikä sisällä ongelmia yleensä missään ohjelmointikielessä 815338A Ohjelmointikielten periaatteet, Muuttujat 55

IV.1.7.2.Tietueet (2) Esimerkki. C-kielessä määrittely struct Asiakas { }; char nimi[25]; int tilinro; esittely ja käyttö (varataan pinosta): struct Asiakas a; strcpy(a.nimi,"huijari"); a.tilinro = 21; varataan dynaamisesti : struct Asiakas* pa; pa = malloc( sizeof(struct Asiakas)); strcpy(pa->nimi,"huijari"); pa->tilinro = 21; 815338A Ohjelmointikielten periaatteet, Muuttujat 56

IV.1.7.3. Unioni Vastaa tietotyyppien unionia Muuttujassa vain yksi kenttä, joka voi olla tyypiltään jokin annetuista tietotyypeistä -> muuttujan sisältämä tiedon tyyppi voi vaihdella ohjelman suorituksen aikana Käyttö voi olla hyödyllistä esimerkiksi kirjoitettaessa koodia, jonka on tarkoitus toimia eri ympäristöissä Esim. kokonaisluku voi olla 16-, 32- tai 64-bittinen Voidaan kirjoittaa koodia, jossa tehdään eistandardimaisia tyypinmuunnoksia -> Riski: voi aiheuttaa monia ongelmatilanteita 815338A Ohjelmointikielten periaatteet, Muuttujat 57

IV.1.7.3. Unioni (2) Tyypintarkistusta tyyppiin liitettävä tietokenttä, jonka perusteella päätellään, mikä kulloinkin talletettu tyyppi Valitsinkenttä (tag field, discriminant) C ja C++ -kielissä ns. vapaa unioni (free union). Ei valitsinkenttää kertomassa, minkä tyyppinen tieto on tallennettu muuttujaan Muuttujalle varataan tila suurimman mahdollisen tietotyypin mukaan Ei tyypintarkistusta -> ohjelmoija vapaa muuntamaan tietotyypin miksi tahansa vaihtoehdoista Ongelmien vuoksi jätetty toteuttamatta monissa kielissä Esim. Java, C# 815338A Ohjelmointikielten periaatteet, Muuttujat 58

IV.1.7.4. Joukkotyyppi (set) Tyypin muuttujat voivat sisältää järjestämättömän kokoelman jonkin ordinaalityypin muuttujan erillisiä arvoja -> mallinnetaan matemaattista joukkoa Yleisistä (imperatiivisista) ohjelmointikielistä ainoastaan Pascalissa Kirjastoluokkana mm. C++:ssa, C#:ssa, Javassa, Pythonissa 815338A Ohjelmointikielten periaatteet, Muuttujat 59

IV.1.8. Osoitintyyppi (pointer type) Muuttujien arvot muistiosoitteiden arvoja ja lisäksi erityinen arvo null (tai nil) Muuttujia kutsutaan yleensä osoittimiksi (pointers) Tarvitaan käsittelemään dynaamisia muuttujia ja erityisesti dynaamisia tietorakenteita Lähes kaikissa imperatiivisissa ohjelmointikielissä mahdollista käyttää osoittimia Poikkeus FORTRAN: tietorakenteiden käsittely hankalaa 815338A Ohjelmointikielten periaatteet, Muuttujat 60

IV.1.8. Osoitintyyppi (2) Muuttuja sisältää muistiosoitteen -> muuttujana aina saman tyyppinen Ohjelmoinnin kannalta tiedettävä osoitinmuuttujan tarkoitetyyppi (reference type) = minkälaiseen muuttujaan osoittaa Muuttuja, johon osoitinmuuttujan arvo kulloinkin viittaa, on sen tarkoitemuuttuja Osoitinmuuttuja voi viitata mihin tahansa tietotyyppiin, myös toiseen osoittimeen 815338A Ohjelmointikielten periaatteet, Muuttujat 61

IV.1.8. Osoitintyyppi (3) Osoitin esitellään kirjoittamalla tarkoitetyyppi ja sen jälkeen tyyppioperaattori ennen muuttujan nimeä C/C++ -kielessä * Pascalissa ^ Adassa access 815338A Ohjelmointikielten periaatteet, Muuttujat 62

IV.1.8.1. Osoittimien tärkeimmät operaatiot 1. Sijoitus (assignment) *x++=*y++ Sijoittaa osoitinmuuttujan arvoksi jonkin muistipaikan 2. Muistipaikan sisältöön viittaaminen (viittauksen purkaminen, dereferencing) Toteutetaan yleensä jollakin sisältö-operaattorilla 3. Muuttujien vertailu, ts. sen vertaaminen osoittavatko ne samaan muistipaikkaan Pascalissa ainoat sallitut operaatiot osoittimille 815338A Ohjelmointikielten periaatteet, Muuttujat 63

IV.1.8.2. C/C++ -kielten osoittimet Voi käyttää hyvin monipuolisesti -> ohjelmoijalle monenlaisia mahdollisuuksia, mutta virheellinen käyttö helppoa Muuttujan muistiosoite voidaan selvittää ja sijoittaa osoitinmuuttujaan, esimerkiksi int muuttuja = 20; int *pm; pm = &muuttuja; *pm = 55; // Nyt muuttuja == 55 815338A Ohjelmointikielten periaatteet, Muuttujat 64

IV.1.8.2. C/C++ -kielten osoittimet (2) C-kielessä tyypintarkistus väljä: float f = 0.46875; int *pif; float *pf; pif = &f; pf = pif; C:ssä sallittu, mutta ei C++ :ssa 815338A Ohjelmointikielten periaatteet, Muuttujat 65

IV.1.8.2. C/C++ -kielten osoittimet (3) Osoitinaritmetiikka sallittu Jos ptr on osoitintyypin muuttuja, ptr+1 osoittaa seuraavan tarkoitetietotyypin muuttujan osoitteeseen. Esimerkiksi: char* ptr; -> ptr+1 osoittaa seuraavaan tavuun int* ptr; -> ptr+1 osoittaa neljän tavun päähän C/C++ -kielissä geneerinen osoitintyyppi void* voi osoittaa minkätyyppiseen muuttujaan tahansa 815338A Ohjelmointikielten periaatteet, Muuttujat 66

IV.1.8.2. C/C++ -kielten osoittimet (4) *x++=*y++ Esimerkki. Taulukon läpikäynti osoittimilla C/C++:ssa char c; int ki; double rl; int index; char merkit[4] = {'a','b','c','d'}; int kokoluvut[4] = {1,2,3,4}; double rluvut[4] = {1.1,2.2,3.3,4.4}; char* pc = merkit; int* pi = kokoluvut; double* pd = rluvut; for(index=0;index < 4; index++) { c = *(pc + index); ki = *(pi + index); rl = *(pd + index); printf("merkki on %c, kokonaisluku on %d, reaaliluku on %e\n", c,ki,rl); } 815338A Ohjelmointikielten periaatteet, Muuttujat 67

IV.1.8.3. Osoitintyypin ongelmia 1. Moninimisyys Seuraa väistämättä osoittimien sallimisesta Osoittimet voidaan asettaa osoittamaan samaan muistipaikkaan Katsotaan yleensä haitallisiksi 2. Roikkuvat osoittimet Osoittavat jo vapautettuun muistiin Käytettäessä arvo satunnainen Voi johtaa hankalasti löydettäviin virheisiin 815338A Ohjelmointikielten periaatteet, Muuttujat 68

IV.1.8.3. Osoitintyypin ongelmia (2) 3. Muistivuoto (memory leakage) Ohjelmassa varattua dynaamista muistia ei vapauteta Syntyy usein hävittämällä viite dynaamiseen muuttujaan Voi johtaa kekomuistin loppumiseen ja ohjelman kaatumiseen Osoitintyypin virheet yleisimpien C/C++ -ohjelmien virheiden joukossa 815338A Ohjelmointikielten periaatteet, Muuttujat 69

IV.1.8.4. Viitetyyppi (reference type) Osoitintyypin muuttujien ongelmallisuuden takia ainakin Javassa ja C#:ssa luovuttu niistä ja korvattu viitteillä Aluksi C++ -kieleen lähinnä toteuttamaan viitetyypin parametrinvälitys funktioille Viitetyypin muuttujan avulla voidaan luoda muuttujalle alias 815338A Ohjelmointikielten periaatteet, Muuttujat 70

IV.1.8.4. Viitetyyppi (2) C++ -kielen viite: vakio-osoitin, jolle tehdään implisiittinen muistiosoitteeseen viittaaminen On vakio -> alustettava jollakin muistiosoitteen arvolla, viittaa samaan muistiosoitteeseen koko elinaikansa Esimerkki float f; float &ref_f = f; tekee muuttujista f ja ref_f aliaksia -> sijoituslause ref_f = 2.78; sijoittaa muuttujan f arvoksi 2.78. 815338A Ohjelmointikielten periaatteet, Muuttujat 71

IV.1.8.4. Viitetyyppi (3) Java yleistänyt viitemuuttujan tyyppiä -> osoittimet voitu korvata viitteillä Kaikki luodut oliot Javassa varataan dynaamisesti kekomuistista, olion nimi on viite olioon Osoitinaritmetiikka ei sallittua Eivät ole vakio-osoittimia, viite voidaan asettaa osoittamaan toiseenkin olioon Muistivuotojen estämiseksi Javassa roskien keruu (garbage collection) huolehtii siitä, että oliot vapautetaan, kun niihin ei enää ole viittauksia 815338A Ohjelmointikielten periaatteet, Muuttujat 72