Kompilaatori etapid koos näite, protsessi ja sammudega
⚡ Nutikas kokkuvõte
Kompilaatori faasid kirjeldavad, kuidas kompilaator teisendab lähtekoodi masinkoodiks kuue etapi kaudu: leksikaalne analüüs, süntaksianalüüs, semantiline analüüs, vahekoodi genereerimine, koodi optimeerimine ja koodi genereerimine, mida toetavad sümbolitabelite haldus ja veakäsitlus.

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
- Code optimeerija
- Code generaator

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. etapp: kesktase Code Põlvkond
Kui semantilise analüüsi etapp on läbi, genereerib kompilaator sihtmasina jaoks vahekoodi. See esindab programmi mingisuguse absoluutse väärtuse jaoks.tract-masin.
Vahekood on kõrgetasemelise ja masinataseme keele vahel. See vahekood tuleb genereerida nii, et seda oleks lihtne sihtmasinkoodiks tõlkida.
Keskmise taseme funktsioonid Code põlvkond:
- 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: Code 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: Code Põlvkond
Code Genereerimine on kompilaatori viimane ja lõplik etapp. See saab sisendi koodi optimeerimise etappidelt ja loob selle tulemusena lehekülje koodi või objektikoodi. Selle etapi eesmärk on eraldada salvestusruumi ja genereerida ümberpaigutavat 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
- Code Optimeerija: Kui lause pole kättesaadav
- Code 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.

