Verem (adatszerkezet)
A számítástechnikában a verem (angolul stack) egy LIFO adatszerkezet, amelyben általában véges számú azonos típusú (méretű) adatot lehet tárolni.
Hagyományosan két alapműveletet értelmezünk rá:
- push (rárak): A verem tetejére helyez egy új adatot. Ha a verem betelt, akkor túlcsordulásos állapotba kerül.
- pop (levesz): A verem legfelső elemét leveszi és visszaadja. Ha a verem már üres, akkor alulcsordulásos állapotba kerül.
A különböző megvalósításoknál előfordulhat, hogy a legfelső vagy tetszőleges elemet is el lehet érni annak levétele nélkül.
A verem szokásos megvalósítása egy véges méretű összefüggő memóriaterület és egy veremmutató segítségével történik. A memóriaterületet egyik vége felől töltjük föl, és a veremmutató mindig a legfölső elemre mutat (a két művelet során ezt egyszerűen növelni vagy csökkenteni kell).
Etimológia
szerkesztésA stack igazából egy általánosan elterjedt hibás fordítás. Angolul a stack a megfelelője ennek az adatszerkezetnek, de ennek az angol szónak a következők a jelentései: rakat, rakás, kazal, halom és a a belőle képzett igének (to stack) halomba rak, rangsorol, összerak, egy rakást készít. A 'verem' nem megfelelő fordítása a szónak, ennek ellenére a magyar informatikai szektor teljesen átvette (a verem angolul pit és nem stack).
Informatikai közegben a nyelvtanilag helyes fordítása a szónak nem elfogadott, a hibás verem szót kell használni a stack data type magyar megfelelőjének.
Hardveres verem
szerkesztésVerem alatt gyakran egy konkrét megvalósítását értjük, amely a legtöbb számítógép-architektúrán központi szerepet tölt be a programok futásában.
Ebben az értelemben a verem (vagy veremtár) a számítógép memóriájának egy része, amelybe más adatok mellett a processzor azokat a memóriacímeket menti el, ahova az egyes eljárások befejeztével visszatér.
A veremnek a szubrutinok használatakor van jelentősége: ide lehet menteni a szubrutin kezdetén azokat a regisztereket, melyek értéke meg fog változni a szubrutin végrehajtása során, valamint lokális adattárolásra is lehetőséget ad. A paraméterek átadása is általában a vermen történik.
Működési elve
szerkesztésA verem (stack) fizikailag a memóriában helyezkedik el. Dinamikus elem, mérete (hossza) és helye (hogy hol helyezkedik el a memóriában) – változó. A stack implementálásához egy speciális regiszterben elhelyezkedő mutató szükséges, mely mutatót (a regiszter tartalmát) speciálisan a stacket kezelő utasítások mozgatják, változtatják, szükség szerint.
A stackben többnyire regiszterek tartalmát tároljuk (mentjük el), átmenetileg. Ennek oka az, hogy a mikroprocesszor leggyorsabban a belső regiszterekkel tud műveleteket végezni. A regiszterek száma viszont korlátozott. Például gyakran előfordul, hogy az összes regiszter már olyan információt tartalmaz, amely még nem felülírható, de az adott részfeladat elvégzéséhez szükség van további regiszterek használatához. Ekkor valamely regiszter(ek) tartalmát ideiglenesen a stackbe tudjuk kivinni (majd később a stackből a regiszter tartalmát vissza tudjuk állítani) és a regiszterbe már aktuálisabb tartalmat tudunk betölteni. Ez a művelet általában gyorsabb és kényelmesebb, mint a memóriába írni a regisztertartalmat. Hiszen ilyenkor meg kellene választani a címzést, meg kellene jegyezni a tárolási címet és a tárolt adat hosszát.
Régebbi mikroprocesszoroknál ún. belső stack létezett, vagyis a processzoron belül volt a verem, ami jelentősen korlátozta a processzor kapacitását. Ma minden processzornál a RAM-ban elhelyezhető 'külső stack található.