Ero sivun ”Muuttuja (ohjelmointi)” versioiden välillä

Wikipediasta
Siirry navigaatioon Siirry hakuun
[katsottu versio][katsottu versio]
Poistettu sisältö Lisätty sisältö
kenen mukaan -malline (osoitinten välttämättömyys) + selvennä-malline (termi osoitteet po. osoittimet?), kh: turha pilkku, yhdyssana
linkki: literaali (ohjelmointi), termivalinta "ohjelmointikielissä tehdään" po. "ohjelmointikielissä on laita", typo, lähde: Khan 2018, Barrett & Pack 2005, viitteitä
Rivi 16: Rivi 16:
=== Muuttujien käyttö ===
=== Muuttujien käyttö ===


Muuttujia käsitellään ohjelmointikielissä operaattoreiden avulla samoin kuin vakioita ja literaalejakin. Esimerkiksi yhteenlaskussa käytetään yleensä "+" -operaattoria kahden muuttujan välissä merkitsemään yhteenlaskua. Operaattori voi sijaita myös muualla suhteessa muuttujaan. Esimerkiksi [[Lisp]]-ohjelmointikielessä:
Muuttujia käsitellään ohjelmointikielissä operaattoreiden avulla samoin kuin vakioita ja [[literaali (ohjelmointi)|literaalejakin]]. Esimerkiksi yhteenlaskussa käytetään yleensä "+" -operaattoria kahden muuttujan välissä merkitsemään yhteenlaskua. Operaattori voi sijaita myös muualla suhteessa muuttujaan. Esimerkiksi [[Lisp]]-ohjelmointikielessä:
<syntaxhighlight lang="text">
<syntaxhighlight lang="text">
(+ x y )
(+ x y )
Rivi 38: Rivi 38:
{{pääartikkeli|[[Tyyppijärjestelmä]]}}
{{pääartikkeli|[[Tyyppijärjestelmä]]}}


Ohjelmointikielissä symbolinen muuttuja voi viitata lähes minkä tyyppiseen tietoon tahansa. Ohjelmointikielissä voidaan kuitenkin määritellä minkätyyppiseen tietoon muuttuja viittaa. Muuttujat voivat olla joko
Ohjelmointikielissä symbolinen muuttuja voi viitata lähes minkätyyppiseen tietoon tahansa. Ohjelmointikielissä voidaan kuitenkin määritellä minkätyyppiseen tietoon muuttuja viittaa. Muuttujat voivat olla joko


* etukäteen tiettyyn tietotyyppiin sidottuja
* etukäteen tiettyyn tietotyyppiin sidottuja
* sisältää vapaasti mitä tahansa tietoa
* sisältää vapaasti mitä tahansa tietoa


