See also: Vapaat muuttujat ja sidotut muuttujat

Muuttujan laajuus (scope) kuvaa sitä, missä kohtaa ohjelmatekstiä muuttujaa voidaan käyttää, kun taas laajuus (tai elinikä) kuvaa sitä, milloin ohjelman suorituksessa muuttujalla on (mielekäs) arvo. Muuttujan laajuus on itse asiassa muuttujan nimen ominaisuus, ja laajuus on itse muuttujan ominaisuus. Näitä ei pidä sekoittaa kontekstiin (jota kutsutaan myös ympäristöksi), joka on ohjelman ominaisuus ja joka vaihtelee lähdekoodin tai suorituksen kohdan mukaan – katso laajuus: yleiskatsaus. Lisäksi objektin elinaika voi olla sama kuin muuttujan elinaika, mutta monissa tapauksissa se ei ole sidottu muuttujan elinaikaan.

Muuttujan nimen laajuus vaikuttaa muuttujan laajuuteen.

Laajuus on tärkeä osa muuttujan nimen ratkaisua. Useimmat kielet määrittelevät kullekin muuttujalle (samoin kuin mille tahansa muulle nimetylle oliolle) tietyn laajuuden, joka voi vaihdella tietyn ohjelman sisällä. Muuttujan laajuus on se osa ohjelmakoodia, jolle muuttujan nimellä on merkitystä ja jolle muuttujan sanotaan olevan ”näkyvissä”. Alueelle tulo aloittaa tyypillisesti muuttujan elinkaaren (kun se tulee kontekstiin) ja alueelta poistuminen päättää tyypillisesti muuttujan elinkaaren (kun se poistuu kontekstista). Esimerkiksi muuttuja, jolla on ”leksikaalinen laajuus”, on merkityksellinen vain tietyssä funktiossa/alarutiinissa tai tarkemmin sanottuna lausekkeiden/lausekkeiden lohkossa (vastaavasti funktion laajuudella tai lohkon laajuudella); tämä on staattinen resoluutio, joka voidaan suorittaa jäsennyksen aikana tai kääntämisen aikana. Vaihtoehtoisesti muuttuja, jolla on dynaaminen laajuus, ratkaistaan suoritusaikana, joka perustuu globaaliin sidospinoon, joka riippuu tietystä ohjausvirrasta. Muuttujia, jotka ovat käytettävissä vain tiettyjen funktioiden sisällä, kutsutaan ”paikallisiksi muuttujiksi”. ”Globaaliin muuttujaan” eli muuttujaan, jolla on rajoittamaton laajuus, voidaan viitata missä tahansa ohjelmassa.

Laajuus taas on muuttujan ajonaikainen (dynaaminen) näkökohta. Jokaisella muuttujan sitoutumisella arvoon voi olla oma laajuutensa ajonaikana. Sidonnan laajuus on se osa ohjelman suoritusajasta, jonka aikana muuttuja viittaa edelleen samaan arvoon tai muistipaikkaan. Käynnissä oleva ohjelma voi siirtyä tiettyyn laajuuteen ja poistua siitä useita kertoja, kuten sulkemisen tapauksessa.

Jos ohjelmointikielessä ei ole roskienkeräystä, muuttuja, jonka laajuus ylittää pysyvästi sen soveltamisalan, voi aiheuttaa muistivuodon, jolloin muuttujalle varattua muistia ei voida koskaan vapauttaa, koska muuttujaan, jota käytettäisiin viittaamaan muuttujaan sen poistamista varten, ei ole enää pääsy. Voi kuitenkin olla sallittua, että muuttujan sidonta ulottuu soveltamisalansa ulkopuolelle, kuten Lispin sulkumuuttujissa ja C:n staattisissa paikallisissa muuttujissa; kun suoritus siirtyy takaisin muuttujan soveltamisalalle, muuttujaa voidaan jälleen käyttää. Muuttujaa, jonka vaikutusalue alkaa ennen sen laajuutta, sanotaan initialisoimattomaksi, ja sillä on usein määrittelemätön, mielivaltainen arvo, jos sitä käytetään (vrt. villi osoitin), koska sille ei ole vielä nimenomaisesti annettu tiettyä arvoa. Muuttujasta, jonka laajuus loppuu ennen sen soveltamisalaa, voi tulla roikkuva osoitin, ja sitä pidetään jälleen kerran alustamattomana, koska sen arvo on tuhoutunut. Kahden edellisen tapauksen kuvaamien muuttujien voidaan sanoa olevan out of extent tai unbound. Monissa kielissä on virhe yrittää käyttää muuttujan arvoa, kun se on laajuuden ulkopuolella. Muissa kielissä tämä voi johtaa arvaamattomiin tuloksiin. Tällaiselle muuttujalle voidaan kuitenkin antaa uusi arvo, jolloin se saa uuden laajuuden.

Tilatehokkuuden vuoksi muuttujan tarvitsema muistitila voidaan varata vasta, kun muuttujaa käytetään ensimmäistä kertaa, ja vapauttaa, kun sitä ei enää tarvita. Muuttujaa tarvitaan vain silloin, kun se on laajuudessa, joten jokaisen muuttujan elinkaaren aloittaminen sen tullessa laajuuteen voi antaa tilaa käyttämättömille muuttujille. Tällaisen tilan tuhlaamisen välttämiseksi kääntäjät usein varoittavat ohjelmoijia, jos muuttuja on ilmoitettu, mutta sitä ei käytetä.

Hyvänä ohjelmointikäytäntönä pidetään sitä, että muuttujien vaikutusalue on mahdollisimman kapea, jotta ohjelman eri osat eivät vahingossa ole vuorovaikutuksessa toistensa kanssa muuttamalla toistensa muuttujia. Näin toimimalla estetään myös etätoiminta. Yleisiä tekniikoita tähän ovat ohjelman eri osien asettaminen käyttämään eri nimiavaruuksia tai yksittäisten muuttujien muuttaminen ”yksityisiksi” joko dynaamisen muuttujan rajauksen tai leksikaalisen muuttujan rajauksen avulla.

Monissa ohjelmointikielissä käytetään varattua arvoa (usein nimeltään null tai nil) ilmaisemaan epäkelpoista tai alustamatonta muuttujaa.

Vastaa

Sähköpostiosoitettasi ei julkaista.