Tölvunarfræði/Kvikleg fylki
Hvað eru kvikleg fylki?
[breyta]Í forritun gegna gagnagrindur mjög veigamiklu hlutverki. Fylki eru gott dæmi um mjög einfalda gagnagrind sem margir þekkja e.t.v. úr stærðfræði eða almennri forritun. Kvikleg fylki eru í raun alveg eins og kyrrlæg (venjuleg) fylki, a.m.k. á yfirborðinu. Munurinn á kyrrlægum fylkjum og kviklegum fylkjum liggur í úthlutun á minni en þegar verið er að forrita umfangsmikil forrit þá skiptir höfuðmáli að fínstilla minnisnotkun. Sum forritunarmál bjóða eingöngu upp á kvikleg fylki og eru þau þá sjálfvalin þegar forritari ákveður að nota fylki. Önnur forritunarmál bjóða upp á báðar útfærslur, þ.e. bæði kyrrlæg og kvikleg fylki.
Munurinn á kviklegum og kyrrlægum fylkjum
[breyta]Til að hægt sé að gera kviklegum fylkjum góð skil þá þarf fyrst að útskýra muninn á tveimur svæðum í minni tölva - fyrra svæðið er kallað stakkur (e. stack) og það seinna hrúga (e. heap).
Stakkur er tiltekið svæði í minni sem heldur utan um tímabundnar breytur (e. temporary variables) sem búnar eru til með forritskóða í forriti. Örgjörvinn (e. CPU) fylgist náið með stakkinum, bæði stjórnar honum og fínstillir eftir þörfum. Með stakkinum er sjálfkrafa tekið frá minni og því skilað til baka án þess að forritari þurfi sérstaklega að gera það sjálfur.
Hrúga er einnig tiltekið svæði í minni en um þetta svæði gilda aðrar reglur en um stakkinn. Hrúgan býr yfir miklu magni af frjálsu og óháðu minni. Örgjörvinn fylgist ekki eins náið með hrúgunni og þar sér forritarinn sjálfur um að taka frá það minni sem hann þarf hverju sinni og að skila því svo til baka. Skili forritari ekki minni til baka sem hann tekur af hrúginni, þá verður svokallaður minnisleki (e. memory leak) sem getur leitt til vandamála í keyrslu forritsins.
Þegar unnið er með kvikleg fylki þá er tekið frá minni af hrúgunni en þegar unnið er með kyrrlæg fylki þá er tekið frá minni af stakkinum.
Til þess að fá betri tilfinningu fyrir muninum á því hvernig stakkur og hrúga virkar, þá má líkja stakkinum við hina svokölluðu “Leigu” sem er að finna á flestum nýjum myndlyklum og hrúgu má líkja við hefðbundið bókasafn. Þegar að viðskiptavinur leigir sér mynd á “Leigunni”, þá þarf hann aldrei að hugsa um að sækja eða skila myndinni sérstaklega. Viðskiptavinur einfaldlega velur sér mynd og þegar að leigutími er liðinn þá hættir myndin að vera í leigu hjá honum. Hinsvegar, þegar að viðskiptavinur fær lánaða bók á bókasafni, þá verður hann bæði að sækja og skila bókinni sjálfur því annars fær hann sekt, en sektinni mætti þá líkja við minnisleka í tilviki hrúgunnar.
Hvenær á að nota kvikleg fylki?
[breyta]Nú blasir við mikilvæg spurning: Hvenær á að nota kvikleg fylki fram yfir kyrrlæg fylki? Það er hægt að svara þessari spurningu í afar stuttu máli - þegar að sveigjanleiki skiptir mestu máli. Ef forritari ætlar að nota kyrrlæg fylki þá verður hann að þekkja minnisþörf forritsins sem hann er að forrita hverju sinni. Það er vegna þess að stærð kyrrlægra fylkja þarf að þekkt á þýðingartíma forritsins. Stærð kviklegra fylka þarf hinsvegar ekki að vera þekkt fyrr en á keyrslutíma forritins og þar birtist sveigjanleikinn sem nefndur var áðan. Aðstæður þar sem forritari ætti frekar að nota kvikleg fylki eru m.a.:
- Magn gagna sem geyma þarf er mikið (stakkurinn tekur ekki við eins miklu og hrúgan)
- Forritarinn er ekki viss um hversu stórt fylkið þarf að geta orðið á keyrslutíma forritsins
- Stærð fylkisins er þekkt en nýtingarþörfin er mismikil út líftíma keyrslutilviksins
Stærð kviklegra fylkja er því í samræmi við þörf og þannig er ekki verið að eyða minni af óþörfu. Notkun kviklegra fylkja stuðar því að straumlínulagaðri minnisnotkun forrita. Forritunarleg útfærsla kviklegra fylkja er hinsvegar töluvert flóknari vegna þess að forritarinn þarf sjálfur að sjá um að skila tilbaka því minni sem hann tekur af hrúgunni. Þá eru forritunarvillur í útfærslu kviklegra fylkja algeng uppspretta minnisleka í forritum og getur það reynst dýrkeypt, sérstaklega í stærri forritum.
Kvikleg fylki í mismunandi forritunarmálum
[breyta]Þegar skoðuð eru fimm vinsælustu forritunarmál ársins 2013, þá kemur í ljós að þau styðja öll kvikleg fylki en tvö þeirra styðja eingöngu kvikleg fylki. Taflan hér að sýnir hvaða forritunarmál er um að ræða og þá er stuðningi við báðar gerðir af fylkjum einnig gerð skil.
Sæti | Forritunarmál | Stuðningur við fylki |
---|---|---|
1. | C | Styður bæði kyrrlæg og kvikleg fylki |
2. | Java | Styður eingöngu kvikleg fylki (sjálfvalið þegar búin eru til fylki) |
3. | Objective-C | Styður bæði kyrrlæg og kvikleg fylki |
4. | C++ | Styður bæði kyrrlæg og kvikleg fylki |
5. | C# | Styður eingöngu kvikleg fylki (sjálfvalið þegar búin eru til fylki) |
Heimildir
[breyta]Gribblelab - Memory Stack vs. Heap
Höfundar
[breyta]Brynjar Smári Bragason og Marinó Fannar Pálsson