Minden írt kódsort le kell fordítani a számítógépe által érthető nyelvre. De hogyan történik ez?
A magas szintű programozási nyelvek, például a PHP, a Swift és a JavaScript forráskódja kissé természetes nyelvnek tűnik. Az ilyen kódokban angol szavakat fog látni, és meg fogja tudni érteni a funkcióinak egy részét, még akkor is, ha magát a nyelvet nem ismeri. De az ilyen forráskódnak géppel olvasható formátumban kell lennie ahhoz, hogy a számítógép futtathassa a végső programot.
Ehhez a gépnek szüksége van egy közvetítőre, aki lefordítja a kódját valami feldolgozhatóvá. Ez a közvetítő lehet tolmács, fordító vagy összeszerelő. Mindannyian hasonlót csinálnak: a forráskódot egy ember által olvasható formából gépi olvasásra fordítják. De hogy csinálják, az egészen más.
Mi az a tolmács?
Egy tolmács egyenként beolvassa a kód minden sorát, és futás közben azonnal végrehajtja. A tolmács nem várja meg, hogy a teljes forráskód gépi kóddá alakuljon, mielőtt elküldi a CPU-nak. Ehelyett minden kódsort értelmező-specifikus bájtkóddá alakít, és minden utasítást végrehajt a fordítás során. Míg a végrehajtási feladat közvetlenül a tolmácsra támaszkodik, a CPU magát a tolmácsot látja el energiával.
Mivel az egyes sorokat egyszerre elemzi és futtatja, a folyamat gyakran viszonylag lassabb. Ezt szem előtt tartva az értelmezett programozási nyelvek hibáit könnyű észrevenni, mivel azonnali visszajelzést adnak minden kódsorhoz.
Ennek a viselkedésnek a hátulütője azonban az, hogy egy futásidejű hiba összeomlik a program végrehajtása közben, ami rossz felhasználói élményt eredményez, különösen akkor, ha a projekt nem rendelkezik megfelelő teszteléssel.
Mi az a fordító?
Egy fordító beolvassa a forráskódot, és lefordítja azt gépi olvasható futtatható fájllá. Az interpreterrel ellentétben a teljes forráskódot egy mozdulattal beolvassa, gépi kódot generálva a későbbi CPU általi feldolgozáshoz. Mivel a fordító ezt a feladatot csak egyszer hajtja végre, a lefordított programok általában gyorsabbak és memóriatakarékosabbak.
A fordító azonban nem veszi figyelembe a futásidejű hibákat. Ehelyett fordításkor jelez bizonyos hibákat, ami általában jobb. Ez a fajta hiba a fejlesztés során jelenik meg, nem a program futása közben. Ne feledje azonban, hogy futásidejű hibák továbbra is lehetségesek, még a lefordított programokban is.
A legfontosabb különbségek
A tolmácsok és a fordítók egyaránt gyakoriak, ezért hasznos tudni a köztük lévő fő különbségeket.
Kódvégrehajtás: Bemeneti és kimeneti feldolgozás
Egy tolmács csak soronként gyűjthet össze, fordíthat le és hajthat végre minden bemenetet. A forráskód minden sorát szekvenciálisan futtatja, ahogy jön, és a végső kimenet attól függ, hogy az egyes sorok mit adnak ki a végrehajtás során.
A fordító a teljes forráskódot összecsomagolja, és csak egyszer fordítja le. Tehát a teljes forráskódot használja bemenetként, amelyet átalakít, és elküld a CPU-nak, hogy kimenetet kapjon.
Hibakeresés és hibakövethetőség
Az értelmezett kód esetében a hibák jobban nyomon követhetők, mivel az értelmező közvetlenül az eredeti forrásra hivatkozva jelentheti azokat. Ha azonban hiba történik a végrehajtás bármely pontján, a tolmács leáll. Tehát a hibakeresési hibák egy kicsit kihívást jelenthetnek, mivel futás közben kell reprodukálni őket. Még rosszabb is lehet, ha nem megfelelő a futásidejű naplózás.
Másrészt a futásidejű hibákat egy lefordított nyelven nehezebb lehet nyomon követni, mivel nincs értelmező, aki jelentést készítene róluk. De a fordításkor felfedezett hibákat általában könnyebb kezelni, mivel a fordító következetesen azonosítja őket.
A legtöbb lefordított nyelv rendelkezik a nem használt változók, a típus-inkompatibilitás és a hibás szintaxis észlelésére szolgáló mechanizmussal is, így korán megelőzi az ilyen jellegű hibákat.
Teljesítmény és sebesség
Ahogy az várható volt, egy fordító segít a gépnek gyorsabban futtatni a programkódot, mivel a CPU csak egyszer dolgozza fel a kódot. Ez nem így van a tolmácsoknál, amelyek futásidőben fordítanak le minden sort.
Bár vannak programozási elveket használhat Az értelmezett kód optimalizálása érdekében az értelmező továbbra is időt tölt az egyes sorok elemzésével és végrehajtásával, mielőtt a következőre lépne. Az értelmezett nyelvek gyorsabbá tételéhez azonban fordítósegítők állnak rendelkezésre.
Például a Chrome böngésző a V8-as motor segítségével dolgozza fel a JavaScriptet; ez a Just-In-Time (JIT) fordítón fut. A Pyinstaller modul egy másik segédprogram, amely egy Python-szkriptet köt össze és futtatható csomagba fordít.
Noha ezek a segítők hasznosak egy tolmácsolt nyelv fordítóprogramba történő összevonásához, ez nem változtat azon a tényen, hogy az alapfordító továbbra is tolmács.
Memóriahasználat
Az értelmező és a fordító memóriahasználati viselkedése relatív, és gyakran a forráskódtól és egyéb tényezőktől függ. Míg egyes programozók azzal érvelnek, hogy a kódfeldarabolás a tolmácsokban csökkenti a memóriahasználatot, a tolmácsok az összesített memóriahasználatot is rögzítik.
Például amikor megvizsgálja a Python kódjának memóriahasználati profilja, az általa fogyasztott memória mennyisége meglepheti Önt.
Általánosságban elmondható, hogy a lefordított programok kevesebb futásidejű memóriát igényelnek. Mivel a teljes forráskódot előre gépi olvasásra alakítják át, kevesebb munkát adnak a CPU-nak. Ez ellentétben áll a tolmácsokkal, amelyek csak futásidőben fordítják le a kódot.
Programozási nyelv támogatás
A tolmácsnak és a fordítónak tisztességes része van programozási nyelv elosztása. Néhány népszerű lefordított nyelv a C, C#, Rust és Golang. Az értelmezett nyelvek is népszerűek, köztük a Python, a JavaScript és a PHP.
Több programozó inkább az értelmezett nyelveket részesíti előnyben. Míg a JavaScript és a Python tolmácsokat használ, összességében ezek a két legkeresettebb nyelvek 2023-as Stack Overflow fejlesztői felmérés. A Rust és a C# az ötödik és hatodik helyen álló csoportokat képviseli.
Ahol az értelmezett nyelvek ragyognak
A tolmácsok ezeken a területeken ragyognak:
- Könnyű hibakövetést tesznek lehetővé, mivel az értelmező minden kódsort külön hajt végre.
- Az értelmezett nyelvekkel gyakran gyorsabb egy minimális életképes termék elérése korábban, mivel ezek szintaxisa kevésbé bonyolult a lefordított nyelvekhez képest.
- A statikusan tipizált fordított nyelvekkel ellentétben az értelmezett nyelvek dinamikus gépelést használnak, csökkentve a kód bonyolultságát és javítva az olvashatóságot.
Ahol a fordított nyelvek nyernek
Mi a helyzet a fordítókkal? Íme néhány szempont, amiben a nyelvük bizonyos erősséget mutat:
- A lefordított nyelvek általában gyorsabban futnak le, és kevesebb futásidejű memóriát igényelnek, mivel a kódfordítás csak egyszer történik előre.
- A fordítás utáni végrehajtás segít a hiba korai felismerésében. A fordító biztosítja, hogy a központi telepítés sikertelen legyen, ha hiba történik. Ez jobb, mint a hibák elkapása futás közben.
- Bár statikusan írják, a lefordított nyelvek egyértelműen meghatározzák a változók és a függvények szándékait, így dokumentáltabbak.
A megfelelő fordító kiválasztása projektjéhez
Amint láthattad, a fordítónak és a tolmácsnak megvannak a saját területei, ahol kiemelkednek. Míg egyes programozók azt állítják, hogy a lefordított nyelvek összességében gyorsabbak és jobbak, mások azzal érvelnek, hogy a teljesítmény a kódszerkezettől és a platformtól függ.
De még ennél is fontosabb, hogy a fordító kiválasztása a technikai mechanizmusokon kívül számos más tényezőtől is függjön. A tanulás könnyedsége, a közösség és a projekt szándéka azon tényezők közé tartozik, amelyeket figyelembe kell venni az értelmezett és a lefordított nyelvek közötti választás során.