fel
le

Futtató rendszerek

A fordító programok által generált tárgykódokat a szerkesztő program önti végleges formába. Az elkészült futtatható programot ezen időpont után az operációs rendszer kezeli, és futtatja.

A futtatás háromféleképpen történhet:

Direkt futtatás

Direkt futtatás: a generált kód az adott mikroprocesszor gépi kódú utasításait tartalmazza. Ennek megfelelően az utasítássorozatot az operációs rendszer egyszerűen átadja a mikroprocesszornak és megadja a program kezdő pontját. A processzor e pillanattól kezdve önállóan végrehajtja a következő utasítást, követi az ugrási pontokat, írja és olvassa a memória hivatkozott területeit anélkül, hogy tudná valójában mit csinál a program az adott ponton. A processzor feltétlenül megbízik a programkódban, „vita nélkül” engedelmeskedik és végrehajtja a soron következő utasítást.

Ezen módszer előnye a maximális végrehajtási sebesség. Ugyanakkor jegyezzük meg, hogy a gépi kód szintjén nincs típusfogalom, és szinte lehetetlen eldönteni, hogy az adott utasítás a program feladata szempontjából helyes-e, szükséges-e, hibás-e.

Mivel a memóriában (a nagy byte-halmazban) az adatok területén is byte-ok találhatóak, ezért elvileg elképzelhető, hogy a program vezérlése egy hibás ugró utasításnak köszönhetően áttér egy ilyen területre, és az adatokat gépi kódú utasításokként próbálja értelmezni. Ez persze valószínűleg nem fog menni. Vagy valamely utasítás paraméterezése lesz értelmezhetetlen, vagy egy olyan kódot fog találni a processzor, amely nem értelmezhető utasításkódnak. Ekkor a processzor hibás működés állapotára tér át, amely a számítógép leállásához (lefagyás) is vezethet. A mai processzorok már védekeznek ez ellen, és ilyen esemény detektálásakor speciális hibakezelő rutinok futtatására térnek át.

A hiba bekövetkezése ellen védelmet jelent, hogy a programok elszeparált területeken tárolják a programkódot, és az adatokat. A hibás ugróutasítás emiatt felfedezhető, hiszen egy adatterület belsejébe irányul. A processzor már ekkor leállítja a program futását, és áttér a hibakezelő állapotra.

Másik védelmi mechanizmus szerint a kód-terület nem írható, csak olvasható. Így a processzor képes felfedezni a hibás értékadó utasításokat, melyek egy művelet eredményeképpen kapott értéket egy olyan memóriaterületre írná be, ahol utasításkódok vannak. Ez meggátolja a programkód futás közbeni módosítását (önmódosító kód) amely egy időben igen elterjedt volt. Ma már e módszert inkább csak a vírusok és egyéb kártékony programok használják.

A direkt futtatás esetén van compiler, aki az eredeti szöveges forráskódot gépi kóddá fordítja át, amiből a linker már az adott operációs rendszerben működőképes futtatható programot (.exe) állítja elő.

Interpretes futtatás

Interpreterrel futtatás: a fordítóprogram ekkor nem generál közvetlenül végrehajtható gépi kódú utasításokat, hanem egy köztes kódot, ahol az eredeti programozási nyelv utasításai vannak számkódokká átfordítva, a paraméterei is már feldolgozott, egyszerűsített formában kódoltak. Ezt a tárgykódot egy futtató rendszer (az interpreter) futás közben utasításonként elemzi, és hajtja végre az előírt szabályok szerint.

Az interpreteres rendszerekben a futtató rendszer a lefordított kódot még végrehajtás előtt elemzi, szükség esetén az utolsó pillanatban korrigálja, pontosítja azt (pl. változóhivatkozások). Ilyen rendszerekben az is megoldható, hogy a változókat nem kell deklarálni explicit módon a program szövegében. A futtató rendszer ’kitalálja’ az adott programsorhoz érve, hogy milyen változókra van szüksége, és pontosan e pillanatban hozza csak létre. Ezen kívül az is megoldható, hogy a változó típusa futás közben derüljön csak ki, vagy akár menet közben többször meg is változzon. A futtató rendszer az adott utasításhoz érve ellenőrzi hogy ott éppen milyen változók szükségesek, ellenőrzi hogy azok pillanatnyi típusa megfelelő-e. Ha nem megfelelő, akkor vagy leáll hibaüzenettel, vagy törli a nem megfelelő típusú változót és létrehoz egy megfelelőt helyette.