Jos muuttujan viittaama tieto on [[Tyyppijärjestelmä#Staattinen vs. dynaaminen tyypitys|staattisesti tyypitetty]], kuten useimmissa [[ohjelmointikielen kääntäjä|käännetyissä]] ohjelmointikielissä tehdään, se ei saa viitata muun kaltaiseen tietoon. Esimerkiksi muuttuja, joka viittaa kokonaislukuarvoon määritellään [[C (ohjelmointikieli)|C-kielessä]] seuraavasti:
Jos muuttujan viittaama tieto on [[Tyyppijärjestelmä#Staattinen vs. dynaaminen tyypitys|staattisesti tyypitetty]], kuten useimmissa [[ohjelmointikielen kääntäjä|käännetyissä]] ohjelmointikielissä on laita, se ei saa viitata muunkaltaiseen tietoon. Esimerkiksi muuttuja, joka viittaa kokonaislukuarvoon määritellään [[C (ohjelmointikieli)|C-kielessä]] seuraavasti:
<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
int x;
int x;
Rivi 59: Rivi 59:
=== Osoittimet ===
=== Osoittimet ===
{{Pääartikkeli|[[Osoitin (ohjelmointi)|osoitin]]}}
{{Pääartikkeli|[[Osoitin (ohjelmointi)|osoitin]]}}
Erityisen hyödyllisiä muuttujia ovat muistiavaruuden osoitteet{{selvennä|pitänee olla osoittimet}}, koska ilman niitä ei moderneja tietokoneohjelmia voitaisi rakentaa.{{kenen mukaan}} Osoittimen tehtävänä ei ole sisältää varsinaista tietoa vaan kertoa mistä muistiavaruuden osoitteesta tavoiteltava tieto on löydettävissä. Muuttujaa, joka sisältää muistiavaruuden osoitteen sanoitaan [[osoitin|osoittimeksi]] (pointer). Osoittimen etuna on, että se tarvitsee itse vähän tilaa (esimerkiksi 32-bittisissä tietokoneissa 32 bittiä), mutta sen osoittama tietomäärä voi olla mielivaltaisen suuri. Osoittimen yhteydessä on yleensä hyödyllistä määritellä myös sen osoittaman tiedon tyyppi. Esimerkiksi [[C (ohjelmointikieli)|C]]-kielessä määritellään osoitin merkkijonoon seuraavasti:
Erityisen hyödyllisiä muuttujia ovat muistiavaruuden osoitteet{{selvennä|pitänee olla osoittimet}}, koska ilman niitä ei moderneja tietokoneohjelmia voitaisi rakentaa.{{kenen mukaan}} Osoittimen tehtävänä ei ole sisältää varsinaista tietoa vaan kertoa mistä muistiavaruuden osoitteesta tavoiteltava tieto on löydettävissä. Muuttujaa, joka sisältää muistiavaruuden osoitteen sanotaan [[osoitin|osoittimeksi]] (pointer). Osoittimen etuna on, että se tarvitsee itse vähän tilaa (esimerkiksi 32-bittisissä tietokoneissa 32 bittiä), mutta sen osoittama tietomäärä voi olla mielivaltaisen suuri. Osoittimen yhteydessä on yleensä hyödyllistä määritellä myös sen osoittaman tiedon tyyppi. Esimerkiksi [[C (ohjelmointikieli)|C]]-kielessä määritellään osoitin merkkijonoon seuraavasti:
<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
char *teksti;
char *teksti;
</syntaxhighlight>
</syntaxhighlight>


Tekstin pituus voi olla mitä tahansa, mutta tietoa välitettäessä tarvitsee välittää vain osoittimen arvo. Osoittimiin liittyy myös vakavien [[ohjelmointivirhe]]iden vaara, koska osoittimen arvon uudelleenasettaminen voi johtaa vakaviin virhetilanteisiin. Tästä syystä useissa uudemmissa ohjelmointikielissä ohjelmoija ei pääse itse asettamaan osoittimien arvoja, vaan [[ohjelmointikielen kääntäjä|kääntäjä]] / [[ohjelmointikielen tulkki|tulkki]] suorittaa suurempien tietoalkioiden ja olioiden käsittelyn osoittimilla ohjelmoijan "tietämättä".
Tekstin pituus voi olla mitä tahansa, mutta tietoa välitettäessä tarvitsee välittää vain osoittimen arvo. Osoittimiin liittyy myös vakavien [[ohjelmointivirhe]]iden vaara, koska osoittimen arvon uudelleenasettaminen voi johtaa vakaviin virhetilanteisiin. Tästä syystä useissa uudemmissa ohjelmointikielissä ohjelmoija ei pääse itse asettamaan osoittimien arvoja, vaan [[ohjelmointikielen kääntäjä|kääntäjä]] tai [[ohjelmointikielen tulkki|tulkki]] suorittaa suurempien tietoalkioiden ja olioiden käsittelyn osoittimilla ohjelmoijan "tietämättä".


=== Vakiomuuttujat ===
=== Vakiomuuttujat ===


Jos muuttujan tietoa ei saa muuttaa, voidaan se määritellä ns. vakiomuuttujaksi. Muuttuja voi olla vakiomuuttuja myös, jos se sijaitsee muistialueella, johon ei voida kirjoittaa (ns. [[ROM-muisti]])
Jos muuttujan tietoa ei saa muuttaa, voidaan se määritellä ns. vakiomuuttujaksi.<ref>Khan 2013, 51</ref> Muuttuja voi olla vakiomuuttuja myös, jos se sijaitsee muistialueella, johon ei voida kirjoittaa (ns. [[ROM-muisti]])<ref>Barrett & Pack 2005, 49</ref>


== Muistinvaraus ==
== Muistinvaraus ==
Rivi 93: Rivi 93:
add ax, bx ; ax sisältää nyt summan 10+29
add ax, bx ; ax sisältää nyt summan 10+29
==Lähteet==
==Lähteet==
* {{Kirjaviite
| Nimeke = Embedded Systems Design and Applications with the 68HC12 and HCS12| Julkaisija = Pearson/Prentice Hall| Vuosi =2005
| Tekijä = Barrett, Steven Frank & Pack, Daniel J.| Suomentaja =
| Luku = | Sivu = | Sivut = | Selite =
| Julkaisupaikka = Upper Saddle River, NJ| Tunniste = | Isbn =978-0-13-140141-9
| www = | www-teksti = | Tiedostomuoto =
| Viitattu = | Kieli = {{en}} }}
* {{Kirjaviite| Nimeke = Roles of variables from the perspective of computer science educators| Julkaisija = University of Joensuu, Department of Computer Science| Vuosi =2003| Tekijä = Ben-Ari, Mordechai & Sajaniemi, Jorma| Luku = | Sivu = | Sivut = | Selite =
* {{Kirjaviite| Nimeke = Roles of variables from the perspective of computer science educators| Julkaisija = University of Joensuu, Department of Computer Science| Vuosi =2003| Tekijä = Ben-Ari, Mordechai & Sajaniemi, Jorma| Luku = | Sivu = | Sivut = | Selite =
| Julkaisupaikka = Joensuu| Tunniste = | Isbn =952-458-407-7| www = | www-teksti = | Tiedostomuoto =| Viitattu = | Kieli = {{en}} }}
| Julkaisupaikka = Joensuu| Tunniste = | Isbn =952-458-407-7| www = | www-teksti = | Tiedostomuoto =| Viitattu = | Kieli = {{en}} }}
* {{Kirjaviite
| Nimeke = Learn Professional Programming Skill in C++ Programming Language
| Julkaisija = Xlibris| Vuosi =2013
| Tekijä = Khan, Adalat| Suomentaja =
| Luku = | Sivu = | Sivut = | Selite =
| Julkaisupaikka = | Tunniste = | Isbn =978-1-4836-6652-5
| www = | www-teksti = | Tiedostomuoto =
| Viitattu = | Kieli = {{en}} }}
* {{Kirjaviite
| Nimeke = Learn Professional Programming in .Net Using C#, Visual Basic, and Asp.Net| Julkaisija = Xlibris| Vuosi =2018
| Tekijä = Khan, Adalat| Suomentaja =
| Luku = | Sivu = | Sivut = | Selite =
| Julkaisupaikka = | Tunniste = | Isbn =978-1-9845-0154-7
| www = | www-teksti = | Tiedostomuoto =
| Viitattu = | Kieli = {{en}} }}
===Viitteet===
===Viitteet===
{{viitteet}}
{{viitteet}}

Versio 28. heinäkuuta 2020 kello 15.33

Muuttuja (engl. variable) tarkoittaa imperatiivisessa ohjelmoinnissa nimettyä eli symbolista tietovarastoa, josta tietoa voidaan hakea ja johon tietoa voidaan kirjoittaa, mikäli muuttuja ei ole ns. vakio (tällöin on tietenkin harhaanjohtavaa puhua muuttujasta). Muuttujia käytetään yleisesti ohjelmointikielissä tiedon varastointipaikkana.

Perusteet

Muuttujia käytetään yleisesti matemaattisissa lausekkeissa ja algoritmeissä kuvaamaan symboleja, joiden arvoa ei etukäteen haluta sitoa mihinkään tiettyyn arvoon. Muuttujien käyttö mahdollistaa yleiskäyttöisten proseduurien ja funktioiden luomisen. Esimerkiksi seuraava funktio palauttaa kahden lukumuuttujan "x" ja "y" yhteenlasketun summan:

 funktio summa(x, y) {
   summa = x + y;
}

Koska muuttujien "x" ja "y" arvoa ei ole etukäteen sidottu, voidaan funktiota kutsua halutuilla arvoilla, esimerkiksi summa(10,29) palauttaisi arvon 39. Muuttujien sisältämät arvot voivat olla muitakin kuin numeroita. Tyypillisesti ohjelmistoissa muuttujilla käsitellään tekstiä, numeroita ja olioita; minkä hyvänsä kielen tunteman tyypin ja sitä kautta myös lausekkeen paluuarvo voidaan sijoittaa muuttujaan. Laillisten arvojen joukko riippuu käytettävän kielen tyyppijärjestelmästä.

Muuttujien käyttö

Muuttujia käsitellään ohjelmointikielissä operaattoreiden avulla samoin kuin vakioita ja literaalejakin. Esimerkiksi yhteenlaskussa käytetään yleensä "+" -operaattoria kahden muuttujan välissä merkitsemään yhteenlaskua. Operaattori voi sijaita myös muualla suhteessa muuttujaan. Esimerkiksi Lisp-ohjelmointikielessä:

 (+ x y )

vastaa merkintää "x + y". Tärkeä operaattori on myös sijoitusoperaattori, jolla muuttuja voidaan sijoittaa toiseen muuttujaan, esimerkiksi

 summa = x + y;
 summa := x + y;

ovat esimerkkejä eri kielissä käytetyistä sijoitusoperaattoreista. Loogisten operaattoreiden avulla voidaan vertailla muuttujien arvoja, esimerkiksi lauseessa:

 if( x > y ) then print "x on suurempi kuin y";

operaattori ">" vertailee onko x suurempi kuin y jolloin lause tulostaa ruudulle tekstin, jos näin on. Eri ohjelmointikielissä on erilaisia tapoja käsitellä muuttujia operaattoreiden avulla.

Muuttujatyyppejä

Pääartikkeli: Tyyppijärjestelmä

Ohjelmointikielissä symbolinen muuttuja voi viitata lähes minkätyyppiseen tietoon tahansa. Ohjelmointikielissä voidaan kuitenkin määritellä minkätyyppiseen tietoon muuttuja viittaa. Muuttujat voivat olla joko

  • etukäteen tiettyyn tietotyyppiin sidottuja
  • sisältää vapaasti mitä tahansa tietoa

Jos muuttujan viittaama tieto on staattisesti tyypitetty, kuten useimmissa käännetyissä ohjelmointikielissä on laita, se ei saa viitata muunkaltaiseen tietoon. Esimerkiksi muuttuja, joka viittaa kokonaislukuarvoon määritellään C-kielessä seuraavasti:

 int x;

Tyypillisiä tietotyyppejä, joihin muuttujat ohjelmointikielissä voivat viitata ovat:

Osoittimet

Pääartikkeli: osoitin

Erityisen hyödyllisiä muuttujia ovat muistiavaruuden osoitteetselvennä, koska ilman niitä ei moderneja tietokoneohjelmia voitaisi rakentaa.kenen mukaan? Osoittimen tehtävänä ei ole sisältää varsinaista tietoa vaan kertoa mistä muistiavaruuden osoitteesta tavoiteltava tieto on löydettävissä. Muuttujaa, joka sisältää muistiavaruuden osoitteen sanotaan osoittimeksi (pointer). Osoittimen etuna on, että se tarvitsee itse vähän tilaa (esimerkiksi 32-bittisissä tietokoneissa 32 bittiä), mutta sen osoittama tietomäärä voi olla mielivaltaisen suuri. Osoittimen yhteydessä on yleensä hyödyllistä määritellä myös sen osoittaman tiedon tyyppi. Esimerkiksi C-kielessä määritellään osoitin merkkijonoon seuraavasti:

 char *teksti;

Tekstin pituus voi olla mitä tahansa, mutta tietoa välitettäessä tarvitsee välittää vain osoittimen arvo. Osoittimiin liittyy myös vakavien ohjelmointivirheiden vaara, koska osoittimen arvon uudelleenasettaminen voi johtaa vakaviin virhetilanteisiin. Tästä syystä useissa uudemmissa ohjelmointikielissä ohjelmoija ei pääse itse asettamaan osoittimien arvoja, vaan kääntäjä tai tulkki suorittaa suurempien tietoalkioiden ja olioiden käsittelyn osoittimilla ohjelmoijan "tietämättä".

Vakiomuuttujat

Jos muuttujan tietoa ei saa muuttaa, voidaan se määritellä ns. vakiomuuttujaksi.[1] Muuttuja voi olla vakiomuuttuja myös, jos se sijaitsee muistialueella, johon ei voida kirjoittaa (ns. ROM-muisti)[2]

Muistinvaraus

Muuttujien varaaminen tietokoneen muistista tapahtuu yleensä jollain seuraavista tavoista:

  • muuttuja sijaitsee suorittimen rekisterissä
  • muuttuja varataan tietokoneen keskusmuistiin
  • muuttuja talletetaan pysyväismuistiin (ROM)
  • muuttuja sijaitsee muualla, esimerkiksi verkossa, hajautetulla palvelimella tms.

Suurin osa muuttujista luodaan ja talletetaan tietokoneen keskusmuistiin. Tällöin muuttuja säilyy tietokoneen muistissa niin kauan kuin virta katkaistaan tai sen päälle kirjoitetaan uusi arvo. Keskusmuistiin muuttujia tallennetaan pääasiassa kahdella tavalla: pino- ja kekomuistiin (stack, heap).

Rekistereihin ja pinoon muuttujalle varataan muistia yleensä vain silloin, jos muuttujaa käsitellään vain lyhytaikaisesti ja muuttujan tulosta ei tarvitse säilyttää kuin hetken aikaa. Muuttujat varataan tyypillisesti pinosta, jos niillä on rajattu näkyvyysalue, jonka päätyttyä muuttuja ei ole käytettävissä. Näin tapahtuu tyypillisesti funktion tai lohkon sisäisille muuttujille. Kekomuisti on yleiskäyttöistä muistia, jota voidaan varata tiettyyn käyttöön ja se säilyy kunnes se vapautetaan. Jos ohjelma hukkaa viittauksen tai osoittimen kekomuuttujaan sitä ei voi enää käsitellä mutta se vie tilaa ja johtaa muistivuotoon.

Tavallisesti muun muassa laskujen välitulokset talletetaan rekistereihin. Funktiokutsujen parametrit talletetaan yleensä tietokoneen pinoon, koska niitä ei tarvitse säilyttää kuin sen aikaa kun funktiokutsu on voimassa. Koska pino on käytettävissä useimmissa tietokone- tai mikroprosessoriarkkitehtuureissa, se on kätevä paikka väliaikaisen tiedon tallettamiseen. Joissain tapauksissa myös funktiokutsujen parametrin välitetään suorittimen rekistereissä.

Esimerkiksi Intelin prosessoreiden x86-arkkitehtuurissa yhteenlasku voitaisiin suorittaa rekistereillä seuraavasti:

mov ax, 10
mov bx, 29
add ax, bx  ; ax sisältää nyt summan 10+29

Lähteet

  • Barrett, Steven Frank & Pack, Daniel J.: Embedded Systems Design and Applications with the 68HC12 and HCS12. Upper Saddle River, NJ: Pearson/Prentice Hall, 2005. ISBN 978-0-13-140141-9. (englanniksi)
  • Ben-Ari, Mordechai & Sajaniemi, Jorma: Roles of variables from the perspective of computer science educators. Joensuu: University of Joensuu, Department of Computer Science, 2003. ISBN 952-458-407-7. (englanniksi)
  • Khan, Adalat: Learn Professional Programming Skill in C++ Programming Language. Xlibris, 2013. ISBN 978-1-4836-6652-5. (englanniksi)
  • Khan, Adalat: Learn Professional Programming in .Net Using C#, Visual Basic, and Asp.Net. Xlibris, 2018. ISBN 978-1-9845-0154-7. (englanniksi)

Viitteet

  1. Khan 2013, 51
  2. Barrett & Pack 2005, 49