A fordító fázisai példával: Fordítási folyamat és lépések
Melyek a fordítótervezés fázisai?
fordítóprogram különböző fázisokban működik, mindegyik fázis átalakítja a forrásprogramot egyik reprezentációból a másikba. Minden fázis bemeneteket vesz az előző szakaszából, és a kimenetét a fordító következő fázisába táplálja.
A fordítóprogramban 6 fázis van. Ezen fázisok mindegyike segít a magas szintű nyelv gépi kódjának konvertálásában. A fordítóprogram fázisai a következők:
- Lexikai elemzés
- Szintaxis elemzés
- Szemantikai elemzés
- Köztes kódgenerátor
- Kódoptimalizáló
- Kódgenerátor

Mindezek a fázisok átalakítják a forráskódot tokenekre való felosztással, elemzési fák létrehozásával és a forráskód különböző fázisokkal történő optimalizálásával.
1. fázis: Lexikai elemzés
A Lexical Analysis az első fázis, amikor a fordító beolvassa a forráskódot. Ez a folyamat karakterenként balról jobbra mozgatható, és ezeket a karaktereket tokenekbe csoportosíthatja.
Itt a forrásprogramból származó karakterfolyam értelmes sorozatokba van csoportosítva a tokenek azonosításával. Beírja a megfelelő jegyeket a szimbólumtáblázatba, és átadja a tokent a következő fázisnak.
Ennek a fázisnak az elsődleges funkciói:
- Azonosítsa a lexikai egységeket a forráskódban
- Osztályozza a lexikai egységeket osztályokba, például konstansokba, fenntartott szavakba, és írja be őket különböző táblázatokba. Figyelmen kívül hagyja a forrásprogram megjegyzéseit
- Azonosítsa a tokent, amely nem része a nyelvnek
Példa:
x = y + 10
tokenek
X | azonosító |
= | Hozzárendelés operátor |
Y | azonosító |
+ | Összeadás operátor |
10 | Szám |
2. fázis: Szintaxis elemzés
A szintaktikai elemzés a kód szerkezetének feltárásáról szól. Meghatározza, hogy egy szöveg az elvárt formátumot követi-e vagy sem. Ennek a fázisnak a fő célja annak ellenőrzése, hogy a programozó által írt forráskód helyes-e vagy sem.
A szintaktikai elemzés az adott programozási nyelven alapuló szabályokon alapul, az értelmező fa tokenek segítségével történő felépítésével. Meghatározza a forrásnyelv szerkezetét és a nyelv nyelvtanát vagy szintaxisát is.
Itt található az ebben a fázisban elvégzett feladatok listája:
- Szerezzen be tokeneket a lexikális elemzőből
- Ellenőrzi, hogy a kifejezés szintaktikailag helyes-e vagy sem
- Jelentse az összes szintaktikai hibát
- Hozzon létre egy hierarchikus struktúrát, amelyet elemzőfának nevezünk
Példa
Bármely azonosító/szám kifejezés
Ha x egy azonosító és y+10 egy kifejezés, akkor x= y+10 egy utasítás.
Tekintsük az elemzési fát a következő példához
(a+b)*c
Az Elemzőfában
- Belső csomópont: rögzítés egy operátorral és két fájl gyerekeknek
- Leaf: rekordok 2/több mezővel; egy a tokenhez és a tokenhez kapcsolódó egyéb információkhoz
- Győződjön meg arról, hogy a program összetevői értelmesen illeszkednek egymáshoz
- Típusinformációkat gyűjt és ellenőrzi a típuskompatibilitást
- Az ellenőrző operandusokat a forrásnyelv engedélyezi
3. fázis: Szemantikai elemzés
A szemantikai elemzés ellenőrzi a kód szemantikai konzisztenciáját. Az előző fázis szintaxisfáját és a szimbólumtáblázatot használja annak ellenőrzésére, hogy az adott forráskód szemantikailag konzisztens-e. Azt is ellenőrzi, hogy a kód megfelelő jelentést közvetít-e.
A Szemantikus Analizátor ellenőrzi a típus-eltéréseket, az inkompatibilis operandusokat, a nem megfelelő argumentumokkal meghívott függvényeket, a nem deklarált változókat stb.
A szemantikus elemzési fázis funkciói a következők:
- Segít tárolni az összegyűjtött típusinformációkat és elmenteni azokat szimbólumtáblázatba vagy szintaktikai fába
- Lehetővé teszi a típusellenőrzés végrehajtását
- Típushiba esetén, ahol nincsenek pontos típusjavítási szabályok, amelyek kielégítik a kívánt műveletet, szemantikai hiba jelenik meg
- Típusinformációkat gyűjt, és ellenőrzi a típuskompatibilitást
- Ellenőrzi, hogy a forrásnyelv engedélyezi-e az operandusokat vagy sem
Példa
float x = 20.2; float y = x*30;
A fenti kódban a szemantikai elemző a 30-as egész számot 30.0-ra írja le a szorzás előtt
4. fázis: Köztes kódgenerálás
Amint a szemantikai elemzési fázis véget ért, a fordító köztes kódot generál a célgép számára. Ez egy program valamilyen absztrakt géphez.
A köztes kód a magas szintű és a gépi szintű nyelv között található. Ezt a köztes kódot úgy kell előállítani, hogy könnyen lefordítható legyen a célgépi kódra.
A közbenső kódgenerálás funkciói:
- A forrásprogram szemantikai reprezentációjából kell előállítani
- A fordítási folyamat során kiszámított értékeket tárolja
- Segít lefordítani a köztes kódot célnyelvre
- Lehetővé teszi a forrásnyelv elsőbbségi sorrendjének fenntartását
- Az utasítás megfelelő számú operandusát tartalmazza
Példa
Például,
total = count + rate * 5
A köztes kód a címkód módszer segítségével:
t1 := int_to_float(5) t2 := rate * t1 t3 := count + t2 total := t3
5. fázis: Kódoptimalizálás
A következő fázis a kódoptimalizálás vagy a köztes kód. Ez a fázis eltávolítja a felesleges kódsorokat, és úgy rendezi el az utasítások sorrendjét, hogy erőforrások pazarlása nélkül felgyorsítsa a program végrehajtását. Ennek a fázisnak a fő célja a közbenső kód fejlesztése, hogy gyorsabban futhasson és kevesebb helyet foglaljon el.
Ennek a fázisnak az elsődleges funkciói:
- Segít megtalálni a kompromisszumot a végrehajtás és a fordítási sebesség között
- Javítja a célprogram futási idejét
- Áramvonalas kódot generál még közbenső ábrázolásban
- Az elérhetetlen kód eltávolítása és a nem használt változók eltávolítása
- A nem módosított utasítások eltávolítása a ciklusból
Példa:
Vegye figyelembe a következő kódot
a = intofloat(10) b = c * a d = e + b f = d
Válhat
b =c * 10.0 f = e+b
6. fázis: Kódgenerálás
A kódgenerálás a fordító utolsó és utolsó fázisa. Bemeneteket kap a kódoptimalizálási fázisokból, és ennek eredményeként állítja elő az oldalkódot vagy az objektumkódot. Ennek a fázisnak a célja a tárhely lefoglalása és az áthelyezhető gépi kód generálása.
Ezenkívül memóriahelyeket foglal le a változó számára. A köztes kód utasításai gépi utasításokká alakulnak. Ez a fázis az optimalizáló vagy köztes kódot a célnyelvre takarja.
A célnyelv a gépi kód. Ezért ebben a fázisban az összes memóriahely és regiszter is kiválasztásra és kiosztásra kerül. Az ebben a fázisban generált kód a bemenetek fogadására és a várt kimenetek generálására kerül végrehajtásra.
Példa
a = b + 60.0
Esetleg regiszterekre fordítják.
MOVF a, R1 MULF #60.0, R2 ADDF R1, R2
Szimbólum táblázat kezelése
A szimbólumtábla minden azonosítóhoz tartalmaz egy rekordot az azonosító attribútumainak mezőivel. Ez az összetevő megkönnyíti a fordító számára az azonosító rekordban való keresést és annak gyors visszakeresését. A szimbólumtábla a hatókör kezelésében is segítséget nyújt. A szimbólumtábla és a hibakezelő kölcsönhatásba lép az összes fázissal, és ennek megfelelően frissíti a szimbólumtáblázatot.
Hibakezelési rutin
A fordító tervezési folyamatában hiba fordulhat elő az alábbiakban megadott valamennyi fázisban:
- Lexikai elemző: Rosszul írt tokenek
- Szintaxiselemző: Hiányzik a zárójel
- Köztes kódgenerátor: Nem illeszkedő operandusok egy operátorhoz
- Kódoptimalizáló: Ha az utasítás nem érhető el
- Kód Generator: Ha a memória megtelt vagy a megfelelő regiszterek nincsenek lefoglalva
- Szimbólumtáblák: Több deklarált azonosító hibája
A leggyakoribb hibák az érvénytelen karaktersorozatok a vizsgálat során, az érvénytelen token sorozatok típusában, a hatókör hiba és az elemzés a szemantikai elemzésben.
A hiba a fenti fázisok bármelyikében előfordulhat. A hibák megtalálása után a fázisnak foglalkoznia kell a hibákkal a fordítási folyamat folytatásához. Ezeket a hibákat jelenteni kell a hibakezelőnek, amely a hibát kezeli a fordítási folyamat végrehajtásához. Általában a hibákat üzenet formájában jelentik.
Összegzésként
- A fordító több fázisban működik, minden fázis átalakítja a forrásprogramot egyik reprezentációból a másikba
- Hat fázisa fordító tervezés 1) Lexikai elemzés 2) Szintaktikai elemzés 3) Szemantikai elemzés 4) Köztes kódgenerátor 5) Kódoptimalizáló 6) Kód Generator
- A Lexical Analysis az első fázis, amikor a fordító beolvassa a forráskódot
- A szintaktikai elemzés a szöveg szerkezetének felfedezéséről szól
- A szemantikai elemzés ellenőrzi a kód szemantikai konzisztenciáját
- Miután a szemantikai elemzési fázis véget ért a fordítón, generáljon köztes kódot a célgép számára
- A kódoptimalizálási fázis eltávolítja a felesleges kódsorokat, és rendezi az utasítások sorrendjét
- A kódgenerálási fázis bemeneteket kap a kódoptimalizálási fázisból, és ennek eredményeként előállítja az oldalkódot vagy az objektumkódot
- A szimbólumtábla minden azonosítóhoz tartalmaz egy rekordot az azonosító attribútumainak mezőivel
- A hibakezelési rutin számos fázisban kezeli a hibákat és a jelentéseket