Kokie yra kompiliatoriaus projektavimo etapai?
Kompiliatorius veikia įvairiais etapais, kiekvienas etapas transformuoja šaltinio programą iš vienos reprezentacijos į kitą. Kiekviena fazė ima iš ankstesnio etapo įvestį ir perduoda savo išvestį į kitą kompiliatoriaus fazę.
Kompiliatoriuje yra 6 fazės. Kiekvienas iš šių etapų padeda konvertuoti aukšto lygio langą ir mašinos kodą. Kompiliatoriaus fazės yra šios:
- Leksinė analizė
- Sintaksės analizė
- Semantinė analizė
- Tarpinių kodų generatorius
- Kodo optimizatorius
- Kodų generatorius
Visos šios fazės konvertuoja šaltinio kodą padalijant į žetonus, sukuriant analizės medžius ir optimizuojant šaltinio kodą skirtingomis fazėmis.
Šioje pamokoje sužinosite:
- Kokie yra kompiliatoriaus projektavimo etapai?
- 1 etapas: leksinė analizė
- 2 etapas: sintaksės analizė
- 3 etapas: semantinė analizė
- 4 etapas: tarpinio kodo generavimas
- 5 etapas: kodo optimizavimas
- 6 etapas: kodo generavimas
- Simbolių lentelės valdymas
- Klaida tvarkant įprastą:
1 etapas: leksinė analizė
Leksinė analizė yra pirmasis etapas, kai kompiliatorius nuskaito šaltinio kodą. Šį procesą galima palikti kairėn į dešinę, po simbolį ir sugrupuoti šiuos simbolius į žetonus.
Čia simbolių srautas iš šaltinio programos yra sugrupuotas į prasmingas sekas identifikuojant žetonus. Tai daro atitinkamų bilietų įrašymą į simbolių lentelę ir perduoda tą žetoną kitam etapui.
Pagrindinės šio etapo funkcijos yra:
- Nustatykite leksinius vienetus šaltinio kode
- Klasifikuokite leksinius vienetus į klases, pvz., Konstantas, rezervuotus žodžius, ir įveskite juos į skirtingas lenteles. Tai nepaisys šaltinio programos komentarų
- Nustatykite žetoną, kuris nėra kalbos dalis
Pavyzdys :
x = y + 10
Žetonai
X | identifikatorius |
= | Užduoties operatorius |
Y | identifikatorius |
+ | Papildymo operatorius |
10 | Skaičius |
2 etapas: sintaksės analizė
Sintaksės analizė yra susijusi su struktūros atradimu kode. Jis nustato, ar tekstas atitinka numatytą formatą. Pagrindinis šio etapo tikslas yra įsitikinti, ar programuotojo parašytas šaltinio kodas yra teisingas, ar ne.
Sintaksės analizė remiasi taisyklėmis, pagrįstomis konkrečia programavimo kalba, konstruojant analizės medį žetonų pagalba. Tai taip pat lemia šaltinio kalbos struktūrą ir kalbos gramatiką ar sintaksę.
Čia pateikiamas šiame etape atliktų užduočių sąrašas:
- Gaukite leksinio analizatoriaus žetonus
- Tikrina, ar išraiška sintaksiniu požiūriu teisinga, ar ne
- Pranešti apie visas sintaksės klaidas
- Sukurkite hierarchinę struktūrą, kuri vadinama analizės medžiu
Pavyzdys
Bet koks identifikatorius / numeris yra išraiška
Jei x yra identifikatorius, o y + 10 yra išraiška, tada x = y + 10 yra sakinys.
Apsvarstykite analizės medį, kad pateiktumėte šį pavyzdį
(a+b)*c
Parse medyje
- Interjero mazgas: įrašas su operatoriumi ir dvi bylos vaikams
- Lapas: įrašai su 2 / daugiau laukais; vienas skirtas prieigos raktui ir kitai informacijai apie prieigos raktą
- Įsitikinkite, kad programos komponentai prasmingai dera
- Renka informaciją apie tipą ir tikrina tipo suderinamumą
- Tikrinti operandus leidžia šaltinio kalba
3 etapas: semantinė analizė
Semantinė analizė tikrina kodo semantinį nuoseklumą. Jis naudoja ankstesnio etapo sintaksės medį kartu su simbolių lentele, kad patikrintų, ar pateiktas šaltinio kodas yra semantiškai nuoseklus. Jis taip pat tikrina, ar kodas reiškia tinkamą reikšmę.
„Semantic Analyzer“ patikrins, ar nėra tipų neatitikimų, nesuderinamų operandų, netinkamais argumentais iškviestos funkcijos, nedeklaruoto kintamojo ir kt.
Semantinės analizės etapo funkcijos yra šios:
- Padeda išsaugoti surinktą tipo informaciją ir išsaugoti ją simbolių lentelėje arba sintaksės medyje
- Leidžia atlikti tipo patikrinimą
- Tipo neatitikimo atveju, kai nėra tikslių tipo taisymo taisyklių, kurios atitiktų norimą operaciją, parodoma semantinė klaida
- Renka informaciją apie tipą ir tikrina tipo suderinamumą
- Tikrina, ar šaltinio kalba leidžia operandus, ar ne
Pavyzdys
float x = 20.2;float y = x*30;
Pirmiau pateiktame kode semantinis analizatorius prieš daugindamas sukurs skaičių 30, kad plūduriuos 30,0
4 etapas: tarpinio kodo generavimas
Kai semantinės analizės fazė baigsis kompiliatoriuje, sukuria tarpinį tikslinės mašinos kodą. Tai reprezentuoja kažkokios abstrakčios mašinos programą.
Tarpinis kodas yra tarp aukšto ir mašininio lygio kalbų. Šį tarpinį kodą reikia sugeneruoti taip, kad jį būtų lengva išversti į tikslinį mašinos kodą.
Tarpinio kodo generavimo funkcijos:
- Tai turėtų būti sugeneruota iš semantinio šaltinio programos vaizdavimo
- Turi vertimo metu apskaičiuotas vertes
- Padeda jums išversti tarpinį kodą į tikslinę kalbą
- Leidžia išlaikyti pirminės tvarkos šaltinio kalbą
- Jame yra teisingas instrukcijos operandų skaičius
Pavyzdys
Pavyzdžiui,
total = count + rate * 5
Tarpinis kodas naudojant adreso kodo metodą yra:
t1 := int_to_float(5)t2 := rate * t1t3 := count + t2total := t3
5 etapas: kodo optimizavimas
Kitas etapas yra kodo optimizavimas arba tarpinis kodas. Šis etapas pašalina nereikalingą kodo eilutę ir sutvarko sakinių seką, kad pagreitintų programos vykdymą nešvaistant išteklių. Pagrindinis šio etapo tikslas yra patobulinti tarpinį kodą, kad būtų sukurtas greitesnis ir mažiau vietos užimantis kodas.
Pagrindinės šio etapo funkcijos yra:
- Tai padeda nustatyti kompromisą tarp vykdymo ir kompiliavimo greičio
- Pagerina tikslinės programos veikimo laiką
- Generuoja supaprastintą kodą, kuris vis dar rodomas tarpiniu vaizdu
- Nepasiekiamo kodo pašalinimas ir nepanaudotų kintamųjų atsikratymas
- Nepakeistų sakinių pašalinimas iš ciklo
Pavyzdys:
Apsvarstykite šį kodą
a = intofloat(10)b = c * ad = e + bf = d
Gali tapti
b =c * 10.0f = e+b
6 etapas: kodo generavimas
Kodo generavimas yra paskutinis ir paskutinis kompiliatoriaus etapas. Jis gauna įvestis iš kodo optimizavimo etapų ir dėl to sukuria puslapio ar objekto kodą. Šio etapo tikslas yra paskirstyti saugyklą ir sugeneruoti perkeliamą mašinos kodą.
Jis taip pat skiria kintamojo atminties vietas. Tarpiniame kode pateiktos instrukcijos paverčiamos mašinų instrukcijomis. Šis etapas optimizavimo arba tarpinį kodą įtraukia į tikslinę kalbą.
Tikslinė kalba yra mašinos kodas. Todėl šiame etape taip pat parenkamos ir paskirstomos visos atminties vietos ir registrai. Šio etapo sugeneruotas kodas vykdomas norint priimti įvestis ir generuoti laukiamus rezultatus.
Pavyzdys:
a = b + 60,0
Galbūt būtų išversta į registrus.
MOVF a, R1MULF #60.0, R2ADDF R1, R2
Simbolių lentelės valdymas
Simbolių lentelėje yra kiekvieno identifikatoriaus įrašas su laukais identifikatoriaus atributams. Šis komponentas leidžia kompiliatoriui lengviau ieškoti identifikatoriaus įrašo ir jį greitai gauti. Simbolių lentelė taip pat padeda valdyti sritį. Simbolių lentelė ir klaidų tvarkytuvas atitinkamai sąveikauja su visomis fazėmis ir simbolių lentelės atnaujinimu.
Klaida tvarkant įprastą:
Kompiliatoriaus projektavimo procese gali įvykti klaida visuose toliau nurodytuose etapuose:
- Leksinis analizatorius: neteisingai parašyti žetonai
- Sintaksės analizatorius: trūksta skliaustų
- Tarpinių kodų generatorius: nesutapę operatoriaus operandai
- Kodo optimizavimo priemonė: kai negalima pasiekti teiginio
- Kodo generatorius: nepasiekiami teiginiai
- Simbolių lentelės: kelių deklaruotų identifikatorių klaida
Dažniausiai pasitaikančios klaidos yra netinkama simbolių seka nuskaitymo metu, netinkamos žetonų sekos pagal tipą, apimties klaida ir analizavimas semantinėje analizėje.
Klaida gali būti pastebėta bet kuriame iš anksčiau nurodytų etapų. Suradus klaidas, reikia tęsti klaidas, kad būtų galima tęsti kompiliavimo procesą. Apie šias klaidas reikia pranešti klaidų tvarkytojui, kuris tvarko klaidą atlikdamas kompiliavimo procesą. Paprastai apie klaidas pranešama pranešimo forma.
Santrauka
- Kompiliatorius veikia įvairiais etapais, kiekvienas etapas transformuoja šaltinio programą iš vienos reprezentacijos į kitą
- Šeši kompiliatoriaus projektavimo etapai yra 1) Leksinė analizė 2) Sintaksės analizė 3) Semantinė analizė 4) Tarpinio kodo generatorius 5) Kodo optimizavimo priemonė 6) Kodo generatorius
- Leksinė analizė yra pirmasis etapas, kai kompiliatorius nuskaito šaltinio kodą
- Sintaksės analizė yra susijusi su struktūros atradimu tekste
- Semantinė analizė tikrina kodo semantinį nuoseklumą
- Kai kompiliatorius baigsis semantinės analizės etapu, sugeneruokite tarpinį tikslinės mašinos kodą
- Kodo optimizavimo etapas pašalina nereikalingą kodo eilutę ir sutvarko sakinių seką
- Kodo generavimo fazė gauna įvestis iš kodo optimizavimo etapo ir dėl to sukuria puslapio ar objekto kodą
- Simbolių lentelėje yra kiekvieno identifikatoriaus įrašas su laukais identifikatoriaus atributams
- Klaida tvarkant įprastą tvarko klaidas ir ataskaitas daugelyje etapų