Faser av kompilator med exempel: kompileringsprocess och steg
Vilka är faserna av kompilatordesign?
Kompilator fungerar i olika faser varje fas omvandlar källprogrammet från en representation till en annan. Varje fas tar indata från sitt föregående steg och matar dess utdata till nästa fas av kompilatorn.
Det finns 6 faser i en kompilator. Var och en av dessa faser hjälper till att konvertera högnivåspråket till maskinkoden. Faserna i en kompilator är:
- Lexikalisk analys
- Syntaxanalys
- Semantisk analys
- Mellankodgenerator
- Kodoptimerare
- Kod generator

Alla dessa faser konverterar källkoden genom att dela upp den i tokens, skapa parseträd och optimera källkoden genom olika faser.
Fas 1: Lexikal analys
Lexical Analysis är den första fasen när kompilatorn skannar källkoden. Denna process kan lämnas till höger, tecken för tecken, och gruppera dessa tecken i tokens.
Här grupperas teckenströmmen från källprogrammet i meningsfulla sekvenser genom att identifiera tokens. Det gör införandet av motsvarande lotter i symboltabellen och skickar den token till nästa fas.
De primära funktionerna i denna fas är:
- Identifiera lexikaliska enheter i en källkod
- Klassificera lexikaliska enheter i klasser som konstanter, reserverade ord och skriv in dem i olika tabeller. Det kommer att ignorera kommentarer i källprogrammet
- Identifiera token som inte är en del av språket
Exempelvis:
x = y + 10
tokens
X | identifierare |
= | Uppdragsoperatör |
Y | identifierare |
+ | Tilläggsoperatör |
10 | Antal |
Fas 2: Syntaxanalys
Syntaxanalys handlar om att upptäcka struktur i kod. Det avgör om en text följer det förväntade formatet eller inte. Huvudsyftet med denna fas är att se till att källkoden som har skrivits av programmeraren är korrekt eller inte.
Syntaxanalys bygger på reglerna baserade på det specifika programmeringsspråket genom att konstruera parseträdet med hjälp av tokens. Det bestämmer också strukturen för källspråket och språkets grammatik eller syntax.
Här är en lista över uppgifter som utförts i denna fas:
- Skaffa tokens från den lexikala analysatorn
- Kontrollerar om uttrycket är syntaktisk korrekt eller inte
- Rapportera alla syntaxfel
- Konstruera en hierarkisk struktur som är känd som ett analysträd
Exempelvis
Varje identifierare/nummer är ett uttryck
Om x är en identifierare och y+10 är ett uttryck, då är x= y+10 en sats.
Överväg att analysera träd för följande exempel
(a+b)*c
I Parse Tree
- Inre nod: spela in med en operatör och två filer för barn
- Blad: poster med 2/fler fält; en för token och annan information om token
- Se till att komponenterna i programmet passar ihop på ett meningsfullt sätt
- Samlar typinformation och kontrollerar typkompatibilitet
- Kontrolloperander är tillåtna av källspråket
Fas 3: Semantisk analys
Semantisk analys kontrollerar kodens semantiska konsistens. Den använder syntaxträdet för föregående fas tillsammans med symboltabellen för att verifiera att den givna källkoden är semantiskt konsekvent. Den kontrollerar också om koden förmedlar en lämplig betydelse.
Semantic Analyzer kommer att leta efter typfelmatchningar, inkompatibla operander, en funktion som anropas med felaktiga argument, en odeklarerad variabel, etc.
Funktionerna i semantisk analysfas är:
- Hjälper dig att lagra insamlad typinformation och spara den i symboltabell eller syntaxträd
- Låter dig utföra typkontroll
- I fallet med typfel, där det inte finns några exakta typkorrigeringsregler som uppfyller den önskade operationen visas ett semantiskt fel
- Samlar in typinformation och kontrollerar typkompatibilitet
- Kontrollerar om källspråket tillåter operanderna eller inte
Exempelvis
float x = 20.2; float y = x*30;
I ovanstående kod kommer den semantiska analysatorn att typcasta heltal 30 till flytande 30.0 före multiplikation
Fas 4: Mellanliggande kodgenerering
När den semantiska analysfasen är över genererar kompilatorn mellankod för målmaskinen. Det representerar ett program för någon abstrakt maskin.
Mellankod ligger mellan språket på hög nivå och maskinnivå. Denna mellankod måste genereras på ett sådant sätt att det är lätt att översätta den till målmaskinkoden.
Funktioner vid generering av mellankod:
- Det bör genereras från den semantiska representationen av källprogrammet
- Innehåller de värden som beräknats under översättningsprocessen
- Hjälper dig att översätta mellankoden till målspråk
- Låter dig behålla prioritetsordningen för källspråket
- Den innehåller det korrekta antalet operander av instruktionen
Exempelvis
Till exempel,
total = count + rate * 5
Mellankod med hjälp av adresskodsmetoden är:
t1 := int_to_float(5) t2 := rate * t1 t3 := count + t2 total := t3
Fas 5: Kodoptimering
Nästa fas av är kodoptimering eller mellankod. Denna fas tar bort onödig kodrad och ordnar sekvensen av uttalanden för att påskynda exekveringen av programmet utan att slösa resurser. Huvudmålet med denna fas är att förbättra mellankoden för att generera en kod som körs snabbare och tar mindre plats.
De primära funktionerna i denna fas är:
- Det hjälper dig att skapa en avvägning mellan körning och kompileringshastighet
- Förbättrar körtiden för målprogrammet
- Genererar strömlinjeformad kod fortfarande i mellanrepresentation
- Ta bort oåtkomlig kod och bli av med oanvända variabler
- Ta bort satser som inte har ändrats från slingan
Exempelvis:
Tänk på följande kod
a = intofloat(10) b = c * a d = e + b f = d
Kan bli
b =c * 10.0 f = e+b
Fas 6: Kodgenerering
Kodgenerering är den sista och sista fasen av en kompilator. Den får indata från kodoptimeringsfaser och producerar sidkoden eller objektkoden som ett resultat. Syftet med denna fas är att allokera lagring och generera flyttbar maskinkod.
Den allokerar också minnesplatser för variabeln. Instruktionerna i mellankoden omvandlas till maskininstruktioner. Denna fas döljer optimerings- eller mellankoden till målspråket.
Målspråket är maskinkoden. Därför väljs och tilldelas även alla minnesplatser och register under denna fas. Koden som genereras av denna fas exekveras för att ta indata och generera förväntade utdata.
Exempelvis
a = b + 60.0
Skulle möjligen översättas till register.
MOVF a, R1 MULF #60.0, R2 ADDF R1, R2
Symboltabellhantering
En symboltabell innehåller en post för varje identifierare med fält för identifierarens attribut. Denna komponent gör det enklare för kompilatorn att söka i identifierarposten och snabbt hämta den. Symboltabellen hjälper dig också för scope management. Symboltabellen och felhanteraren samverkar med alla faser och symboltabellen uppdateras på motsvarande sätt.
Felhanteringsrutin
I kompilatorns designprocess kan fel uppstå i alla nedan givna faser:
- Lexikal analysator: Felstavade tokens
- Syntaxanalysator: parentes saknas
- Mellankodgenerator: Felaktiga operander för en operatör
- Kodoptimerare: När uttalandet inte kan nås
- Koda Generator: När minnet är fullt eller korrekta register inte allokeras
- Symboltabeller: Fel på flera deklarerade identifierare
De vanligaste felen är ogiltiga teckensekvenser vid skanning, ogiltiga tokensekvenser i typ, omfångsfel och parsning i semantisk analys.
Felet kan uppstå i någon av ovanstående faser. Efter att ha hittat fel måste fasen ta itu med felen för att fortsätta med kompileringsprocessen. Dessa fel måste rapporteras till felhanteraren som hanterar felet för att kunna utföra kompileringsprocessen. I allmänhet rapporteras felen i form av meddelanden.
Sammanfattning
- Kompilatorn fungerar i olika faser. Varje fas transformerar källprogrammet från en representation till en annan
- Sex faser av kompilator design är 1) Lexikal analys 2) Syntaxanalys 3) Semantisk analys 4) Mellankodgenerator 5) Kodoptimerare 6) Kod Generator
- Lexical Analysis är den första fasen när kompilatorn skannar källkoden
- Syntaxanalys handlar om att upptäcka struktur i text
- Semantisk analys kontrollerar kodens semantiska konsistens
- När den semantiska analysfasen är över kompilatorn, generera mellankod för målmaskinen
- Kodoptimeringsfasen tar bort onödig kodrad och ordnar sekvensen av uttalanden
- Kodgenereringsfasen får indata från kodoptimeringsfasen och producerar sidkoden eller objektkoden som ett resultat
- En symboltabell innehåller en post för varje identifierare med fält för identifierarens attribut
- Felhanteringsrutinen hanterar fel och rapporter under många faser