Fasen van compiler met voorbeeld: compilatieproces en stappen

Wat zijn de fasen van het compilerontwerp?

Compiler werkt in verschillende fasen, elke fase transformeert het bronprogramma van de ene representatie naar de andere. Elke fase neemt input van de vorige fase en stuurt de output naar de volgende fase van de compiler.
Er zijn 6 fasen in een compiler. Elk van deze fasen helpt bij het converteren van de taal op hoog niveau naar de machinecode. De fasen van een compiler zijn:

  1. Lexicale analyse
  2. Syntaxisanalyse
  3. semantische analyse
  4. Tussencode generator
  5. Code-optimalisatie
  6. Code generator
Fasen van compiler
Fasen van compiler

Al deze fasen converteren de broncode door deze in tokens te verdelen, ontleedbomen te creëren en de broncode in verschillende fasen te optimaliseren.

Fase 1: Lexicale analyse

Lexicale analyse is de eerste fase waarin de compiler de broncode scant. Dit proces kan van links naar rechts worden uitgevoerd, karakter voor karakter, en deze karakters in tokens groeperen.
Hier wordt de tekenstroom uit het bronprogramma gegroepeerd in betekenisvolle reeksen door de tokens te identificeren. Het voert de overeenkomstige tickets in de symbolentabel in en geeft dat token door aan de volgende fase.
De primaire functies van deze fase zijn:

  • Identificeer de lexicale eenheden in een broncode
  • Classificeer lexicale eenheden in klassen zoals constanten en gereserveerde woorden, en voer ze in verschillende tabellen in. Het negeert opmerkingen in het bronprogramma
  • Identificeer een token dat geen deel uitmaakt van de taal

Voorbeeld:
x = y + 10

tokens

X identificatie
= Toewijzingsoperator
Y identificatie
+ Toevoegingsoperator
10 Telefoon Nummer

Fase 2: Syntaxisanalyse

Bij syntaxisanalyse gaat het erom structuur in code te ontdekken. Het bepaalt of een tekst al dan niet het verwachte formaat volgt. Het belangrijkste doel van deze fase is ervoor te zorgen dat de broncode die door de programmeur is geschreven, correct is of niet.
Syntaxisanalyse is gebaseerd op de regels die zijn gebaseerd op de specifieke programmeertaal door de ontleedboom te construeren met behulp van tokens. Het bepaalt ook de structuur van de brontaal en de grammatica of syntaxis van de taal.
Hier is een lijst met taken die in deze fase worden uitgevoerd:

  • Verkrijg tokens van de lexicale analysator
  • Controleert of de expressie syntactisch correct is of niet
  • Rapporteer alle syntaxisfouten
  • Construeer een hiërarchische structuur die bekend staat als een ontleedboom

Voorbeeld

Elke identificatie/nummer is een uitdrukking
Als x een identificatie is en y+10 een uitdrukking is, dan is x= y+10 een verklaring.
Overweeg om de boom te ontleden voor de volgende informatiewing voorbeeld

(a+b)*c

Voorbeeld van syntaxisanalyse

In ontleedboom

  • Binnenknooppunt: record met een operator opgeslagen en twee bestanden voor kinderen
  • Blad: records met 2/meer velden; één voor token en andere informatie over het token
  • Zorg ervoor dat de onderdelen van het programma zinvol op elkaar aansluiten
  • Verzamelt type-informatie en controleert op typecompatibiliteit
  • Controle-operands zijn toegestaan ​​door de brontaal

Fase 3: Semantische analyse

Semantische analyse controleert de semantische consistentie van de code. Het gebruikt de syntaxisboom van de vorige fase samen met de symbooltabel om te verifiëren dat de gegeven broncode semantisch consistent is. Ook wordt gecontroleerd of de code een passende betekenis overbrengt.
Semantic Analyzer controleert op type-mismatches, incompatibele operanden, een functie die wordt aangeroepen met onjuiste argumenten, een niet-gedeclareerde variabele, enz.
Functies van de semantische analysefase zijn:

  • Helpt u de verzamelde type-informatie op te slaan en op te slaan in een symbooltabel of syntaxisboom
  • Hiermee kunt u typecontrole uitvoeren
  • In het geval van type-mismatch, waarbij er geen exacte typecorrectieregels zijn die aan de gewenste bewerking voldoen, wordt een semantische fout weergegeven
  • Verzamelt type-informatie en controleert op typecompatibiliteit
  • Controleert of de brontaal de operanden toestaat of niet

Voorbeeld

float x = 20.2;
float y = x*30;

In de bovenstaande code typt de semantische analysator het gehele getal 30 naar float 30.0 vóór vermenigvuldiging

Fase 4: Tussentijdse codegeneratie

Zodra de semantische analysefase voorbij is, genereert de compiler tussencode voor de doelmachine. Het vertegenwoordigt een programma voor een abstracte machine.
Tussencode bevindt zich tussen de taal op hoog niveau en de taal op machineniveau. Deze tussencode moet op een zodanige manier worden gegenereerd dat deze eenvoudig kan worden vertaald naar de doelmachinecode.
Functies voor het genereren van tussencodes:

  • Het moet worden gegenereerd op basis van de semantische representatie van het bronprogramma
  • Bevat de waarden die zijn berekend tijdens het vertaalproces
  • Helpt u bij het vertalen van de tussencode naar de doeltaal
  • Hiermee kunt u de prioriteitsvolgorde van de brontaal behouden
  • Het bevat het juiste aantal operanden van de instructie

