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: 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 mai 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.
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ípusú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, 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ód’-bó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. 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’.
Virtuális futtatás: ez az interpreteres elv módosítását jelenti. A fordí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.
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, 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).
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.
A legismertebb ilyen nyelv a JAVA, ahol a futtató rendszert Java Virtual Machine-nak (JVM-nek) hívják.
Programozás tankönyv
II. Fejezet