program execution |
---|
general concepts |
types of code |
compilation strategies |
Notable runtimes |
|
Notable compilers & toolchains |
|
program execution (tsz. program executions)
A programokat lehet batch (soros) feldolgozásban futtatni, felhasználói beavatkozás nélkül, vagy interaktív módon, amikor a felhasználó parancsokat gépel be egy interpreteren keresztül. Ebben az esetben a „parancsok” szintén programutasítások, amelyek végrehajtása láncoltan történik.
A run (futtatni) kifejezést gyakran szinonimaként használják az execute (végrehajtani) kifejezéssel. Mindkét kifejezés vonatkozhat arra a konkrét műveletre is, amikor a felhasználó elindít (indít, meghív) egy programot, pl.: „Kérlek, futtasd az alkalmazást.”
👉 Program életciklusa:
A futtatás előtt a programot először meg kell írni. Ez általában forráskódban történik, amelyet fordítási időben (compile time) fordítanak le (és szükség esetén statikus linkelés során link time-on) futtatható állományra (executable). Ezután ezt az állományt az operációs rendszer (OS) indítja el, amely betölti a programot a memóriába (load time), dinamikus linkelést is végezhet, majd átadja a vezérlést a program belépési pontjára (entry point). Innentől kezdve a futtatás megkezdődik, és a program run time-ba (futási fázis) lép. A program addig fut, amíg be nem fejeződik, akár normális leállással, akár hibával (crash).
👉
A futtatható kód, futtatható állomány vagy futtatható program (angolul executable, vagy binary) olyan utasítások és adatok listája, amelyet a számítógép végrehajt annak érdekében, hogy a kódolt utasításoknak megfelelő feladatokat végezzen. Ez különbözik az adatállományoktól, amelyeket egy másik programnak kell értelmeznie, hogy értelmesek legyenek.
Az utasítások jelentése általában gépi kód utasításokra vonatkozik, amelyeket a fizikai CPU hajt végre. Egyes esetekben azonban szkriptekben található bytecode (pl. Java, Python) is futtathatóként kezelhető.
A futtatás kontextusa alapvetően fontos. Nagyon kevés program fut közvetlenül hardveren. A programok általában feltételezik, hogy adott erőforrások (memória, I/O, fájlrendszer stb.) rendelkezésre állnak futtatáskor. A legtöbb program egy multitasking operációs rendszer és runtime könyvtárak környezetében fut, amelyek elvonatkoztatják a program működését a konkrét hardvertől.
Például a program nem közvetlenül ír a képernyőre, hanem rendszerhívásokon keresztül használ grafikus felületet.
👉
Ahhoz, hogy programok és megszakításkezelők (interrupt handler) egymás zavarása nélkül fussanak és osszák meg a hardver erőforrásokat (memória, I/O), a modern OS-ekben szükség van kontextusváltásra.
A kontextusváltás során a futó folyamat állapotát (pl. regiszterek tartalma, memóriaoldalak címei stb.) a rendszer elmenti, majd másik folyamatra áll át. Ha visszatér az eredeti folyamathoz, az állapotot helyreállítja. Ez különösen fontos egyprocesszoros rendszereken, ahol több program verseng a CPU időért.
Linux alatt a kontextusváltás során a processz állapota egy processz-leíróba (process descriptor) kerül. Ehhez gyakran Process Context Identifier (PCID) is társul.
👉
A runtime, vagy futásidő, a program életciklusának azon fázisa, amikor a kódot ténylegesen a CPU hajtja végre. Másképpen fogalmazva: ekkor a program futó állapotban van.
Sok optimalizációs és típusellenőrzési művelet a fordítás során történik (pl. regiszterkiosztás), de bizonyos hibák csak futás közben derülnek ki:
A program futtatása során egy betöltő (loader):
Bizonyos nyelveknél ezt a nyelvi runtime környezet is elvégzi.
Néhány hibát csak futásidőben lehet felfedezni, ezért a runtime hibakeresés (debugging) kritikus jelentőségű.
👉
A kivételkezelés a modern nyelvekben lehetőséget ad a futás közbeni hibák strukturált kezelésére.
👉
A runtime rendszer (runtime environment/system) az a szoftveres környezet, amely a program végrehajtásához szükséges szolgáltatásokat biztosítja:
A fordító feltételezi, hogy a runtime rendszer adott szolgáltatásokat biztosít, és ennek megfelelően generálja a gépi kódot.
👉
Az utasításciklus (fetch–decode–execute cycle) az a folyamat, amelyet a CPU ismétel minden egyes utasítás feldolgozásakor:
Egyszerű CPU-kban ez szekvenciálisan történik, modern CPU-kban viszont pipeline technikát alkalmaznak: a különböző lépések párhuzamosan futnak, így gyorsítva a végrehajtást.
👉
Az interpreter egy olyan rendszer, amely közvetlenül végrehajtja a programot (forráskódot vagy bytecode-ot), fordítás nélkül. Ez különbözik a fordítóprogramoktól, amelyek a kódot gépi kódra fordítják még a futtatás előtt.
Interpreteres példák: Python, JavaScript.
👉
A virtuális gép egy számítógépes rendszer szoftveres emulációja. A VM képes:
A VM-ek lehetnek hardveres (pl. hypervisorral támogatott) vagy szoftveres alapúak. Különböző architektúrák emulációja is lehetséges (pl. QEMU), sőt konténeres virtualizáció is létezik (Docker).