Faser af compiler med eksempel: kompileringsproces og trin
Hvad er faserne af compilerdesign?
compiler fungerer i forskellige faser, hver fase transformerer kildeprogrammet fra en repræsentation til en anden. Hver fase tager input fra sin forrige fase og sender dens output til den næste fase af compileren.
Der er 6 faser i en compiler. Hver af denne fase hjælper med at konvertere højniveausproget til maskinkoden. Faserne i en compiler er:
- Leksikalsk analyse
- Syntaksanalyse
- Semantisk analyse
- Mellemkodegenerator
- Kode optimizer
- Kode generator
Alle disse faser konverterer kildekoden ved at opdele i tokens, skabe parsetræer og optimere kildekoden efter forskellige faser.
Fase 1: Leksikalsk analyse
Leksikalsk analyse er den første fase, når compileren scanner kildekoden. Denne proces kan venstre mod højre, tegn for tegn, og gruppere disse tegn i tokens.
Her er karakterstrømmen fra kildeprogrammet grupperet i meningsfulde sekvenser ved at identificere tokens. Det gør indtastningen af de tilsvarende billetter i symboltabellen og sender denne token til næste fase.
De primære funktioner i denne fase er:
- Identificer de leksikalske enheder i en kildekode
- Klassificer leksikalske enheder i klasser som konstanter, reserverede ord, og indtast dem i forskellige tabeller. Det vil ignorere kommentarer i kildeprogrammet
- Identificer token, som ikke er en del af sproget
Eksempel:
x = y + 10
Tokens
X | identifikator |
= | Tildelingsoperatør |
Y | identifikator |
+ | Tilføjelsesoperatør |
10 | nummer |
Fase 2: Syntaksanalyse
Syntaksanalyse handler om at opdage struktur i kode. Det afgør, om en tekst følger det forventede format eller ej. Hovedformålet med denne fase er at sikre, at kildekoden, der blev skrevet af programmøren, er korrekt eller ej.
Syntaksanalyse er baseret på reglerne baseret på det specifikke programmeringssprog ved at konstruere parsetræet ved hjælp af tokens. Det bestemmer også strukturen af kildesproget og sprogets grammatik eller syntaks.
Her er en liste over opgaver udført i denne fase:
- Få tokens fra den leksikalske analysator
- Kontrollerer, om udtrykket er syntaktisk korrekt eller ej
- Rapporter alle syntaksfejl
- Konstruer en hierarkisk struktur, der er kendt som et parsetræ
Eksempel
Ethvert identifikator/nummer er et udtryk
Hvis x er en identifikator, og y+10 er et udtryk, så er x= y+10 en sætning.
Overvej at analysere træ for følgende eksempel
(a+b)*c
I Parse Tree
- Indvendig node: optag med en operatørfil og to filer til børn
- Blad: poster med 2/flere felter; en for token og andre oplysninger om tokenet
- Sørg for, at komponenterne i programmet passer meningsfuldt sammen
- Indsamler typeoplysninger og kontrollerer for typekompatibilitet
- Kontroloperander er tilladt af kildesproget
Fase 3: Semantisk analyse
Semantisk analyse kontrollerer kodens semantiske konsistens. Den bruger syntakstræet fra den foregående fase sammen med symboltabellen for at verificere, at den givne kildekode er semantisk konsistent. Den kontrollerer også, om koden formidler en passende betydning.
Semantic Analyzer vil tjekke for Type-uoverensstemmelser, inkompatible operander, en funktion kaldet med ukorrekte argumenter, en ikke-erklæret variabel osv.
Funktioner af semantisk analysefase er:
- Hjælper dig med at gemme indsamlet typeinformation og gemme den i symboltabel eller syntakstræ
- Giver dig mulighed for at udføre typekontrol
- I tilfælde af typemismatch, hvor der ikke er nogen nøjagtige typekorrektionsregler, der opfylder den ønskede operation, vises en semantisk fejl
- Indsamler typeoplysninger og kontrollerer for typekompatibilitet
- Kontrollerer, om kildesproget tillader operanderne eller ej
Eksempel
float x = 20.2; float y = x*30;
I ovenstående kode vil den semantiske analysator typecaste heltallet 30 til at flyde 30.0 før multiplikation
Fase 4: Mellemkodegenerering
Når den semantiske analysefase er overstået, genererer compileren mellemkode til målmaskinen. Det repræsenterer et program til en abstrakt maskine.
Mellemkode er mellem sprog på højt niveau og maskinniveau. Denne mellemkode skal genereres på en sådan måde, at den gør det nemt at oversætte den til målmaskinkoden.
Funktioner ved generering af mellemkode:
- Det bør genereres ud fra den semantiske repræsentation af kildeprogrammet
- Indeholder de værdier, der er beregnet under oversættelsesprocessen
- Hjælper dig med at oversætte mellemkoden til målsproget
- Giver dig mulighed for at bevare prioritetsrækkefølgen af kildesproget
- Den indeholder det korrekte antal operander af instruktionen
Eksempel
For eksempel:
total = count + rate * 5
Mellemkode ved hjælp af adressekodemetoden er:
t1 := int_to_float(5) t2 := rate * t1 t3 := count + t2 total := t3
Fase 5: Kodeoptimering
Den næste fase af er kodeoptimering eller mellemkode. Denne fase fjerner unødvendig kodelinje og arrangerer sekvensen af sætninger for at fremskynde udførelsen af programmet uden at spilde ressourcer. Hovedmålet med denne fase er at forbedre den mellemliggende kode for at generere en kode, der kører hurtigere og optager mindre plads.
De primære funktioner i denne fase er:
- Det hjælper dig med at etablere en afvejning mellem eksekverings- og kompileringshastighed
- Forbedrer køretiden for målprogrammet
- Generer strømlinet kode stadig i mellemrepræsentation
- Fjernelse af uopnåelig kode og fjernelse af ubrugte variabler
- Fjernelse af udsagn, der ikke er ændret, fra løkken
Eksempel:
Overvej følgende kode
a = intofloat(10) b = c * a d = e + b f = d
kan blive
b =c * 10.0 f = e+b
Fase 6: Kodegenerering
Kodegenerering er den sidste og sidste fase af en compiler. Det får input fra kodeoptimeringsfaser og producerer sidekoden eller objektkoden som et resultat. Formålet med denne fase er at allokere lager og generere flytbar maskinkode.
Den tildeler også hukommelsesplaceringer for variablen. Instruktionerne i mellemkoden konverteres til maskininstruktioner. Denne fase skjuler optimerings- eller mellemkoden til målsproget.
Målsproget er maskinkoden. Derfor bliver alle hukommelsesplaceringer og registre også udvalgt og tildelt i denne fase. Koden genereret af denne fase udføres for at tage input og generere forventede output.
Eksempel
a = b + 60.0
Vil muligvis blive oversat til registre.
MOVF a, R1 MULF #60.0, R2 ADDF R1, R2
Symbol Tabel Management
En symboltabel indeholder en post for hver identifikator med felter for identifikatorens attributter. Denne komponent gør det lettere for compileren at søge i identifikatorposten og hente den hurtigt. Symboltabellen hjælper dig også med scope-styringen. Symboltabellen og fejlbehandleren interagerer med alle faser og symboltabellen opdateres tilsvarende.
Fejlhåndteringsrutine
I compilerdesignprocessen kan der forekomme fejl i alle nedenstående givne faser:
- Leksikalsk analysator: Forkert stavet tokens
- Syntaksanalysator: Manglende parentes
- Mellemkodegenerator: Mismatchede operander for en operator
- Code Optimizer: Når erklæringen ikke er tilgængelig
- Kode Generator: Når hukommelsen er fuld eller korrekte registre ikke allokeres
- Symboltabeller: Fejl ved flere erklærede identifikatorer
De mest almindelige fejl er ugyldig tegnsekvens i scanning, ugyldige tokensekvenser i type, omfangsfejl og parsing i semantisk analyse.
Fejlen kan opstå i enhver af ovenstående faser. Efter at have fundet fejl, skal fasen håndtere fejlene for at fortsætte med kompileringsprocessen. Disse fejl skal rapporteres til fejlbehandleren, som håndterer fejlen, for at udføre kompileringsprocessen. Generelt rapporteres fejlene i form af meddelelser.
Resumé
- Compiler fungerer i forskellige faser, hver fase transformerer kildeprogrammet fra en repræsentation til en anden
- Seks faser af compiler design er 1) Leksikalsk analyse 2) Syntaksanalyse 3) Semantisk analyse 4) Mellemkodegenerator 5) Kodeoptimering 6) Kode Generator
- Leksikalsk analyse er den første fase, når compileren scanner kildekoden
- Syntaksanalyse handler om at opdage struktur i tekst
- Semantisk analyse kontrollerer kodens semantiske konsistens
- Når den semantiske analysefase er overstået, skal du generere mellemkode til målmaskinen
- Kodeoptimeringsfasen fjerner unødvendig kodelinje og arrangerer rækkefølgen af udsagn
- Kodegenereringsfasen får input fra kodeoptimeringsfasen og producerer sidekoden eller objektkoden som et resultat
- En symboltabel indeholder en post for hver identifikator med felter for identifikatorens attributter
- Fejlhåndteringsrutinen håndterer fejl og rapporter i mange faser