Az interpreteres rendszerek sokkal rugalmasabbak. Egy adott utasítás végrehajtása előtt ellenőrizheti a szükséges feltételek teljesülését, akár korrigálhatja is a feltételeket, hogy megfeleljenek az utasításnak. Ezen rendszerek futtatása sokkal biztonságosabb. A felügyelő interpreter időben leállíthatja a futó programot, amennyiben azt nem találja megfelelőnek.

Az interpreteres rendszerek vitathatatlan hátránya, hogy egyrészt lassú a futtatás, másrészt a generált tárgykód az adott programozási nyelv szintaktikai lenyomatát hordozza, nem univerzális. Egy ilyen tárgykódból az eredeti forráskód általában szinte veszteség nélkül helyreállítható, még a változónevek és az eljárásnevek is visszaállíthatóak. Ilyet azonban sosem teszünk, hiszen ez a tárgykód nem kerül mentésre sehova. Az interpret inputja ugyanis maga a forráskód szöveges változata, a tárgykódot csak a memóriában generálja le, és csak addig az ideig létezik ez a változat, amíg a program fut.

Egy adott nyelv interpretere (pl. a BASIC interpreter) nem képes futtatni más interpreteres nyelv fordítóprogramja által generált tárgykódot.

Az interpretes futtató esetén tehát nincs compiler sem linker, legalábbis nincs külön. A programozónak ezeket nem kell futtatnia. A forráskódot az interpreter ennek ellenére lefordítja valamiféle belső bináris ábrázolássá, de ez a fordított kód csak a memóriában generálódik, nem kerül a diszkre lementésre. A következő futtatáskor a fordítás újból meg fog történni, a bináris forma ismét csak a memóriába kerül be.

Virtuális futtatás

Virtuális futtatás: ez az interpreteres elv módosítását jelenti, ezért nagy hasonlóságot mutat annak működésével. A lényeges különbség, hogy ez esetben a szintaktikai elemzés, szemantikai elemzés, fordítás elkülönült fázis (s így a programhibák nagy része már ekkor kiderül). A virtuális futtató rendszek bemenete azonban nem maga a forráskód, hanem ezen lefordított tárgykód.

A fordító ez esetben tehát nem direktben futtatható gépi kódú programot generál, hanem egy nem létező (virtuális) processzor virtuális gépi kódjára generál programot. Ezen gépi kód eltérhet a jelenlegi gépi kódtól, sokkal magasabb szintű utasításokat tartalmaz, és sokkal több típust ismer. Ez a gépi kód a magas szintű programozási nyelvhez van tervezve, sokkal könnyebb egy ilyenre fordítani a magas szintű kódot, mint a logikájában, felépítésében akár jelentősen eltérő fizikai mikroprocesszor tényleges gépi kódja.

Ezen nyelv interpreteres futtató rendszere (processzor-szimulátor, virtuális gép) sokkal egyszerűbb, hiszen a generált kód alacsonyabb szintű utasításokat tartalmaz, mint általában az interpreteres rendszerekben. A generált kód már nem feltétlenül hasonlít, nem feltétlenül hordozza az eredeti programozási nyelv szintaktikai lenyomatát (attól függ, mennyire áll közel hozzá). Belőle az eredeti forráskód csak veszteségesen állítható helyre (bár sokkal kevesebb veszteség árán, mint a gépi kódból, mivel azért még mindíg jobban hasonlít az eredeti nyelvre, mint a gépi kód, sokkal tettenérhetőbb az eredeti programvezérlési struktúrák).

A virtuális futtatás előnye, hogy amennyiben egy programozási nyelv fordítóprogramja képes e virtuális gépi kódú program generálására, úgy a futtatáshoz már felhasználható a kész futtató rendszer. Valamint ezen a virtuális nyelven generált kód más-más processzoron is futtatható lesz, amennyiben az adott processzora is létezik a futtató rendszer.

Itt tehát ismét van compiler és linker, de a fordítás eredménye nem az adott processzor gépi kódja, hanem a virtuális processzor gépi kódú nyelve. A fordítás bináris kódja azonban a diszken mentésre kerül, a linker futtatható állományt (.exe) generálhat. Ezt a futtatható állományt azonban nem lehet direkt módon futtatni. Az .exe csak annyit tud, hogy az elején szereplő kis gépi kódú rutin betölti maga alá a virtuális futtató motort, és az .exe maradék részét (ami már virtuális gépi kódú program) futtatását a motornak átadja. Ezért bár a generált program .exe, de a virtuális futtató motor nélkül nem lehet a számítógépen futtatni.

A legismertebb ilyen nyelv a JAVA, ahol a futtató rendszert Java Virtual Machine-nak (JVM-nek) hívják.

Hernyák Zoltán
2013-01-23 21:22:40