A digitális számítógépek nem értik az emberek által beszélt nyelveket. Ehelyett egy bináris nyelvet használnak, amelyet gépi kódnak vagy gépi nyelvnek neveznek.A gépi kód egyszerű számítógépes utasítások sorozatából áll, ahol minden egyes utasítás bináris számjegyek vagy bitek (azaz 1-ek és 0-k) sorozataként van kifejezve. A különböző számítógépek tipikusan különböző gépi nyelveket “beszélnek” vagy “értenek”. Például az egyik számítógép az ADD műveletet 10011111-ként, míg egy másik 000110-ként ábrázolhatja ugyanezt a műveletet. Nemcsak a bitminták különböznek jellemzően az egyes számítógépek között, hanem még a műveletek reprezentálásához használt bitek száma is eltérő lehet.

Továbbá, amikor egy program fut, az operációs rendszer (pl. Windows, Linux, OS X stb.) olyan gazdakörnyezetként működik, amely szolgáltatásokat nyújt a program számára.Ezek a szolgáltatások közé tartozik az olyan alapvető támogatás, mint a billentyűzet, a képernyő és a merevlemezek elérése. Sajnos az, hogy a program hogyan fér hozzá ezekhez a szolgáltatásokhoz, szintén eltérő az egyes operációs rendszereknél. A gépi nyelvek és az operációs rendszer követelményei közötti különbségek eredményeként a gépi nyelven írt programok inkább a programot futtató rendszerre koncentrálnak, mint arra, hogy a program hogyan old meg egy problémát. Továbbá ez azt is jelenti, hogy a gépi kódot nem lehet különböző számítógépek között mozgatni anélkül, hogy valamilyen fordítási szolgáltatást – általában virtuális gép formájában – ne biztosítanánk.

A gépi nyelven írt programok írása lassú, fáradságos és hibalehetőségekkel jár. A megoldás az volt, hogy magasabb szintű programozási nyelveket fejlesztettek ki, amelyek inkább a problémára és kevésbé a programot futtató rendszerre (a hardverre és az operációs rendszerre) koncentráltak (lásd a 2. ábrát). A számítógépek azonban jellemzően nem hajtják végre a magas szintű nyelveken írt programokat, ezért valamilyen módon le kell fordítani egy magas szintű nyelven írt programot gépi nyelvre. A szükséges fordítást kétféle számítógépes program végzi el: a fordítóprogramok és az értelmezők.

A fordítóprogram olyan program, amely más, magas szintű programozási nyelven, például C vagy C++ nyelven írt programokat fordít le gépi kódra vagy gépi nyelvre.Más nyelvek, például a Java és a C# más utat választanak: Az ezeken a nyelveken írt programokat egy köztes reprezentációba fordítják (egy olyan reprezentációba, amely valahol a magas szintű nyelv és a gépi nyelv között helyezkedik el), amelyet gyakran virtuális gépi kódnak neveznek. A virtuális gépi kód ezután egy másik program, az úgynevezett értelmező vagy virtuális gép (VM, a hardveres CPU-t szimuláló program) bemenete lesz. Egyes nyelvek, például a Javascript és a Perl, teljesen interpretáltak, azaz nem fordítják le, hanem közvetlenül értelmezik őket.

Egy illusztráció, amely egy C++ forráskódfájlt olvasó, a C++ kódot gépi kódra fordító és a gépi kódot egy futtatható fájlba kiíró fordítót mutat.
A lefordított nyelven írt program gépi kódra történő fordítása vagy átalakítása. A fordító beolvassa a C++ forráskódot egy .cpp végű fájlból, és egy végrehajtható gépi kódú fájlt készít. Windows számítógépeken a C++ fordító által előállított futtatható fájlok vége .exe; más operációs rendszerek más elnevezési konvenciókat követnek. Az operációs rendszerek képesek a futtatható fájlokat további feldolgozás nélkül futtatni.
Egy illusztráció arról, hogy a fordító beolvas egy Java forráskódfájlt, és a Java kódot virtuális gépi kóddá fordítja, amelyet egy új fájlba ment. A virtuális gép, egy másik program, beolvassa a virtuális gépi kódot az új fájlból, és értelmezi azt, hogy elvégezze a virtuális gépi kód által meghatározott műveleteket.
Virtuális gépi kódot előállító nyelven írt program fordítása és futtatása. Az olyan nyelveket, mint a Java és a C#, először virtuális gépi kóddá, azaz egy virtuális számítógép – egy valójában nem létező számítógép – gépi kódjává fordítják. A forráskód lefordítása után egy virtuális gépnek (VM) nevezett program hajtja végre a kódot egy valódi számítógép műveleteit szimulálva. Az operációs rendszer futtatja a VM-et.
A képen egy Javascript forráskódfájl látható, amelyet egy értelmező olvas be és dolgoz fel.
Egy tisztán értelmezett nyelven írt program futtatása. Az olyan nyelveket, mint a Javascript és a Perl, egyáltalán nem fordítják le. Az értelmezőnek nevezett program utasításonként olvassa be a forráskódfájlt, és minden egyes utasítást olvasás közben hajt végre vagy értelmez, anélkül, hogy azt bármilyen más nyelvre lefordítaná. A Javascript-értelmező beépül a legtöbb webböngészőbe, amelyet az operációs rendszer futtat. Más értelmezett nyelvek esetében az operációs rendszer az értelmezőt alkalmazási programként futtatja.

Egy magas szintű programozási nyelven írt program futtatásának minden megközelítése rendelkezik előnyökkel és hátrányokkal. A teljesen lefordított nyelveken (pl. C és C++) írt programok gyorsabban futnak, mint a részben lefordított nyelveken (pl. Java és C#) írt programok, és sokkal gyorsabban futnak, mint a teljesen értelmezett nyelveken (pl. Javascript és Perl) írt programok. Hogy érzékeltessük a teljesítménybeli különbséget, tegyük fel, hogy egy C++ program, miután lefordították, 1,0 idő alatt fut le. Egy ezzel egyenértékű, lefordított, majd értelmezett nyelven írt program általában 3-10 idő alatt fut le. Ugyanez a program tisztán értelmezett nyelven végrehajtva körülbelül 100 idő alatt fut le. A Java és a C# VM-ek kortárs implementációi just in time (JIT) értelmezőt használnak, amely a feldolgozás során a virtuális kód egy részét gépi kóddá fordítja. A JIT feldolgozók a futási időt a tisztán fordított nyelvi rendszerek futási idejének körülbelül másfélszeresére csökkentik. A Python programozási nyelv egy kicsit más: a Python program fő része értelmezett, de viszonylag kicsi, és így minimális hatással van a teljes futási időre. A Python könyvtárak többsége, ahol a program a legtöbb időt tölti, C nyelven íródott, így a Python programok majdnem olyan gyorsan futnak, mint egy egyenértékű C program.

Másrészt a tisztán fordítóprogrammal előállított futtatható programok nem vihetők át különböző platformok között (pl. egy Windows programot nem lehet futtatni egy Apple számítógépen), míg az értelmezett nyelven írt programok könnyebben mozgathatók különböző számítógépek között. Ezt a hordozhatóságot úgy érik el, hogy minden platformhoz (hardver és operációs rendszer kombinációjához) egy VM-et vagy értelmezőt biztosítanak. Az értelmezők és a VM-ek olyan programok, amelyek tisztán fordított nyelven íródtak, így nem hordozhatók, de az általuk feldolgozott programok igen.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.