Muuttuja
(
engl.
variable
) tarkoittaa
ohjelmointikielissa
nimettya eli symbolista tietovarastoa, josta tietoa voidaan hakea ja johon tietoa voidaan kirjoittaa, mikali muuttuja ei ole ns.
vakio
(talloin on tietenkin harhaanjohtavaa puhua muuttujasta). Muuttujia kaytetaan yleisesti ohjelmointikielissa tiedon varastointipaikkana.
Muuttujan nimesta voi kayttaa myos nimea
tunnus
(
engl.
identifier
).
[1]
Muuttujalla voi olla
tyyppi
ja sen nimella (tunnuksella)
nakyvyysalue
(
scope
), jonka sisalla voi kayttaa ohjelmassa.
[2]
Muuttujalla on myos
olemassaoloaika
, jona sille on varattu tila.
[3]
Muuttujia kaytetaan yleisesti matemaattisissa
lausekkeissa
ja
algoritmeissa
kuvaamaan symboleja, joiden arvoa ei etukateen haluta sitoa mihinkaan tiettyyn arvoon. Muuttujien kaytto mahdollistaa yleiskayttoisten
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 etukateen sidottu, voidaan funktiota kutsua halutuilla arvoilla, esimerkiksi summa(10,29) palauttaisi arvon 39. Muuttujien sisaltamat arvot voivat olla muitakin kuin numeroita. Tyypillisesti ohjelmistoissa muuttujilla kasitellaan tekstia, numeroita ja olioita;
minka hyvansa kielen tunteman tyypin ja sita kautta myos lausekkeen paluuarvo voidaan sijoittaa muuttujaan. Laillisten arvojen joukko riippuu
kaytettavan kielen
tyyppijarjestelmasta
.
Muuttujia kasitellaan ohjelmointikielissa operaattoreiden avulla samoin kuin vakioita ja
literaalejakin
. Esimerkiksi yhteenlaskussa kaytetaan yleensa "+" -operaattoria kahden muuttujan valissa merkitsemaan yhteenlaskua. Operaattori voi sijaita myos muualla suhteessa muuttujaan. Esimerkiksi
Lisp
-ohjelmointikielessa:
vastaa merkintaa "x + y". Tarkea operaattori on myos sijoitusoperaattori, jolla muuttuja voidaan sijoittaa toiseen muuttujaan, esimerkiksi
summa = x + y;
summa := x + y;
ovat esimerkkeja eri kielissa kaytetyista 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 nain on. Eri ohjelmointikielissa on erilaisia tapoja kasitella muuttujia operaattoreiden avulla.
Ohjelmointikielissa symbolinen muuttuja voi viitata lahes minkatyyppiseen tietoon tahansa. Ohjelmointikielissa voidaan kuitenkin maaritella minkatyyppiseen tietoon muuttuja viittaa. Muuttujat voivat olla joko
- etukateen tiettyyn tietotyyppiin sidottuja
- sisaltaa vapaasti mita tahansa tietoa
Jos muuttujan viittaama tieto on
staattisesti tyypitetty
, kuten useimmissa
kaannetyissa
ohjelmointikielissa on laita, se ei saa viitata muunkaltaiseen tietoon. Esimerkiksi muuttuja, joka viittaa kokonaislukuarvoon maaritellaan
C-kielessa
seuraavasti:
Tyypillisia tietotyyppeja, joihin muuttujat ohjelmointikielissa voivat viitata ovat:
Erityisen hyodyllisia muuttujia ovat muistiavaruuden osoitteet
selvenna
, koska ilman niita ei moderneja tietokoneohjelmia voitaisi rakentaa.
kenen mukaan?
Osoittimen tehtavana ei ole sisaltaa varsinaista tietoa vaan kertoa mista muistiavaruuden osoitteesta tavoiteltava tieto on loydettavissa. Muuttujaa, joka sisaltaa muistiavaruuden osoitteen sanotaan
osoittimeksi
(pointer). Osoittimen etuna on, etta se tarvitsee itse vahan tilaa (esimerkiksi 32-bittisissa tietokoneissa 32 bittia), mutta sen osoittama tietomaara voi olla mielivaltaisen suuri. Osoittimen yhteydessa on yleensa hyodyllista maaritella myos sen osoittaman tiedon tyyppi. Esimerkiksi
C
-kielessa maaritellaan osoitin merkkijonoon seuraavasti:
Tekstin pituus voi olla mita tahansa, mutta tietoa valitettaessa tarvitsee valittaa vain osoittimen arvo. Osoittimiin liittyy myos vakavien
ohjelmointivirheiden
vaara, koska osoittimen arvon uudelleenasettaminen voi johtaa vakaviin virhetilanteisiin. Tasta syysta useissa uudemmissa ohjelmointikielissa ohjelmoija ei paase itse asettamaan osoittimien arvoja, vaan
kaantaja
tai
tulkki
suorittaa suurempien tietoalkioiden ja olioiden kasittelyn osoittimilla ohjelmoijan "tietamatta".
Jos muuttujan tietoa ei saa muuttaa, voidaan se maaritella ns. vakiomuuttujaksi.
[4]
Muuttuja voi olla vakiomuuttuja myos, jos se sijaitsee muistialueella, johon ei voida kirjoittaa (ns.
ROM-muisti
)
[5]
Muuttujien varaaminen tietokoneen muistista tapahtuu yleensa jollain seuraavista tavoista:
- muuttuja sijaitsee suorittimen
rekisterissa
- muuttuja varataan
pinosta
(voi olla suorittimen sisainen muisti)
- muuttuja varataan tietokoneen
keskusmuistiin
- muuttuja talletetaan pysyvaismuistiin (
ROM
)
- muuttuja sijaitsee muualla, esimerkiksi verkossa, hajautetulla palvelimella tms.
Suurin osa muuttujista luodaan ja talletetaan tietokoneen keskusmuistiin. Talloin muuttuja sailyy tietokoneen muistissa niin kauan kuin virta katkaistaan tai sen paalle kirjoitetaan uusi arvo. Keskusmuistiin muuttujia tallennetaan paaasiassa kahdella tavalla: pino- ja kekomuistiin (stack, heap).
Joissakin tapauksissa suorittimella voi olla sisaanrakennettuna pieni muistialue nimenomaan pinoa varten.
[6]
Tama voi olla ohjelmallisesti kasiteltavaa
SRAM
-muistia tai tarkoitukseen tehtya laitteistoa, joka kayttaytyy muistin tavoin mutta pinon kokoa ei voi talloin muuttaa.
[6]
Rekistereihin ja pinoon muuttujalle varataan muistia yleensa vain silloin, jos muuttujaa kasitellaan vain lyhytaikaisesti ja muuttujan tulosta ei tarvitse sailyttaa kuin hetken aikaa. Muuttujat varataan tyypillisesti pinosta, jos niilla on rajattu nakyvyysalue, jonka paatyttya muuttuja ei ole kaytettavissa. Nain tapahtuu tyypillisesti funktion tai lohkon sisaisille muuttujille. Kekomuisti on yleiskayttoista muistia, jota voidaan varata tiettyyn kayttoon ja se sailyy kunnes se vapautetaan. Jos ohjelma hukkaa viittauksen tai osoittimen kekomuuttujaan sita ei voi enaa kasitella mutta se vie tilaa ja johtaa
muistivuotoon
.
Tavallisesti muun muassa laskujen valitulokset talletetaan rekistereihin.
Funktiokutsujen parametrit talletetaan yleensa tietokoneen
pinoon
, koska niita ei tarvitse sailyttaa kuin sen aikaa kun funktiokutsu on voimassa.
Koska pino on kaytettavissa useimmissa tietokone- tai mikroprosessoriarkkitehtuureissa, se on kateva paikka valiaikaisen tiedon tallettamiseen.
Joissain tapauksissa myos funktiokutsujen parametrin valitetaan suorittimen rekistereissa.
Esimerkiksi
x86
-arkkitehtuurissa yhteenlasku voitaisiin suorittaa rekistereilla seuraavasti:
mov
ax
,
10
mov
bx
,
29
add
ax
,
bx
; ax sisaltaa nyt summan 10+29
- 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)
- ↑
ISO/IEC 9899:TC3 § 6.2.1 Scopes of identifiers
- ↑
ISO/IEC 9899:TC3 § 6.2.3 Name spaces of identifiers
- ↑
ISO/IEC 9899:TC3 § 6.2.4 Storage durations of objects
- ↑
Khan 2013, 51
- ↑
Barrett & Pack 2005, 49
- ↑
a
b
Stack
ece353.engr.wisc.edu
. Viitattu 19.9.2022.
(englanniksi)