A számítástechnika , a fordító egy programot , amely átalakítja a forráskódot a tárgykód . Általában a forráskód programozási nyelven (a forrásnyelven ) íródott , magas szintű absztrakcióval rendelkezik , és az emberek számára könnyen érthető. Az objektumkódot általában egy alacsonyabb szintű nyelven (ún. Célnyelv ) írják , például egy összeállítási vagy gépi nyelven , egy gép által futtatható program létrehozása érdekében .
A fordító a következő műveleteket hajtja végre: lexikai elemzés , előfeldolgozás ( előfeldolgozás ), szintaktikai elemzés ( elemzés ), szemantikai elemzés és optimalizált kódgenerálás . Az összeállítást gyakran egy link szerkesztési lépés követi egy futtatható fájl létrehozása érdekében. Amikor a lefordított programot (objektumkód) egy olyan számítógépen futtatják, amelynek processzora vagy operációs rendszere eltér a fordítójától, keresztkompilációnak nevezzük .
Két összeállítási lehetőség van:
a megfelelő szerelési kódot
a program fordítás után - a gépi nyelv hexadecimális formában jelenik meg
A korai számítógépes szoftvereket összeállítási nyelven írták . A legmagasabb szintű programozási nyelveket ( absztrakciós rétegekben ) csak addig találták ki, amíg a szoftverek új típusú felhasználásának előnyei a különféle típusú processzorokon nem lettek fontosabbak, mint a fordítónak való írás költségei. A korai számítógépek nagyon korlátozott memóriakapacitása számos technikai problémát vetett fel a fordítók fejlesztésében is.
Az ötvenes évek végén először jelentek meg a gépfüggetlen programozási nyelvek. Ezt követően számos kísérleti fordítót fejlesztenek ki. Az első fordító, A-0 rendszer (az A-0 nyelv) írta Grace Hopper 1952 FORTRAN csapat által vezetett John Backus az IBM úgy vélik, hogy kifejlesztette az első teljes fordítóprogram 1957 COBOL kifejlesztett 1959 és nagyrészt Grace Hopper elképzelésein alapul, ez az első nyelv, amelyet több architektúrán állítottak össze.
Számos alkalmazási területen Gyorsan elterjedt az a gondolat, hogy magasabb szintű absztrakcióval rendelkező nyelvet kell használni. Az újabb programozási nyelvek által támogatott funkcionalitás növekedésével és a számítógépes architektúra egyre összetettebbé válásával a fordítók egyre összetettebbé váltak.
1962 -ben Tim Hart és Mike Levin hozta létre a Massachusettsi Műszaki Intézetben (MIT) az első " önállóan üzemeltetett " fordítót - amely objektumkódokká, a saját forráskódját magas szintű nyelven kifejezve - össze tudja állítani . Kezdve az 1970-es vált, nagyon gyakori, hogy dolgozzon ki egy fordítóprogram a nyelvet úgy tervezték, hogy lefordítani, hogy Pascal és C nagyon népszerű fejlesztési nyelveket.
Használhatunk a fordítók fejlesztésére szakosodott nyelvet vagy környezetet is: meta-fordító eszközök alatt beszélünk, és például fordító fordítót használunk . Ez a módszer különösen hasznos egy új nyelv első fordítójának elkészítéséhez; az adaptált és szigorú nyelv megkönnyíti a fejlődést és az evolúciót.
A fordító fő feladata a számítógépen futó helyes objektumkód előállítása. A legtöbb fordító lehetővé teszi a kód optimalizálását, vagyis megpróbálja javítani a végrehajtás sebességét, vagy csökkenteni fogja a program memóriafoglalását.
A forrásnyelv általában "magasabb szintű", mint a célnyelv, vagyis magasabb szintű absztrakciót mutat be. Ezenkívül a program forráskódját általában több fájlban terjesztik.
A fordító elemzés-szintézis útján működik: ahelyett, hogy a forrásnyelv minden egyes konstrukcióját a célnyelvi konstrukciók egyenértékű sorozatával helyettesítené, a forrásszöveg elemzésével kezdi, hogy felépítsen egy köztes ábrázolást , amelyet viszont lefordít a célnyelven. .
A fordító legalább két részre oszlik: egy elülső (vagy elülső) részre, amelyet néha „csonknak” is neveznek, amely elolvassa a forrásszöveget, és előállítja a köztes ábrázolást; és egy hátsó (vagy végi) részt, amely ezen az ábrázoláson halad át a célszöveg előállításához. Egy ideális fordítóban az elülső rész független a célnyelvtől, míg a hátsó rész független a forrásnyelvtől. Egyes fordítók jelentős feldolgozást végeznek a köztes részen, önmagában központi részsé válva, függetlenül a forrásnyelvtől és a célgéptől is. Így fordítókat írhatunk a nyelvek és architektúrák egész sorára a központi rész megosztásával, amelyhez nyelvenként egy elülső részt, architektúránként pedig egy hátsó részt csatolunk.
Az összeállítás szakaszai a következők:
A lexikai, a szintaktikai és a szemantikai elemzés, a közbenső nyelveken való áthaladás és az optimalizálás alkotják az elülső részt. A kódgenerálás és a linkelés az utolsó rész.
Ezek a különböző lépések azt jelentik, hogy a fordítók még mindig a kutatás tárgyát képezik.
A programozási nyelv megvalósítása (konkrét megvalósítása) értelmezhető vagy összeállítható. Ez a megvalósítás fordító vagy tolmács , és egy programozási nyelv lefordíthatja az egyik megvalósítást, a másik pedig értelmezhető.
Összeállításról beszélünk, ha a fordítás a végrehajtás előtt történik (a hurok elvét ezután egyszer lefordítják), és az értelmezésről, ha a fordítás lépésről lépésre befejeződik a végrehajtás során (a ciklus elemeit ezután minden felhasználásnál megvizsgáljuk) .
Az értelmezés hasznos a hibakereséshez, vagy ha az erőforrások korlátozottak. Az összeállítás előnyösebb a működés során.
Az első fordítókat közvetlenül összeállítási nyelven írták , egy elemi szimbolikus nyelvet, amely megfelel a célprocesszor utasításainak és néhány kissé fejlettebb vezérlő struktúrának. Ezt a szimbolikus nyelvet össze kell állítani (nem össze kell állítani) és össze kell kapcsolni, hogy futtatható verziót kapjon. Az egyszerűsége miatt elég egy egyszerű program, hogy gépi utasításokká alakítsa át.
A jelenlegi fordítók általában azon a nyelven íródnak, amelyet össze akarnak állítani; például egy C fordítót írunk C-ben, SmallTalk-ot a SmallTalk-ban, Lisp-t Lisp-ben stb. A fordító megvalósításakor döntő lépés történik, amikor az X nyelv fordítója eléggé teljes ahhoz, hogy össze tudja állítani önmagát: akkor ez már nem függ egy másik gyártandó nyelvtől (még az összeállítótól sem).
Nehéz észrevenni a fordító hibáját. Például, ha egy C fordítónak van hibája, a C programozók természetesen inkább a saját forráskódjukat fogják megkérdőjelezni, nem pedig a fordítót. Rosszabb esetben, ha ez a hibás fordító (V1 verzió) nem hibás fordítót (V2 verzió) fordít, akkor a V2 fordító lefordított (V1 által) lefuttatható hibája lehet. Mégis jó a forráskódja. A bootstrap ezért megköveteli, hogy a fordítók programozói megkerüljék a meglévő fordítók hibáit.
A fordítók besorolását az átmenetek száma alapján a számítógépek hardveres erőforrásainak hiánya okozza. Az összeállítás drága folyamat, és a korai számítógépek nem rendelkeztek elegendő memóriával egy olyan program megtartásához, amelynek ezt a munkát el kellett végeznie. A fordítókat így olyan alprogramokra osztották, amelyek mindegyike a forrásból olvasott a lexikai elemzés , az elemzés és a szemantikai elemzés különféle fázisainak befejezéséhez .
Előnynek tekintették azt a képességet, hogy mindent egyetlen lépésben egyesítsenek, mivel leegyszerűsíti a fordító írását, amely általában gyorsabban fut, mint egy többutas fordító. Így a korai rendszerek korlátozott erőforrásai miatt sok nyelvet kifejezetten úgy terveztek, hogy egyetlen menetben összeállíthatók legyenek (pl. A Pascal nyelv ).
A program nemlineáris felépítéseBizonyos esetekben a nyelvnek ez vagy az a tulajdonsága megköveteli, hogy a fordító egynél több menetet hajtson végre. Vegyünk például egy olyan állítást a forrás 20. sorában , amely befolyásolja egy állítás fordítását a 10. soron . Ebben az esetben az első lépésnek információkat kell gyűjtenie a nyilatkozatokról, míg a tényleges fordításra csak egy későbbi átadás során kerül sor.
OptimalizálásA fordítók kis programokra bontása a hatékony fordítók gyártásában érdekelt kutatók által alkalmazott technika. Az egyutas fordítás hátránya ugyanis az, hogy nem teszi lehetővé a jó minőségű kód létrehozásához szükséges kifinomult optimalizálások nagy részét. Ezután nehéz lesz pontosan megszámolni az optimalizáló fordító által elvégzett menetszámot.
A korrekciós demonstráció felosztásaA kis programok sorozatának helyességének bemutatása gyakran kevesebb erőfeszítést igényel, mint egy ezzel egyenértékű, nagyobb egyedi program helyességének bemutatása.
A fordító fordító olyan program, amely a fordító bármely részét vagy egészét képes létrehozni. Összeállíthatja például egy nyelv alapjait, majd a többit összeállíthatja a nyelv alapjaival.
A felhasználástól és a programot futtató géptől függően érdemes optimalizálnia a végrehajtás sebességét, a memória elfoglalását, az energiafogyasztást, a más architektúrákba való hordozhatóságot vagy a fordítási időt.
A keresztkompiláció olyan fordítási láncokra utal, amelyek képesek a forráskódot olyan objektumkódra fordítani, amelynek processzorarchitektúrája eltér a fordítás végrehajtásától. Ezeket a láncokat főleg ipari informatikában és beágyazott rendszerekben használják .
Egyes fordítók egy forrásnyelvet lefordítanak virtuális gép nyelvére (úgynevezett köztes nyelvre), vagyis a virtuális gép által végrehajtott kódra (általában bináris) : a számítógép fő funkcióit utánzó programra. Az ilyen nyelveket állítólag félig összeállítják. A program portálása tehát csak a virtuális gép portolását igényli, amely valójában akár tolmács, akár második fordító lesz (többcélú fordítók számára). Így fordítóprogramok lefordítani Pascal be P-kód, Modula 2 be M-kód, Simula az S-kódot, vagy újabban a Java kódot a Java bytecode (object code).
Rövid program Scalában.
A kapott Java bájtkód, futtatható a virtuális gépen.
Amikor az összeállítás bájtkódra épül, menet közben beszélünk a fordításról . Ezután virtuális gépeket használnak, például a Java virtuális gépet , amellyel a Scalát nevezetesen össze tudjuk fordítani . Bizonyos nyelveken lehetséges olyan könyvtár használata, amely lehetővé teszi a felhasználó által beírt kód on-the-fly összeállítását, például C-ben libtcc-vel.
Más fordítók lefordítják a kódokat egyik programozási nyelvről a másikra. Transzkompilátoroknak , vagy akár az anglikizmusnak nevezik őket , transzpilereknek vagy transzpilátoroknak. Például a LaTeX szoftver lehetővé teszi, hogy a LaTeX forráskódjából PDF- fájlokat (például Ubuntu alatt a pdflatex parancsot ) vagy HTML- fájlokat nyerjen . Egy másik példa: az LLVM egy fordítóprogramok létrehozását segítő könyvtár, amelyet az AMD is használ a "HIP" kifejlesztésére, egy CUDA kód transzkompilátorra (NVIDIA-specifikus nyelv és széles körben használatos), hogy az AMD grafikus processzorokon fusson.
A forráskód.
Az összeállítás után kapott kód.
A pdf dokumentum előnézete.
Néhány fordító inkrementálisan vagy interaktív módon fordítja a forrásprogramot (amelyet a felhasználó ad meg) gépi kódra. Példaként említhetjük a Common Lisp néhány megvalósítását (például az SBCL (en) ).