Muuttuja (ohjelmointi)

Wikipediasta
Siirry navigaatioon Siirry hakuun

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 .

Muuttujien kaytto

[ muokkaa | muokkaa wikitekstia ]

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:

 (+ x y )

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.

Muuttujatyyppeja

[ muokkaa | muokkaa wikitekstia ]
Paaartikkeli: Tyyppijarjestelma

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:

 int
 x
;

Tyypillisia tietotyyppeja, joihin muuttujat ohjelmointikielissa voivat viitata ovat:

Paaartikkeli: osoitin

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:

 char
 *
teksti
;

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".

Vakiomuuttujat

[ muokkaa | muokkaa wikitekstia ]

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]

Muistinvaraus

[ muokkaa | muokkaa wikitekstia ]

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)
  1. ISO/IEC 9899:TC3 § 6.2.1 Scopes of identifiers
  2. ISO/IEC 9899:TC3 § 6.2.3 Name spaces of identifiers
  3. ISO/IEC 9899:TC3 § 6.2.4 Storage durations of objects
  4. Khan 2013, 51
  5. Barrett & Pack 2005, 49
  6. a b Stack ece353.engr.wisc.edu . Viitattu 19.9.2022. (englanniksi)