Voorbeeld

Bijvoorbeeld

total = count + rate * 5

Tussencode met behulp van de adrescodemethode is:

 
t1 := int_to_float(5) 
t2 := rate * t1 
t3 := count + t2
total := t3

Fase 5: Code-optimalisatie

De volgende fase is code-optimalisatie of tussencode. In deze fase worden onnodige coderegels verwijderd en de volgorde van de instructies gerangschikt om de uitvoering van het programma te versnellen zonder middelen te verspillen. Het belangrijkste doel van deze fase is het verbeteren van de tussencode om een ​​code te genereren die sneller werkt en minder ruimte in beslag neemt.
De primaire functies van deze fase zijn:

  • Het helpt u een afweging te maken tussen uitvoering en compilatiesnelheid
  • Verbetert de looptijd van het doelprogramma
  • Genereert gestroomlijnde code die nog steeds een tussenweergave heeft
  • Onbereikbare code verwijderen en ongebruikte variabelen verwijderen
  • Het verwijderen van instructies die niet zijn gewijzigd uit de lus

Voorbeeld:
Denk eens aan het volgendewing code

a = intofloat(10)
b = c * a
d = e + b
f = d

Kan worden

b =c * 10.0
f = e+b

Fase 6: Codegeneratie

Het genereren van code is de laatste en laatste fase van een compiler. Het krijgt input van code-optimalisatiefasen en produceert als resultaat de paginacode of objectcode. Het doel van deze fase is het toewijzen van opslagruimte en het genereren van verplaatsbare machinecode.
Het wijst ook geheugenlocaties toe voor de variabele. De instructies in de tussencode worden omgezet in machine-instructies. Deze fase omvat de optimalisatie- of tussencode in de doeltaal.
De doeltaal is de machinecode. Daarom worden tijdens deze fase ook alle geheugenlocaties en registers geselecteerd en toegewezen. De code die door deze fase wordt gegenereerd, wordt uitgevoerd om invoer te ontvangen en verwachte uitvoer te genereren.

Voorbeeld

a = b + 60.0
Zou eventueel vertaald kunnen worden naar registers.

MOVF a, R1
MULF #60.0, R2
ADDF R1, R2

Beheer van symbooltabellen

Een symbooltabel bevat voor elke identificator een record met velden voor de attributen van de identificator. Deze component maakt het voor de compiler gemakkelijker om het identificatierecord te doorzoeken en snel op te halen. De symbooltabel helpt u ook bij het scopebeheer. De symbooltabel en de foutafhandelaar werken overeenkomstig samen met alle fasen en de update van de symbooltabel.

Foutafhandelingsroutine

In het ontwerpproces van de compiler kunnen fouten optreden in alle hieronder gegeven fasen:

  • Lexicale analysator: Verkeerd gespelde tokens
  • Syntaxisanalysator: haakje ontbreekt
  • Tussencode generator: niet-overeenkomende operanden voor een operator
  • Code Optimizer: wanneer de instructie niet bereikbaar is
  • Code Generator: Wanneer het geheugen vol is of de juiste registers niet zijn toegewezen
  • Symbooltabellen: Fout van meerdere gedeclareerde identificatiegegevens

De meest voorkomende fouten zijn ongeldige tekenreeksen bij het scannen, ongeldige tokenreeksen bij het type, scopefout en parseren bij semantische analyse.
De fout kan optreden in een van de bovenstaande fasen. Na het vinden van fouten moet de fase de fouten aanpakken om door te gaan met het compilatieproces. Deze fouten moeten worden gerapporteerd aan de foutafhandelaar die de fout afhandelt om het compilatieproces uit te voeren. Over het algemeen worden de fouten gerapporteerd in de vorm van een bericht.

Samengevat

  • Compiler werkt in verschillende fasen. Elke fase transformeert het bronprogramma van de ene representatie naar de andere
  • Zes fasen van compilerontwerp zijn 1) Lexicale analyse 2) Syntaxisanalyse 3) Semantische analyse 4) Tussencode generator 5) Code-optimalisatie 6) Code Generator
  • Lexicale analyse is de eerste fase waarin de compiler de broncode scant
  • Bij syntaxisanalyse gaat het erom structuur in tekst te ontdekken
  • Semantische analyse controleert de semantische consistentie van de code
  • Zodra de semantische analysefase voorbij is, genereert de compiler tussencode voor de doelmachine
  • De code-optimalisatiefase verwijdert onnodige coderegels en regelt de volgorde van de instructies
  • De codegeneratiefase krijgt input uit de code-optimalisatiefase en produceert als resultaat de paginacode of objectcode
  • Een symbooltabel bevat voor elke identificator een record met velden voor de attributen van de identificator
  • Foutafhandelingsroutine verwerkt fouten en rapporten tijdens vele fasen