Változó
A Wikipédiából, a szabad lexikonból.
A számítógép-tudományban és a matematikában a változó egy mennyiség vagy egy objektum szimbólikus jelölése. A matematikában a változó gyakran egy ismeretlen mennyiséget jelent, míg a számítógép-tudományban azt a helyet értjük alatta, ahol egy mennyiséget tárolhatunk. A változókat gyakran a konstansokkal ellentétes értelemben használjuk, amik értéke ismert, és az nem változik. A kísérleti tudományokban „független változónak” nevezzük azt a tényezőt, amit a tudós megváltoztathat.
A matematikában a változók legalapvetőbb fajtái illetve rokonai (éles határ nem mindig van az egyes fogalmak közt) az ismeretlen, a határozatlan, a paraméter, a függvényváltozó és a logikai változó.
A nyitott mondatokban is változó(ka)t használunk. Például az x + 1 = 5 képletben az x egy változó, ami jelen esetben egy „ismeretlen” érték helyett áll. A matematikában a változók jelölésére általában a latin ábécé betűit használjuk, de más ábécé jeleit, sőt bármi egyéb szimbólumot is használhatunk. A számítógép programozása során is alkalmazzuk a változót, amit egy betűvel, vagy egy alfanumerikus jelsorozattal azonosítunk.
Tartalomjegyzék |
[szerkesztés] Matematikai változók
- Az ismeretlen egyenletekben olyan számot jelöl, mely bár igazából nem változik, értéke adott, de nem ismerjük. Szigorúbb felépítésben az egyenletek elméletét tekinthetjük a matematikai logika részének is, az egyenleteket nyitott mondatokként kezelve; ekkor az ismeretlent változónak tekintjük.
- A határozatlan a polinomok és formális hatványsorok elméletének egyik alapfogalma, szigorúbb felépítésben egyáltalán nem változó, hanem egy speciális, konkrét hatványsor, de az elemi algebrában szokás változónak tekinteni.
- Az elemi algebrában paraméternek nevezett fogalom talán a legérdekesebb, legnehezebben leírható: ez olyan mennyiség, melynek értéke nem lényeges, így tulajdonképp ismeretlen, de nem cél a kiszámolása. Tulajdonképp egy rögzített szám (így nem feltétlenül változó), csak betűvel kiírva. A paraméter fogalmát a legalább elsőrendű logikában és a számítógép-tudományokban másféle értelemben is használhatják.
- A „ legvalódibb” értelemben vett változók a függvények független és függő változói, ezeket használjuk a „nem konstans” értelemben.
- A logikában a változó fogalmát szokás egy a függvényváltozó fogalmánál szűkebb értelemben használni. Változó („matematikai” értelemben) egy logikai nyelv olyan szimbóluma, mely szabadon interpretálható; azaz tulajdonképpen ez egy függvény- vagy operáció változója; logikai értelemben véve azonban csak azon szimbólumok tekintendők változóknak, melyek egy adott rögzített interpretáción belül is többféle lehetséges értéket vehetnek fel.
[szerkesztés] Természettudományok
Más tudományágakban, mint a biológia, a kémia és a fizika, a változó megnevezést az egyed vagy a rendszer mérhető tulajdonságainak, jellemzőinek és jelzőinek hivatkozására használjuk. A kísérleti tudományokban „független változónak” nevezzük azt a tényezőt, amit a tudós megváltoztathat. Például a hőmérséklet általános környezeti tényező, amit laboratóriumi körülmények között ellenőrzésünk alatt tudunk tartani. A „függő” vagy „eredmény” változót a fentiek befolyásolják, mint adatok.
Wikipédia is használ speciális változókat, lásd: Help:Variable.
[szerkesztés] Miért hasznosak a változók?
Hasznosak, mert a matematikában és a számítógép programozásánál lehetővé teszik az utasítások és műveletek általános megadását. Ha egy konkrét értékre akarjuk alkalmazni a változóval leírt szabályt, akkor nem kell mást tennünk, mint a megadott értékre kicseréljük a változót. Például definíciót adhatunk egy tetszőleges szám négyzetének meghatározására: négyzet(x) = x · x
Amennyiben egy konkrét szám négyzetét kell meghatározni, akkor a felírt definícióba be kell helyettesíteni a változó helyére a kívánt számot.
- négyzet(x) = x · x
- négyzet(1) = 1 · 1
- négyzet(2) = 2 · 2
- négyzet(3) = 3 · 3
stb.
A fenti példában az x változó helyére bármilyen érték behelyettesíthető. Egy nagyon fontos dolgot azonban ki kell hangsúlyozni: az x változó minden előfordulása helyére ugyanazt az értéket kell behelyettesíteni, azaz az első x és a második x alkalmazása között az értéke nem változhat meg. A számítógép programozási nyelvek esetében előfordulhat, hogy a második x értéke eltér az elsőtől, ha a program nem mellékhatásmentes.
[szerkesztés] Számítógép programozása
A programozási nyelvekben a változó úgy képzelhető el, mint egy hely, ami alkalmas egy érték tárolására a számítógép memóriájában. A változók alkalmazása a matematikában megszokotthoz hasonló kényelmes lehetőségeket biztosít.
A változó nevet kap, aminek segítségével a későbbiekben a változóban lévő objektumra hivatkozni lehet. Ez úgy működik, miként az emberek neve, amivel mások megszólíthatják. A matematikában és a számítógép-tudományban gyakran nagyon hasonló módon használjuk a változókat. Más módszer is van, ekkor változó úgy is létezhet, hogy nincs elnevezése. Jellemzően a változó neve a memória néhány bájtjának címét jelenti, így a változóra vonatkozó művelet e memória rész tartalmát használja, vagy módosítja. Ez a név szerinti kötés. Ha nagy adatterület szükséges, vagy pillanatnyilag (a program készítésekor) nem ismert a mérete, akkor a változóban nem közvetlenül az adatot tároljuk, hanem csak a memória érintett részére mutató hivatkozást.
A változók két fontos tulajdonságát külön ki kell emelni: az életciklust, és az érvényességi kört. A memória gazdaságossága érdekében a változónak az első használat előtt helyet kell biztosítani, a használat befejezésekor pedig fel kell szabadítani a területét. Az érvényességi kör segít meghatározni a változó életciklusát. A változó rendszerint a program kód valamelyik érvényességi körében van, tehát a változó a programrész aktiválódásakor keletkezik, majd megszűnik, amikor a programrész véget ér. Szokásosan azt mondjuk, hogy a változó az érvényességi körében „látszik”, másként pedig, csak akkor szükséges a változó, ha látszik. Így egy nem használt változó csak a memória területet foglalja feleslegesen. Emiatt a fordítóprogramok figyelmeztethetik a programozót, ha szerepel deklarált változó, amit sosem használ.
Míg egy egyszerű változó egyetlen egészet, vagy szöveget tartalmaz, addig léteznek programnyelvek, amik megengedik az érték mellett az adat típusának tárolását is. Ezek a nyelvek paraméter szerinti többalakú függvények írását is lehetővé teszik. Ezek a változók az egyszerűekhez hasonlóan működnek, de a típusukat is hordozzák. Vegyük például a length függvényt – ami meghatározza egy listában található elemek számát -- ehhez szükségtelen ismerni az elemek típusát, a típusos szignatúrát egy típusos változóval lehet megvalósítani, ami biztosítja a paraméter szerinti többalakúságot.
A változók kétfélék lehetnek, van, amelyik új értéket is felvehet, és van, amelyik nem. Amennyiben az érték megváltozhat, akkor bal-értékről beszélünk, ha nem változhat, akkor jobb-értékről. A funkcionális programozás egyik jellemzője, hogy a változó nem vehet fel másik értéket. Mivel a nem módosítható értékű változó, vagy függvény konstansként viselkedik, ezért változón általában a módosítható értékűekre kell gondolni.
A változók nevét általában programozási nyelvenként eltérő szabályok és megállapodások szerint kell képezni.
A C++ programozási nyelv (nem így a C) tartalmazza a mutable kulcsszót, ami lehetővé teszi, hogy a függvények const tagjai értékét lehessen változtatni.
A programozási nyelvekben úgy gondolhatunk a változókra, mint egy helyre a számítógép memóriájában, ahol értéket helyezhetünk el. Pontosabban a nevet (amit néha azonosítónak szoktak mondani) egy érték tárolására alkalmas helyhez társítja, ahol objektumként tárolódik az adat. A változók elhelyezésének jellemzői, valamint az adatok megjelenési formái széles tartományban változhatnak a különféle programozási nyelvekben, de még egy adott nyelv különböző megvalósításaiban is.
[szerkesztés] Változónév
A változók olyan nevet kaphatnak, amit a programozási nyelv szintaktikája megenged, ajánlatos a megállapodásokat betartani, de ezeken túl egyéni ízlés kérdése. Az egyes nyelvek azt is meghatározhatják, hogy mely szavak nem alkalmazhatók változónévként. Továbbá programozói közösségek hallgatólagosan további szabályokban is megállapodhatnak, vagy akár egy-egy programozó is alkothat ilyeneket.
Például a C és a hozzá hasonló programozási nyelvekben a változók neve állhat betűkből, számokból, és tartalmazhatja az aláhúzás jelet, de mindenképpen betűvel kell kezdődnie. De nem írja elő egyetlen programozási nyelv sem, hogy egy változót konkrétan hogyan nevezzünk el: x_koordinata vagy xKoordinta vagy egyszerűen x. Meg kell jegyezni, hogy a magyar nyelvű környezetben használatos ékezetes magánhangzókat a programozási nyelvek többségében nem szabad használni a változók elnevezésére. További sajátosság lehet még a kis- és nagybetűk megkülönböztetése, vagy azonosnak tekintése.
Egyes programnyelvekben a változó neve meghatározza a benne tárolható adat típusát. Például Fortranban a változó első betűje határozza meg, hogy alapértelmezés szerint milyen érték tárolására képes: lebegőpontos, vagy egészek befogadására. Basicben a név végére írt $ jel kifejezi, hogy a változó szöveg tárolására alkalmas. Perl $ prefix-szel jelöli a skalárt, @ jellel a tömböt, %-kal a hash-táblát, és &-tel az alprogramot.
Belsőleg a változó nevek és a memóriacímek összerendelése egy szimbólumtáblában vannak. A Lisp-szerű nyelvekben a szimbólumtábla látható, a bejegyzések nem sztringek, hanem szimbólumok, amik programmal módosíthatók.
Több programnyelvben, mint pl. Java, Common Lisp és Python, a változók névterekbe, vagy csomagokba rendezhetők. A névterek saját szimbólumtáblával rendelkeznek, ami lehetővé teszi, hogy egy adott név több helyen is használható legyen ütközés nélkül. Példával bemutatva: legyen két csomag Common Lispben, az egyik myutils, a másik app, ekkor mindkettő tartalmazhat *mode* névvel változót minden probléma nélkül. A program egy része (modul) a saját névterét minden nehézség nélkül elérheti, a másik névtérbeli változóra pedig direkt módon kell hivatkoznia – úgy, mint app:*mode*.
[szerkesztés] Érvényességi kör és hatókör
Érvényességi kör és hatókör (vagy élettartam) megadja, hogy a változót a programszöveg mely részén használhatjuk, és a végrehajtás közben milyen körben rendelkezik majd értékkel.
A legtöbb programozási nyelvben a változók többféle érvényességi körrel is rendelkezhetnek. A változó érvényességi köre a programkód azon része, ahol a változó nevének jelentése van (használható, ismert). Például a változó nyelvtani érvényességi köre az azt tartalmazó utasításblokkra vagy alprogramra vonatkozik. A globális változóra vagy egy korlátlan érvényességi körű változóra a program bármely részéből lehet hivatkozni. A változóra az érvényességi körén kívülről hivatkozni hibás és értelmetlen. A program lexikális elemzése fel tudja deríteni az érvényességi körön kívülről történő hivatkozásokat.
A fentiekhez hasonlóan a változó értékhez kapcsolása több hatókörhöz rendelhető. A kapcsolat hatóköre az az idő -- a program végrehajtásának egy része --, amíg a változó ugyanarra az értékre, vagy helyre hivatkozik. A működő program többször is beléphet és elhagyhatja ugyanazt a hatókört, ahogy azt az egységbe zártság jelenti. Egy változót el is dobhatunk, ami azt jelenti, hogy az érvényességi körnek továbbra is része marad, de érték nélkül, vagy törölt értékkel. Néhány nyelvben hibát okoz, ha az eldobott változóra hivatkozunk, esetleg előre meg nem határozható értéket ad.
Más szavakkal az érvényességi kör a lexikális elemzéshez fűződik, a hatókör pedig a végrehajtást jellemzi. Ha a változóra az érvényességi körén kívülről hivatkozunk, akkor az hibát okoz. A fordított nyelveknél ez mindig fordításkor jelentkező hiba. Ha a változó a hatókörén kívül van, értékére nem lehet hivatkozni (mert nincs, vagy törlődött), de lesz értéke, amint létrejön az új hatóköre.
Ha a program vezérlése kikerül a változó hatóköréből, az nem vezet hibához. A Lisp zártsága, vagy a C sztatikus változója miatt, ha a vezérlés visszakerül a változó érvényességi körébe, akkor az ismét felhasználhatóvá válik. Ha a változó hatóköre szűnik meg, akkor az eldobódik, és az érvényességi körén belül is a hivatkozása hibát okoz (vagy C-ben határozatlan értéket ad).
Számos programozási nyelv alkalmaz egy kitüntetett értéket (aminek általában null vagy nil a neve) az érvénytelen vagy értéket nem kapott változó jelzésére.
[szerkesztés] Helyfoglalás a memóriában
A létrehozott változó értékkel rendelkezik. Az érték egy absztrakció, fogalom, ami megvalósítás-függő, az értéket valami adatobjektum képviseli, ami valahol a számítógép memóriájában helyezkedik el. A program, vagy a futásidejű környezet a memóriában helyezi el az adatobjektumokat, majd az újrafelhasználhatóság miatt az objektumok törlődnek, ha már nincs szükség a bennük tárolt értékre.
A memóriaváltozók kezelése nagymértékben függ a nyelvi környezettől. Néhány nyelvi megvalósítás könnyen felismeri azokat a változókat, amikre már nincs szükség a függvény befejeződése után. A lokális változók területe a végrehajtási verem részét képezi, ami automatikusan felszabadul, amikor a függvény végrehajtása befejeződik.
Az egyéb objektumoknak a heap-ben, vagy a memória éppen nem használt közös részén lehet helyet foglalni. Ezek a részek automatikusan nem tudnak felszabadulni, ezért kezdeményezni kell megszűnésüket, ha már nincs szükség rájuk. A hulladékgyűjtős (GC) nyelvek -- Java és Lisp -- futásidőben automatikusan visszanyeri azon objektumok által foglalt helyet, amikre már nincs egyetlen hivatkozás sem. A nem-GC-s nyelvek (C) esetében a szükséges területet a programnak (programozónak) kell lefoglalnia, és mikor eljött az ideje, akkor direkt módon kell felszabadítani az érintett helyeket. Hibát okozhat a heap kimerülése a memória hézagok miatt. Ha a program elég hosszú ideig működik, akkor ezek a használatba be nem vonható területek felemésztik a szabad területeket, kimerül a memória.
A szükséges memória lefoglalása főleg az összetett adatstruktúrák esetén fontos tényező. Egy változó mutathat egy dinamikusan létrehozott adatstruktúrára, ilyen esetben az adatszerkezet részeire nem közvetlenül a változóval tudunk hivatkozni, a változó mutat a létrejött struktúrára. Ez biztosítja a GC-s nyelvek hulladékgyűjtési módszerének működését, hiszen amikor egy adatszerkezetre nincs már egyetlen mutató sem, akkor az felszabadítható.
[szerkesztés] Típusos és típus nélküli változók
A sztatikusan típusos nyelvekben, mint a Java és ML, egy változónak mindig van típusa, ami azt jelenti, hogy csakis a típusnak megfelelő érték tárolására képes. A dinamikus típusú nyelvek esetében, mint Python vagy Lisp, nem a változó rendelkezik típussal. ld. típus rendszer
A változók típusmegadása engedélyezi a többalakúságot, amit fordításkor old fel.
[szerkesztés] Paraméterek
A függvények argumentumát, vagy formális paramétereit is szokás változónak nevezni. A következő két egyenértékű függvény Python illetve Lisp nyelven íródott:
def addtwo(x): return x + 2
(defun addtwo (x) (+ x 2))
Az x nevű változó az argumentum. Akkor fog értéket kapni, amikor meghívjuk a függvényt. A legtöbb nyelvben az argumentum a függvényre nézve lokális érvényességi körű, az x nevű változóra csak az addtwo függvényben lehet hivatkozni, bár természetesen egy másik függvényben is lehet x nevű változó, aminek semmi köze sincs az előzőhöz.