Fasen van compiler met voorbeeld

Inhoudsopgave:

Anonim

Wat zijn de fasen van het ontwerp van een compiler?

Compiler werkt in verschillende fasen, elke fase transformeert het bronprogramma van de ene weergave naar de andere. Elke fase neemt input van de vorige fase en voert zijn 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. Tussenliggende codegenerator
  5. Code optimalisatie
  6. Code generator
Fasen van de compiler

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

In deze tutorial leer je:

  • Wat zijn de fasen van het ontwerp van een compiler?
  • Fase 1: Lexicale analyse
  • Fase 2: syntaxisanalyse
  • Fase 3: semantische analyse
  • Fase 4: Tussentijdse codegeneratie
  • Fase 5: code-optimalisatie
  • Fase 6: codegeneratie
  • Symbooltabelbeheer
  • Foutafhandelingsroutine:

Fase 1: Lexicale analyse

Lexicale analyse is de eerste fase waarin de compiler de broncode scant. Dit proces kan van links naar rechts, karakter voor karakter, en deze karakters in tokens worden gegroepeerd.

Hier wordt de karakterstroom van het bronprogramma gegroepeerd in zinvolle reeksen door de tokens te identificeren. Het voert de corresponderende tickets in de symbolentabel in en geeft dat token door aan de volgende fase.

De belangrijkste functies van deze fase zijn:

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

Voorbeeld :

x = y + 10

Munten

X identifier
Toewijzingsoperator
Y identifier
Optellen operator
10 Aantal

Fase 2: syntaxisanalyse

Syntaxisanalyse heeft alles te maken met het ontdekken van structuur in code. Het bepaalt of een tekst al dan niet het verwachte formaat volgt. Het belangrijkste doel van deze fase is om 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 samen te stellen met behulp van tokens. Het bepaalt ook de structuur van de brontaal en 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 uitdrukking 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 identifier is en y + 10 is een uitdrukking, dan is x = y + 10 een statement.

Overweeg de ontledingsboom voor het volgende voorbeeld

(a+b)*c

In Parse Tree

  • Binnenknooppunt: record met een gearchiveerde operator en twee bestanden voor kinderen
  • Leaf: records met 2 / meer velden; een voor token en andere informatie over het token
  • Zorg ervoor dat de componenten van het programma zinvol bij elkaar passen
  • Verzamelt type-informatie en controleert op typecompatibiliteit
  • Cheque-operanden 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. Het controleert ook of de code een passende betekenis heeft.

Semantic Analyzer controleert op niet-overeenkomende typen, incompatibele operanden, een functie die wordt aangeroepen met onjuiste argumenten, een niet-gedeclareerde variabele, enz.

Functies van de semantische analysefase zijn:

  • Helpt u verzamelde type-informatie op te slaan en op te slaan in een symbooltabel of syntaxisboom
  • Hiermee kunt u typecontrole uitvoeren
  • In het geval van een type-mismatch, waar er geen exacte typecorrectieregels zijn die voldoen aan de gewenste bewerking, 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 typeert de semantische analysator het gehele getal 30 om 30,0 te laten zweven 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 of andere abstracte machine.

Tussenliggende code bevindt zich tussen de taal op hoog niveau en op machineniveau. Deze tussencode moet zo worden gegenereerd dat deze gemakkelijk kan worden vertaald naar de doelmachinecode.

Functies bij het genereren van tussenliggende codes:

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

Voorbeeld

Bijvoorbeeld,

total = count + rate * 5

Tussenliggende code met behulp van de adrescodemethode is:

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

Fase 5: code-optimalisatie

De volgende fase is code-optimalisatie of tussencode. Deze fase verwijdert onnodige coderegels en rangschikt de volgorde van instructies om de uitvoering van het programma te versnellen zonder middelen te verspillen. Het belangrijkste doel van deze fase is om de tussencode te verbeteren om een ​​code te genereren die sneller werkt en minder ruimte inneemt.

De belangrijkste functies van deze fase zijn:

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

Voorbeeld:

Beschouw de volgende code

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

Kan worden

b =c * 10.0f = e+b

Fase 6: codegeneratie

Codegeneratie 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 om opslag toe te wijzen en verplaatsbare machinecode te genereren.

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 mogelijk worden vertaald naar registers.

MOVF a, R1MULF #60.0, R2ADDF R1, R2

Symbooltabelbeheer

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

Foutafhandelingsroutine:

In het ontwerpproces van de compiler kan er een fout optreden in alle onderstaande fasen:

  • Lexicale analysator: verkeerd gespelde tokens
  • Syntaxisanalysator: haakje ontbreekt
  • Tussenliggende codegenerator: niet-overeenkomende operanden voor een operator
  • Code Optimizer: wanneer de verklaring niet bereikbaar is
  • Codegenerator: onbereikbare uitspraken
  • Symbooltabellen: fout van meerdere gedeclareerde ID's

De meest voorkomende fouten zijn ongeldige tekenreeks bij het scannen, ongeldige tokenreeksen in type, bereikfout en parsering bij semantische analyse.

De fout kan optreden in elk van de bovenstaande fasen. Na het vinden van fouten, moet de fase de fouten afhandelen om door te gaan met het compilatieproces. Deze fouten moeten worden gerapporteerd aan de foutbehandelaar die de fout afhandelt om het compilatieproces uit te voeren. Over het algemeen worden de fouten gerapporteerd in de vorm van een bericht.

Overzicht

  • Compiler werkt in verschillende fasen, elke fase transformeert het bronprogramma van de ene weergave naar de andere
  • Zes fasen van het compilerontwerp zijn 1) Lexicale analyse 2) Syntaxisanalyse 3) Semantische analyse 4) Tussenliggende codegenerator 5) Code-optimalisator 6) Codegenerator
  • Lexicale analyse is de eerste fase waarin de compiler de broncode scant
  • Syntaxisanalyse heeft alles te maken met het ontdekken van structuur in tekst
  • Semantische analyse controleert de semantische consistentie van de code
  • Zodra de semantische analysefase voorbij de compiler is, genereert u tussencode voor de doelmachine
  • Code-optimalisatiefase verwijdert onnodige coderegels en rangschikt de volgorde van instructies
  • De codegeneratiefase krijgt input van de code-optimalisatiefase en produceert als resultaat de paginacode of objectcode
  • Een symbolentabel bevat een record voor elke identifier met velden voor de attributen van de identifier
  • Foutafhandelingsroutine behandelt fouten en rapporten tijdens vele fasen