Faser av kompilator med eksempel: kompileringsprosess og trinn
Hva er fasene av kompilatordesign?
kompilatoren opererer i ulike faser hver fase transformerer kildeprogrammet fra en representasjon til en annen. Hver fase tar innganger fra forrige trinn og mater utdata til neste fase av kompilatoren.
Det er 6 faser i en kompilator. Hver av disse fasene hjelper til med å konvertere høynivåspråket til maskinkoden. Fasene til en kompilator er:
- Leksikalsk analyse
- Syntaksanalyse
- Semantisk analyse
- Mellomkodegenerator
- Kodeoptimerer
- Kode generator

Alle disse fasene konverterer kildekoden ved å dele inn i tokens, lage parse-trær og optimalisere kildekoden etter forskjellige faser.
Fase 1: Leksikalsk analyse
Leksikalsk analyse er den første fasen når kompilatoren skanner kildekoden. Denne prosessen kan venstre til høyre, tegn for tegn, og gruppere disse tegnene i tokens.
Her er tegnstrømmen fra kildeprogrammet gruppert i meningsfulle sekvenser ved å identifisere tokens. Den legger inn de korresponderende billettene i symboltabellen og sender den token til neste fase.
Hovedfunksjonene til denne fasen er:
- Identifiser de leksikale enhetene i en kildekode
- Klassifiser leksikalske enheter i klasser som konstanter, reserverte ord, og skriv dem inn i forskjellige tabeller. Det vil ignorere kommentarer i kildeprogrammet
- Identifiser token som ikke er en del av språket
Eksempel:
x = y + 10
tokens
| X | identifikator |
| = | Oppdragsoperatør |
| Y | identifikator |
| + | Tilleggsoperatør |
| 10 | Nr |
Fase 2: Syntaksanalyse
Syntaksanalyse handler om å oppdage struktur i kode. Den avgjør om en tekst følger det forventede formatet eller ikke. Hovedmålet med denne fasen er å sørge for at kildekoden som er skrevet av programmereren er riktig eller ikke.
Syntaksanalyse er basert på reglene basert på det spesifikke programmeringsspråket ved å konstruere parsetreet ved hjelp av tokens. Det bestemmer også strukturen til kildespråket og språkets grammatikk eller syntaks.
Her er en liste over oppgaver utført i denne fasen:
- Skaff tokens fra den leksikalske analysatoren
- Sjekker om uttrykket er syntaktisk korrekt eller ikke
- Rapporter alle syntaksfeil
- Konstruer en hierarkisk struktur som er kjent som et analysetre
Eksempel
Enhver identifikator/tall er et uttrykk
Hvis x er en identifikator og y+10 er et uttrykk, så er x= y+10 en setning.
Tenk på analysetre for følgende eksempel
(a+b)*c
I Parse Tree
- Innvendig node: ta opp med en operatør arkivert og to filer for barn
- Blad: poster med 2/flere felt; en for token og annen informasjon om token
- Sørg for at komponentene i programmet passer meningsfullt sammen
- Samler typeinformasjon og sjekker typekompatibilitet
- Kontrolloperander er tillatt av kildespråket
Fase 3: Semantisk analyse
Semantisk analyse sjekker den semantiske konsistensen til koden. Den bruker syntakstreet fra forrige fase sammen med symboltabellen for å bekrefte at den gitte kildekoden er semantisk konsistent. Den sjekker også om koden formidler en passende mening.
Semantic Analyzer vil se etter type-uoverensstemmelser, inkompatible operander, en funksjon kalt med uriktige argumenter, en ikke-deklarert variabel, etc.
Funksjoner av semantisk analysefase er:
- Hjelper deg med å lagre innsamlet typeinformasjon og lagre den i symboltabell eller syntakstre
- Lar deg utføre typekontroll
- I tilfelle av typemismatch, hvor det ikke er noen eksakte typekorreksjonsregler som tilfredsstiller ønsket operasjon, vises en semantisk feil
- Samler typeinformasjon og sjekker typekompatibilitet
- Sjekker om kildespråket tillater operandene eller ikke
Eksempel
float x = 20.2; float y = x*30;
I koden ovenfor vil den semantiske analysatoren typecaste heltall 30 til å flyte 30.0 før multiplikasjon
Fase 4: Mellomkodegenerering
Når den semantiske analysefasen er over, genererer kompilatoren mellomkode for målmaskinen. Det representerer et program for en eller annen abstrakt maskin.
Mellomkode er mellom høynivå- og maskinnivåspråket. Denne mellomkoden må genereres på en slik måte at det er enkelt å oversette den til målmaskinkoden.
Funksjoner ved generering av mellomkode:
- Den skal genereres fra den semantiske representasjonen av kildeprogrammet
- Holder verdiene som er beregnet under oversettelsesprosessen
- Hjelper deg med å oversette mellomkoden til målspråket
- Lar deg opprettholde forrangsrekkefølge for kildespråket
- Den inneholder riktig antall operander av instruksjonen
Eksempel
For eksempel,
total = count + rate * 5
Mellomkode ved hjelp av adressekodemetoden er:
t1 := int_to_float(5) t2 := rate * t1 t3 := count + t2 total := t3
Fase 5: Kodeoptimalisering
Den neste fasen av er kodeoptimalisering eller mellomkode. Denne fasen fjerner unødvendig kodelinje og ordner sekvensen av setninger for å fremskynde kjøringen av programmet uten å sløse med ressurser. Hovedmålet med denne fasen er å forbedre mellomkoden for å generere en kode som kjører raskere og tar mindre plass.
Hovedfunksjonene til denne fasen er:
- Det hjelper deg å etablere en avveining mellom utførelse og kompileringshastighet
- Forbedrer kjøretiden til målprogrammet
- Genererer strømlinjeformet kode fortsatt i mellomrepresentasjon
- Fjerne uoppnåelig kode og kvitte seg med ubrukte variabler
- Fjerner utsagn som ikke er endret fra loopen
Eksempel:
Tenk på følgende kode
a = intofloat(10) b = c * a d = e + b f = d
kan bli
b =c * 10.0 f = e+b
Fase 6: Kodegenerering
Kodegenerering er den siste og siste fasen av en kompilator. Den får input fra kodeoptimaliseringsfasene og produserer sidekoden eller objektkoden som et resultat. Målet med denne fasen er å allokere lagring og generere flyttbar maskinkode.
Den tildeler også minneplasseringer for variabelen. Instruksjonene i mellomkoden konverteres til maskininstruksjoner. Denne fasen skjuler optimaliserings- eller mellomkoden til målspråket.
Målspråket er maskinkoden. Derfor blir også alle minneplasseringer og registre valgt og tildelt i denne fasen. Koden som genereres av denne fasen, utføres for å ta innganger og generere forventede utganger.
Eksempel
a = b + 60.0
Vil muligens bli oversatt til registre.
MOVF a, R1 MULF #60.0, R2 ADDF R1, R2
Symboltabellbehandling
En symboltabell inneholder en post for hver identifikator med felt for attributtene til identifikatoren. Denne komponenten gjør det lettere for kompilatoren å søke i identifikatorposten og hente den raskt. Symboltabellen hjelper deg også for omfangsstyringen. Symboltabellen og feilbehandleren samhandler med alle fasene og symboltabelloppdateringen tilsvarende.
Feilhåndteringsrutine
I kompilatorens designprosess kan det oppstå feil i alle de nedenfor gitte fasene:
- Leksikalsk analysator: Feilstavede tokens
- Syntaksanalysator: Manglende parentes
- Mellomkodegenerator: Mismatchede operander for en operatør
- Code Optimizer: Når setningen ikke er tilgjengelig
- Kode Generator: Når minnet er fullt eller riktige registre ikke tildeles
- Symboltabeller: Feil ved flere deklarerte identifikatorer
De vanligste feilene er ugyldig tegnsekvens i skanning, ugyldige tokensekvenser i type, omfangsfeil og parsing i semantisk analyse.
Feilen kan oppstå i hvilken som helst av fasene ovenfor. Etter å ha funnet feil, må fasen håndtere feilene for å fortsette med kompileringsprosessen. Disse feilene må rapporteres til feilbehandleren som håndterer feilen for å utføre kompileringsprosessen. Vanligvis rapporteres feilene i form av meldinger.
Sammendrag
- Kompileren opererer i forskjellige faser, hver fase transformerer kildeprogrammet fra en representasjon til en annen
- Seks faser av kompilatordesign er 1) Leksikal analyse 2) Syntaksanalyse 3) Semantisk analyse 4) Mellomkodegenerator 5) Kodeoptimalisering 6) Kode Generator
- Leksikalsk analyse er den første fasen når kompilatoren skanner kildekoden
- Syntaksanalyse handler om å oppdage struktur i tekst
- Semantisk analyse sjekker den semantiske konsistensen til koden
- Når den semantiske analysefasen er over kompilatoren, generer mellomkode for målmaskinen
- Kodeoptimaliseringsfasen fjerner unødvendig kodelinje og ordner sekvensen av utsagn
- Kodegenereringsfasen får inndata fra kodeoptimeringsfasen og produserer sidekoden eller objektkoden som et resultat
- En symboltabell inneholder en post for hver identifikator med felt for attributtene til identifikatoren
- Feilhåndteringsrutine håndterer feil og rapporter i mange faser

