Faser av kompilatorn med exempel, process och steg
โก Smart sammanfattning
Kompilatorns faser beskriver hur en kompilator omvandlar kรคllkod till maskinkod genom sex steg: lexikal analys, syntaxanalys, semantisk analys, generering av mellanliggande kod, kodoptimering och kodgenerering, med stรถd av symboltabellhantering och felhantering genomgรฅende.

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
- Code Optimizer
- Code Generatorn

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: Mellannivรฅ Code Generation
Nรคr den semantiska analysfasen รคr รถver genererar kompilatorn mellanliggande kod fรถr mรฅlmaskinen. Den representerar ett program fรถr vissa abstract-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 pรฅ mellannivรฅ Code generation:
- 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: Code Optimering
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
Exempel:
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: Code Generation
Code Generering รคr den sista och avslutande fasen i en kompilator. Den tar emot indata frรฅn kodoptimeringsfaser och producerar sidkod eller objektkod som ett resultat. Syftet med denna fas รคr att allokera lagringsutrymme 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
- Code Optimerare: Nรคr satsen inte รคr tillgรคnglig
- Code 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.

