Mi az a fordítóterv? Típusok, Építőeszközök, Példa
⚡ Okos összefoglaló
A fordítóprogram fázisai leírják a forráskód gépi kóddá alakításának hat szakaszát: lexikális elemzés, szintaxiselemzés, szemantikai elemzés, köztes kódgenerálás, kódoptimalizálás és kódgenerálás, amelyet a szimbólumtábla-kezelés és a hibakezelés támogat.
Melyek a fordítótervezés fázisai?
A fordítóprogram különböző fázisokban működik, és minden fázis átalakítja a forrásprogramot az egyik reprezentációból a másikba. Minden fázis bemeneteket vesz az előző fázisból, és kimenetét a fordítóprogram következő fázisába továbbítja. Egy fordítóprogramban 6 fázis van. Ezen fázisok mindegyike segít a magas szintű nyelv gépi kóddá alakítá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
- Code optimalizáló
- Code generátor
A fordító fázisai
Mindezek a fázisok a forráskódot tokenekre osztásával, elemzési fák létrehozásával és a forráskód különböző fázisokon keresztüli optimalizálásával konvertálják.
1. fázis: Lexikai elemzés
A lexikális elemzés az első fázis, amikor a fordítóprogram beolvassa a forráskódot. Ez a folyamat balról jobbra haladhat karakterről karakterre, és ezeket a karaktereket tokenekbe csoportosítja.
Itt a forrásprogramból származó karakterfolyamot a tokenek azonosítása alapján értelmes sorozatokba csoportosítja. A megfelelő tokenek bevitele a szimbólumtáblába, majd a token átadása a következő fázisnak.
Ennek a fázisnak az elsődleges funkciói:
- Azonosítsa a lexikai egységeket a forráskódban.
- A lexikai egységeket osztályokba sorolhatja, például konstansok vagy foglalt szavak, és külön táblázatokba helyezheti. A forrásprogramban a megjegyzéseket figyelmen kívül hagyja.
- Azonosítson egy olyan tokent, amely nem része a nyelvnek.
Példa: x = y + 10
| Jelképes | típus |
|---|---|
| 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 szintaxisanalízis lényege a kód szerkezetének feltárása. Meghatározza, hogy a szöveg követi-e a várt formátumot. Ennek a fázisnak a fő célja annak biztosítása, hogy a programozó által írt forráskód helyes-e vagy sem.
A szintaxisanalízis az adott programozási nyelv szabályain alapul, tokenek segítségével felépíti az elemzési fát. Meghatározza a forrásnyelv szerkezetét, valamint a nyelv nyelvtanát vagy szintaxisát is.
Íme egy lista az ebben a fázisban elvégzendő feladatokról:
- Tokenek beszerzése a lexikai analizátorból.
- Ellenőrizd, hogy a kifejezés szintaktikailag helyes-e vagy sem.
- Jelentse az összes szintaktikai hibát.
- Hozz létre egy hierarchikus struktúrát, amelyet elemzési fának nevezünk.
Példa
Bármely azonosító/szám egy kifejezés. Ha x egy azonosító és y+10 egy kifejezés, akkor x = y+10 egy utasítás. Tekintsük a következő példa elemzési fáját:
(a+b)*c
Az Elemzőfában:
- Belső csomópont: rekord egy operátormezővel és két gyermekmezővel.
- Levél: legalább 2 mezőt tartalmazó rekordok; egy a tokenhez és a tokenről szóló egyéb információkhoz.
- Győződjön meg arról, hogy a program elemei értelmesen illeszkednek egymáshoz.
- Típusinformációkat gyűjt és ellenőrzi a típusok kompatibilitását.
- 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 Analyzer 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 szemantikai elemzési fázis funkciói a következők:
- Segít a begyűjtött típusinformációk tárolásában és mentésében a szimbólumtáblázatban vagy a szintaxisfában.
- Lehetővé teszi a típusellenőrzés végrehajtását.
- Típuseltérés esetén, ahol nincsenek olyan 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ípusok kompatibilitását.
- 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 szemantikus analizátor a 30-as egész számot 30.0 lebegőpontos számmá alakítja a szorzás előtt.
4. fázis: Középhaladó Code Generáció
Miután a szemantikai elemzési fázis véget ért, a fordítóprogram köztes kódot generál a célgép számára. Ez egy programot reprezentál valamilyen abszolút értékre.tract gép.
A köztes szintű kód a magas szintű és a gépi szintű nyelv között helyezkedik el. Ezt a köztes szintű kódot úgy kell generálni, hogy könnyen lefordítható legyen a célgépi kódra.
Köztes szintű funkciók Code generáció:
- A forrásprogram szemantikai reprezentációjából kell generálni.
- A fordítási folyamat során kiszámított értékeket tárolja.
- Segít a köztes kód célnyelvre fordításában.
- Lehetővé teszi a forrásnyelv precedencia 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 címkód módszerrel írt köztes kód a következő:
t1 := int_to_float(5)
t2 := rate * t1
t3 := count + t2
total := t3
5 fázis: Code Optimalizálás
A következő fázis a köztes kód optimalizálása. Ez a fázis eltávolítja a felesleges kódsorokat, és úgy rendezi az utasítások sorrendjét, hogy felgyorsítsa a program végrehajtását az erőforrások pazarlása nélkül. A fázis fő célja a köztes kód fejlesztése, hogy gyorsabban futó és kevesebb helyet foglaló kódot generáljon.
Ennek a fázisnak az elsődleges funkciói:
- Segít kompromisszumot teremteni a végrehajtás és a fordítási sebesség között.
- Javítja a célprogram futási idejét.
- Leegyszerűsített kódot generál, még mindig köztes reprezentációban.
- Elérhetetlen kód eltávolítása és a nem használt változóktól való megszabadulás.
- A változatlan 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: Code Generáció
Code A generálás a fordítóprogram utolsó és egyben befejező fázisa. A kódoptimalizálási fázisból kap bemeneteket, é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 áthelyezhető gépi kód generálása.
Emellett memóriahelyeket foglal le a változók számára. A köztes kódban található utasításokat gépi utasításokká alakítja. Ez a fázis konvertálja az optimalizált vagy köztes kódot a célnyelvre.
A célnyelv a gépi kód. Ezért ebben a fázisban kerül kiválasztásra és kiosztásra az összes memóriahely és regiszter. Az ebben a fázisban generált kód végrehajtásra kerül, bemeneteket fogad és várt kimeneteket generál.
Példa
Az a = b + 60.0 valószínűleg a következőképpen fordítható le regiszterekre:
MOVF a, R1 MULF #60.0, R2 ADDF R1, R2
Szimbólum táblázat kezelése
Egy szimbólumtábla minden azonosítóhoz tartalmaz egy rekordot, amely mezőket tartalmaz az azonosító attribútumaihoz. Ez a komponens megkönnyíti a fordító számára az azonosítórekord keresését és gyors visszakeresését. A szimbólumtábla a hatókör kezelésében is segít. A szimbólumtábla és a hibakezelő kölcsönhatásba lép az összes fázissal, és a szimbólumtábla ennek megfelelően frissül.
Hibakezelési rutin
A fordítóprogram tervezési folyamata során az alábbi fázisokban hibák léphetnek fel:
- Lexikai analizátor: Helytelenül írt tokenek.
- Szintaxis analizátor: Hiányzó zárójel.
- Köztes kódgenerátor: Egy operátor operandusai nem egyeznek.
- Code Optimalizáló: Amikor az állítás nem érhető el.
- Code Generator: Amikor a memória megtelt, vagy a megfelelő regiszterek nincsenek lefoglalva.
- Szimbólumtáblázatok: Több deklarált azonosító hibája.
A leggyakoribb hibák az érvénytelen karaktersorozatok a szkennelés során, az érvénytelen tokensorozatok a típusban, a hatókörhiba és a szemantikai elemzés során elkövetett elemzés.
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ása érdekében. Ezeket a hibákat jelenteni kell a hibakezelőnek, amely kezeli a hibát a fordítási folyamat végrehajtásához. A hibákat általában üzenet formájában jelentik.



