käyttämällä VariablesEdit
näkyvyys ja Variablesedit
muuttujilla voi olla erilainen näkyvyys tai laajuus sen mukaan, miten ne on ilmoitettu ja käytetty. Scope viittaa kykyyn päästä käsiksi tietyn muuttujan sisältöön tietyssä vaiheessa ohjelmaa.
yleensä muuttujan laajuus määräytyy sen sulkevan lohkon perusteella. Lohko voidaan sulkea eksplisiittisesti joissakin kielissä (begin/end, {/} pareja), kun taas toisissa lohko on implisiittinen.
lähes kaikilla kielillä on yleinen rajausalue, ja jos ohjelma julistaa muuttujan tässä laajuudessa, sitä kutsutaan kokonaismuuttujaksi.
paikallinen muuttuja sen sijaan on sellainen, joka näkyy vain lohkonsa sisällä eli ”laajuudessa”.
harkitse tätä koodia:
integer globalVariableglobalVariable = 5begin integer localVariable localVariable = 7 globalVariable = 8endlocalVariable = 3 /* <-- this is a syntax error */
globaali muuttuja ilmoitetaan minkään lohkon ulkopuolella, joten se on (implisiittisessä) globaalissa ulottuvuudessa, jolloin se on globaali muuttuja. paikallinen muuttuja ilmoitetaan alku – / loppulohkossa, jolloin sen soveltamisala rajoittuu kyseiseen kenttään.
muuttuja globalVariable alkaa numerolla 5, merkitään lohkossa 8 ja poistuu numerolla 8. Muuttuja localVariable on annettu 7, sitten menee soveltamisalan ulkopuolelle ennen kuin on laittomasti osoitettu 3. Tällä tasolla ei ole muuttuvaa paikkamuuttujaa.
muuttujan elinikä kertoo, milloin muuttuja on aktiivinen. Edellisessä esimerkissä luodaan ohjelman alussa globaali muuttuja, jonka elinikä vastaa ohjelman pituutta. LocalVariable, se luodaan vasta juuri sen jälkeen, kun lohko alkaa direktiivin. Sen elämä on ohi, kun ohjelma läpäisee end-direktiivin.
Dynamic memory allocationEdit
monilla ohjelmilla on hyvin tarkat ja pienet muistialueet. Jos kirjoitimme ohjelmaa kuvatiedostojen lukemiseen, Emme ole varmoja, kuinka suuria kuvat voisivat olla. Jotkut voivat olla satoja megatavuja, kun taas jotkut voivat olla kilotavuja tai vähemmän. Satojen megatavujen jakaminen, joita ei tarvita, vaikeuttaisi ohjelman ajamista joillakin tietokoneilla, kun taas liian vähän muistia varattaisiin, tarkoittaisi, että on olemassa joitain kuvia, joita emme voi käsitellä.
hyvä lähestymistapa tähän ongelmaan on muistin jakaminen tarpeen mukaan. Tätä kutsutaan dynaamiseksi muistinvaraukseksi. Pyydämme vain niin paljon kuin tarvitsemme ohjelman ollessa käynnissä (eikä käännösaikaan), ei enempää eikä vähempää. Esimerkissämme tämä antaisi meille mahdollisuuden muokata sekä valtavia että pieniä kuvatiedostoja tehokkaalla ja tehokkaalla tavalla. Asiaan liittyy vielä mutkikkuutta, sillä kieli ei enää käsittele allokoinnin yksityiskohtia, vaan meitä suoraan. Esimerkissämme, jos olemme käynnissä alapään tietokone, ei ehkä ole tarpeeksi muistia mahtuu suuria kuvatiedostoja, joten meidän täytyy havaita (ja mahdollisesti sulavasti epäonnistua) tällaisissa tilanteissa.
dynaaminen muistinjako on ”muistivuotojen” pääasiallinen lähde, jossa ohjelmat varaavat, käyttävät ja sen jälkeen tehdään muistialuetta, mutta eivät merkitse sitä jälleen käytettävissä olevaksi. Näitä ongelmia voi olla vaikea jäljittää, koska toisin kuin muut viat, vuodot eivät ole helposti havaittavissa.
joissakin nykykielissä on sisäänrakennettuja mekanismeja, joilla yritetään estää muistivuotoja eli roskien keräämistä. Tämä järjestelmä pitää kirjaa siitä, mitä kohdentamista käytetään, kun se on soveltamisalan ulkopuolella. Roskien keräämisessä on lievä suoritusrangaistus, mutta sitä pidetään nykyään yleisesti edistyksenä. Esimerkiksi Jaavalla ja Pythonilla on roskien kerääjä.