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.

  • 🔤 Lexikal analys: Den första fasen skannar källkoden och grupperar tecken i tokens, vilket fyller symboltabellen.
  • ???? Syntaxanalys: Tokens kontrolleras mot grammatikregler och arrangeras i ett parse-träd.
  • ✅ Semantisk analys: Kompilatorn verifierar typkompatibilitet och betydelse med hjälp av syntaxträdet och symboltabellen.
  • 🔁 Mellanliggande Code: En maskinoberoende representation, såsom en kod med tre adresser, genereras för enkel översättning.
  • ⚡ Optimering: Redundant och oåtkomlig kod tas bort för att göra programmet snabbare och mindre.
  • 🖥️ Code Generation: Den sista fasen konverterar optimerad kod till målmaskinkod, och allokerar register och minne.

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:

  1. Lexikalisk analys
  2. Syntaxanalys
  3. Semantisk analys
  4. Mellankodgenerator
  5. Code Optimizer
  6. Code Generatorn
Kompilatorns faser
Kompilatorns faser

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

Exempel på syntaxanalys

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.

Vanliga frågor

Analysfasen (frontend) bryter ner källkoden genom lexikal, syntaxisk och semantisk analys. Syntesfasen (backend) bygger målprogrammet genom mellanliggande kodgenerering, optimering och kodgenerering.

En kompilator översätter hela källprogrammet till maskinkod innan det körs. En tolk översätter och exekverar kod rad för rad, vilket är lättare att felsöka men vanligtvis långsammare vid körning.

Treadresskod är en mellanliggande representation där varje instruktion har högst tre operander, såsom t1 = a + b. Den är enkel att optimera och lätt att översätta till målmaskinkod.

AI och maskininlärning hjälper moderna kompilatorer med smartare optimeringsbeslut, som att välja looptransformationer, inlining och registerallokering. De förutsäger vilka optimeringar som förbättrar prestandan för ett givet program och mål.

Ja. AI kan förklara varje fas med exempel, trace hur ett exempeluttryck går från tokens till maskinkod och besvara följdfrågor. Detta gör kompilatordesign lättare för studenter att lära sig.

Sammanfatta detta inlägg med: