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.

  • 🔤 Lexikai elemzés: A szkenner tokenekbe csoportosítja a karaktereket, és rögzíti azokat a szimbólumtáblázatban.
  • ???? Szintaxis elemzés: Az elemző ellenőrzi a nyelvtant, és tokenekből épít fel egy hierarchikus elemzési fát.
  • ✔️ Szemantikai elemzés: Ez a fázis a szintaxisfa segítségével ellenőrzi a típusok kompatibilitását és jelentését.
  • 🇧🇷 Code Generáció: A köztes kódot generálják, optimalizálják, majd végül lefordítják a célgép kódjává.
  • 📋 Támogatási rutinok: Egy szimbólumtábla és egy hibakezelő rutin kölcsönhatásba lép minden fordítási fázissal.

A fordítóprogram fázisai példával: Fordítási folyamat és lépések

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:

  1. Lexikai elemzés
  2. Szintaxis elemzés
  3. Szemantikai elemzés
  4. Köztes kódgenerátor
  5. Code optimalizáló
  6. Code generátor

A fordító fázisai

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

Példa szintaktikai elemzésre

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.

GYIK

Igen. A mesterséges intelligencia által vezérelt asszisztensek el tudják magyarázni az egyes fázisokat, trachogyan alakul a mintakód tokenekké és elemzőfákká, és rámutatnak a szintaktikai vagy szemantikai hibákra. Hasznos tanulmányi segédletek, de a magyarázatokat a tananyaggal kell összehasonlítani.

A gépi tanulás képes megjósolni, hogy mely optimalizálási lépések eredményezik a leggyorsabb kódot egy adott program és gép esetében, olyan választásokat finomítva, amelyek korábban kézzel készített heurisztikák voltak. A fordítónak továbbra is garantálnia kell, hogy az optimalizált program pontosan úgy viselkedik, mint az eredeti.

A front-end a lexikai, szintaxisi és szemantikai elemzést, valamint a köztes kódot kezeli, és a forrásnyelvtől függ. A back-end az optimalizálást és a kódgenerálást kezeli, és a célgéptől függ. Ez a felosztás leegyszerűsíti az újracélzást.

Nem. A lexikális elemzés (szkennelés) a karaktereket tokenekbe csoportosítja, míg az elemzés (szintaxisanalízis) ezeket a tokeneket egy elemzési fába rendezi a nyelvtani szabályok szerint. A lexikális elemzés először lefut, és a tokenjeit az elemzőnek adja át.

Foglald össze ezt a bejegyzést a következőképpen: