Kompilaatori faasid koos näitega: kompileerimisprotsess ja sammud
Millised on kompilaatori kujundamise etapid?
Kompilaator töötab erinevates faasides, iga faas muudab lähteprogrammi ühest esitusest teise. Iga faas võtab oma eelmise etapi sisendeid ja edastab selle väljundi kompilaatori järgmisse faasi.
Kompilaatoris on 6 faasi. Kõik need etapid aitavad kõrgetasemelist keelt masinkoodiks teisendada. Kompilaatori etapid on järgmised:
- Leksikaalne analüüs
- Süntaksi analüüs
- Semantiline analüüs
- Vahepealne koodigeneraator
- Koodi optimeerija
- Koodigeneraator

Kõik need faasid teisendavad lähtekoodi, jagades tokeniteks, luues sõelumispuud ja optimeerides lähtekoodi erinevate faaside kaupa.
1. faas: leksikaalne analüüs
Leksikaalne analüüs on esimene etapp, mil kompilaator skannib lähtekoodi. Seda protsessi saab märgihaaval vasakult paremale ja rühmitada need märgid märkidesse.
Siin on lähteprogrammi märgivoog rühmitatud tähenduslikesse jadadesse, tuvastades märgid. See sisestab vastavad piletid sümbolite tabelisse ja edastab selle märgi järgmisse faasi.
Selle etapi peamised funktsioonid on:
- Tuvastage lähtekoodi leksikaalsed üksused
- Klassifitseerige leksikaalsed üksused klassidesse, nagu konstandid, reserveeritud sõnad, ja sisestage need erinevatesse tabelitesse. See ignoreerib lähteprogrammi kommentaare
- Tuvastage märk, mis ei ole keele osa
Näide:
x = y + 10
märgid
X | tunnus |
= | Ülesandeoperaator |
Y | tunnus |
+ | Lisaoperaator |
10 | Number |
2. faas: süntaksi analüüs
Süntaksianalüüsi eesmärk on koodis struktuuri avastamine. See määrab, kas tekst järgib oodatud vormingut või mitte. Selle etapi peamine eesmärk on veenduda, et programmeerija kirjutatud lähtekood on õige või mitte.
Süntaksianalüüs põhineb konkreetsel programmeerimiskeelel põhinevatel reeglitel, konstrueerides parsipuu märkide abil. See määrab ka lähtekeele struktuuri ja keele grammatika või süntaksi.
Siin on selles etapis tehtud ülesannete loend:
- Hankige leksikaalanalüsaatorist märgid
- Kontrollib, kas väljend on süntaktiliselt õige või mitte
- Teatage kõigist süntaksivigadest
- Looge hierarhiline struktuur, mida tuntakse parsipuuna
Näide
Iga identifikaator/number on avaldis
Kui x on identifikaator ja y+10 on avaldis, siis x= y+10 on lause.
Vaatleme järgmise näite jaoks parsipuud
(a+b)*c
Parsipuus
- Sisemine sõlm: salvestage operaator ja kaks faili lastele
- Leht: kirjed 2/rohkema väljaga; üks märgi ja muu teabe jaoks märgi kohta
- Veenduge, et programmi komponendid sobiksid omavahel tähendusrikkalt
- Kogub tüübiteavet ja kontrollib tüübi ühilduvust
- Kontrolloperandid on lähtekeelega lubatud
3. faas: semantiline analüüs
Semantiline analüüs kontrollib koodi semantilist järjepidevust. See kasutab eelmise faasi süntaksipuud koos sümbolitabeliga, et kontrollida, kas antud lähtekood on semantiliselt järjepidev. Samuti kontrollib see, kas kood annab sobiva tähenduse.
Semantiline analüsaator kontrollib tüübi mittevastavust, ühildumatuid operande, valede argumentidega kutsutud funktsiooni, deklareerimata muutujat jne.
Semantiliste analüüside etapi funktsioonid on järgmised:
- Aitab kogutud tüübiteavet salvestada ja sümbolitabelisse või süntaksipuusse salvestada
- Võimaldab teha tüübikontrolli
- Tüübi mittevastavuse korral, kus puuduvad täpsed tüübiparandusreeglid, mis rahuldavad soovitud toimingut, kuvatakse semantiline viga
- Kogub tüübiteavet ja kontrollib tüübi ühilduvust
- Kontrollib, kas lähtekeel lubab operande või mitte
Näide
float x = 20.2; float y = x*30;
Ülaltoodud koodis sisestab semantiline analüsaator enne korrutamist täisarvu 30 hõljumiseks 30.0
4. faas: vahepealne koodi genereerimine
Kui semantilise analüüsi faas on läbi, genereerib kompilaator sihtmasina jaoks vahekoodi. See kujutab endast programmi mõne abstraktse masina jaoks.
Vahekood on kõrgetasemelise ja masinataseme keele vahel. See vahekood tuleb genereerida nii, et seda oleks lihtne sihtmasinkoodiks tõlkida.
Vahepealse koodi genereerimise funktsioonid:
- See tuleks genereerida lähteprogrammi semantilise esituse põhjal
- Hoiab tõlkimise käigus arvutatud väärtusi
- Aitab tõlkida vahepealset koodi sihtkeelde
- Võimaldab säilitada lähtekeele eelisjärjekorra
- See sisaldab käsu õiget operandide arvu
Näide
Näiteks
total = count + rate * 5
Vahekood aadressikoodi meetodi abil on:
t1 := int_to_float(5) t2 := rate * t1 t3 := count + t2 total := t3
5. etapp: koodi optimeerimine
Järgmine etapp on koodi optimeerimine või vahekood. See faas eemaldab mittevajaliku koodirea ja korraldab lausete jada, et kiirendada programmi täitmist ilma ressursse raiskamata. Selle etapi peamine eesmärk on täiustada vahepealset koodi, et luua kood, mis töötab kiiremini ja võtab vähem ruumi.
Selle etapi peamised funktsioonid on:
- See aitab teil luua kompromissi täitmise ja kompileerimiskiiruse vahel
- Parandab sihtprogrammi tööaega
- Loob sujuva koodi, mis on endiselt vahepealses esituses
- Kättesaamatu koodi eemaldamine ja kasutamata muutujatest vabanemine
- Avalduste eemaldamine tsüklist, mida ei muudeta
Näide:
Mõelge järgmisele koodile
a = intofloat(10) b = c * a d = e + b f = d
Võib saada
b =c * 10.0 f = e+b
6. etapp: koodi genereerimine
Koodi genereerimine on kompilaatori viimane ja viimane faas. See saab sisendeid koodi optimeerimise etappidest ja toodab selle tulemusel lehe koodi või objekti koodi. Selle etapi eesmärk on eraldada salvestusruum ja genereerida ümberpaigutatavat masinkoodi.
Samuti eraldab see muutujale mälukohad. Vahekoodis olevad juhised teisendatakse masinakäskudeks. See faas varjab optimeerimis- või vahekoodi sihtkeelde.
Sihtkeel on masinkood. Seetõttu valitakse ja eraldatakse selles etapis ka kõik mälu asukohad ja registrid. Selle faasi genereeritud kood käivitatakse sisendite saamiseks ja eeldatavate väljundite genereerimiseks.
Näide
a = b + 60.0
Tõlgitaks tõenäoliselt registritesse.
MOVF a, R1 MULF #60.0, R2 ADDF R1, R2
Sümbolitabelite haldamine
Sümbolitabel sisaldab iga identifikaatori kirjet koos identifikaatori atribuutide väljadega. See komponent hõlbustab kompilaatoril identifikaatorikirjest otsimist ja selle kiiret hankimist. Sümbolitabel aitab teid ka ulatuse haldamisel. Sümbolitabel ja veakäsitleja suhtlevad kõigi faasidega ja sümbolitabelit värskendatakse vastavalt.
Vigade käsitlemise rutiin
Kompilaatori projekteerimisprotsessis võib viga ilmneda kõigis alltoodud etappides:
- Leksikaalne analüsaator: valesti kirjutatud märgid
- Süntaksianalüsaator: sulgud puuduvad
- Vahepealne koodigeneraator: operaatori operandid ei sobi
- Koodi optimeerija: kui avaldus ei ole kättesaadav
- kood Generator: Kui mälu on täis või õigeid registreid pole eraldatud
- Sümbolitabelid: mitme deklareeritud identifikaatori viga
Kõige levinumad vead on kehtetud märgijada kontrollimisel, kehtetud märgijada tüübis, ulatuse viga ja semantilise analüüsi parsimine.
Viga võib ilmneda mis tahes ülaltoodud faasis. Pärast vigade leidmist peab etapp kompileerimisprotsessi jätkamiseks vigadega tegelema. Nendest vigadest tuleb kompileerimisprotsessi läbiviimiseks teavitada veakäsitlejat, kes veaga tegeleb. Üldjuhul teatatakse vigadest teate kujul.
kokkuvõte
- Kompilaator töötab erinevates faasides, iga faas muudab lähteprogrammi ühest esitusest teise
- Kuus faasi kompilaatori disain on 1) Leksikaalne analüüs 2) Süntaksi analüüs 3) Semantiline analüüs 4) Vahekoodi generaator 5) Koodi optimeerija 6) Kood Generator
- Leksikaalne analüüs on esimene etapp, mil kompilaator skannib lähtekoodi
- Süntaksianalüüs seisneb tekstis struktuuri avastamises
- Semantiline analüüs kontrollib koodi semantilist järjepidevust
- Kui semantilise analüüsi faas on kompilaatoriga läbi, genereerige sihtmasina jaoks vahekood
- Koodi optimeerimise faas eemaldab mittevajaliku koodirea ja korrastab lausete jada
- Koodi genereerimise faas saab sisendid koodi optimeerimise etapist ja toodab selle tulemusena lehe koodi või objekti koodi
- Sümbolitabel sisaldab iga identifikaatori kirjet koos identifikaatori atribuutide väljadega
- Vigade käsitlemise rutiin käsitleb vigu ja aruandeid paljudes faasides