Lásd: Szabad változók és kötött változók

A változó hatóköre azt írja le, hogy a program szövegében a változó hol használható, míg a terjedelem (vagy élettartam) azt írja le, hogy a program végrehajtása során a változónak mikor van (értelmes) értéke. A változó hatóköre valójában a változó nevének tulajdonsága, a terjedelem pedig magának a változónak a tulajdonsága. Ezeket nem szabad összetéveszteni a kontextussal (más néven környezettel), amely a program tulajdonsága, és a forráskód vagy a végrehajtás egyes pontjai szerint változik – lásd: hatókör: áttekintés. Továbbá az objektum élettartama egybeeshet a változó élettartamával, de sok esetben nem kötődik a változó élettartamához.

A változó nevének hatóköre befolyásolja annak kiterjedését.

A hatóköre egy változó névfelbontásának fontos része. A legtöbb nyelv minden egyes változó (valamint bármely más megnevezett entitás) számára meghatározott hatóköröket határoz meg, amelyek egy adott programon belül eltérőek lehetnek. Egy változó hatókörét a programkódnak az a része jelenti, amely számára a változó neve jelentéssel bír, és amely számára a változót “láthatónak” mondjuk. A hatókörbe való belépés jellemzően a változó élettartamának kezdetét jelenti (amikor a változó kontextusba kerül), a hatókörből való kilépés pedig jellemzően a változó élettartamának végét jelenti (amikor a változó kikerül a kontextusból). Például egy “lexikai hatókörrel” rendelkező változó csak egy bizonyos függvényen/alprogramon belül, vagy szűkebb értelemben egy kifejezésekből/megállapításokból álló blokkon belül (ennek megfelelően függvényhatókörrel vagy blokkhatókörrel) értelmezhető; ez statikus felbontás, amely parse-időben vagy fordítási időben végezhető el. Alternatív megoldásként egy dinamikus hatókörű változót futásidőben oldunk fel, egy globális kötési verem alapján, amely az adott vezérlési folyamattól függ. A csak egy adott függvényen belül elérhető változókat “helyi változóknak” nevezzük. A “globális” vagy határozatlan hatókörrel rendelkező változóra a programban bárhol lehet hivatkozni.

A terjedelem viszont egy változó futásidejű (dinamikus) aspektusa. Egy változó minden egyes értékhez kötése futásidőben saját kiterjedéssel rendelkezhet. A kötés kiterjedése a program végrehajtási idejének az a része, amely alatt a változó továbbra is ugyanarra az értékre vagy memóriahelyre hivatkozik. Egy futó program többször is beléphet és kiléphet egy adott kiterjedésből, mint például egy lezárás esetében.

Hacsak a programozási nyelv nem rendelkezik szemétgyűjtéssel, egy olyan változó, amelynek kiterjedése tartósan meghaladja a hatókörét, memóriaszivárgást eredményezhet, amelynek során a változó számára allokált memóriát soha nem lehet felszabadítani, mivel a változó, amely a kiosztás megszüntetése céljából hivatkozna rá, már nem elérhető. Ugyanakkor megengedhető, hogy egy változó kötése túlnyúlik a hatókörén, ahogyan ez a Lisp zárásokban és a C statikus helyi változókban előfordul; amikor a végrehajtás visszamegy a változó hatókörébe, a változó ismét használható. Az olyan változót, amelynek hatókörét a kiterjedése előtt kezdik, inicializálatlannak mondjuk, és gyakran meghatározatlan, tetszőleges értékkel rendelkezik, ha hozzáférünk hozzá (lásd vad mutató), mivel még nem kapott explicit módon egy adott értéket. Az a változó, amelynek kiterjedése a hatókör előtt ér véget, lógó mutatóvá válhat, és ismét inicializálatlannak tekinthető, mivel értéke megsemmisült. Az előző két eset által leírt változókról azt mondhatjuk, hogy kiterjedésen kívüliek vagy nem kötöttek. Sok nyelvben hiba, ha egy változó értékét megpróbáljuk használni, amikor az a kiterjedésen kívül van. Más nyelveken ez kiszámíthatatlan eredményt adhat. Egy ilyen változóhoz azonban lehet új értéket rendelni, ami új kiterjedést ad neki.

A helyhatékonyság érdekében a változóhoz szükséges memóriaterületet csak akkor lehet kiosztani, amikor a változót először használják, és felszabadítani, amikor már nincs rá szükség. Egy változóra csak akkor van szükség, amikor hatókörben van, ezért minden változó élettartamának kezdete a hatókörbe való belépéskor helyet adhat a nem használt változóknak. Az ilyen helypazarlás elkerülése érdekében a fordítók gyakran figyelmeztetik a programozókat, ha egy változót deklaráltak, de nem használják.

A jó programozási gyakorlat szerint a változók hatókörét a lehető legszűkebbre kell szabni, hogy a program különböző részei véletlenül se lépjenek kölcsönhatásba egymással, egymás változóit módosítva. Ezzel megelőzhető a távoli cselekvés is. Ennek általános technikái közé tartozik, hogy a program különböző részei különböző névtereket használnak, vagy hogy az egyes változókat dinamikus vagy lexikális változóhatárolás révén “priváttá” teszik.

Néhány programozási nyelv egy fenntartott értéket (gyakran null vagy nil) használ az érvénytelen vagy nem inicializált változó jelzésére.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.