A fordítóprogram egy program ami lefordítja az emberi olvashatóságot forráskód a számítógéppel végrehajtható gépi kódba. Ennek sikeres elvégzéséhez az emberi olvashatóságnak megfelelő kódnak meg kell felelnie a szintaxis annak a programozási nyelvnek a szabályai, amelybe be van írva. A fordító csak egy program, és nem tudja megjavítani a kódját az Ön számára. Ha hibát követett el, ki kell javítania a szintaxist, különben nem fordul elő.
Mi történik, ha összeállítja a kódot?
A fordító összetettsége a nyelv szintaxisától és az absztrakció mennyiségétől függ az a programozási nyelv rendelkezik. A C fordító sokkal egyszerűbb, mint a C ++ vagy a C # fordító.
Lexikális elemzés
A fordítás során a fordító először beolvassa a karakterfolyamot a forráskódfájlból, és lexikai tokenekből áll. Például a C ++ kód:
int C = (A * B) +10;
lehet elemezni, mivel ezek a tokenek:
- gépelés
- "C" változó
- egyenlők
- leftbracket
- "A" változó
- alkalommal
- "B" változó
- rightbracket
- plusz
- szó szerint "10"
Szintaktikai elemzés
A lexikai kimenet a fordító szintaktikai elemző részére kerül, amely a nyelvtani szabályok alapján dönt arról, hogy a bemenet érvényes-e vagy sem. Hacsak
változók Az A és B korábban bejelentették és hatályukat megtették, a fordító azt mondhatja:- „A”: be nem jelentett azonosító.
Ha bejelentették, de nem inicializálták. a fordító figyelmeztet:
- az „A” helyi változó inicializálása nélkül használható.
Soha ne hagyja figyelmen kívül a fordító figyelmeztetéseit. Fura és váratlan módon megtörheti a kódot. Mindig javítson a fordító figyelmeztetésein.
Egy vagy kettő?
Néhány programozási nyelv úgy van megírva, hogy a fordító csak egyszer tudja elolvasni a forráskódot, és elkészíti a gépi kódot. Pascal az egyik ilyen nyelv. Sok fordítóprogramok legalább két lépés szükséges. Időnként ez a következő: funkciók vagy osztályok.
A C ++ kategóriában az osztály deklarálható, de csak később határozható meg. A fordító nem tudja kiszámítani, mennyi memóriára van szüksége az osztálynak, amíg össze nem állítja az osztály testét. A megfelelő gépi kód előállítása előtt újra kell olvasnia a forráskódot.
Gépi kód generálása
Feltételezve, hogy a fordító sikeresen befejezi a lexikai és szintaktikai elemzéseket, az utolsó szakasz gépi kód generálása. Ez egy bonyolult folyamat, különösen a modern CPU-k esetén.
Az összeállított sebesség végrehajtható A kódnak a lehető leggyorsabbnak kell lennie, és óriási mértékben változhat a létrehozott kód minőségétől és az igényelt optimalizálás mértékétől függően.
A legtöbb fordító lehetővé teszi az optimalizálás összegének meghatározását - általában a gyors hibakeresési fordítók és a kiadott kód teljes optimalizálása szempontjából ismert.
Kódgenerálás kihívást jelent
A fordító írónak kihívásokkal kell szembenéznie, amikor kódgenerátort ír. Sok processzor felgyorsítja a feldolgozást a használatával
- Utasítás csővezeték
- Belső cache.
Ha az összes utasítás egy kódon belül van hurok lehet tartani a processzor gyorsítótár, akkor ez a hurok sokkal gyorsabban fut, mint amikor a CPU-nak utasításokat kell lehívnia a fő RAM-ból. A CPU gyorsítótár a CPU chipbe beépített memóriablokk, amelyhez sokkal gyorsabban lehet hozzáférni, mint a fő RAM memória adataihoz.
Gyorsítótárak és sorok
A legtöbb CPU-nak előzetes letöltési sora van, ahol a CPU az utasításokat beolvassa a gyorsítótárba, mielőtt végrehajtja őket. Feltételes ág esetén a CPU-nak újratöltenie kell a sort. A kód minimalizálása érdekében el kell generálni a kódot.
Számos CPU-nak külön része van a következőkre:
- Egész számtani (egész számok)
- Lebegőpontos számtani (törtszámok)
Ezek a műveletek gyakran párhuzamosan futhatnak a sebesség növelése érdekében.
A fordítók általában gépi kódot generálnak objektum fájlokba, amelyek akkor vannak összekapcsolt együtt egy linker programmal.