De definitie en het doel van een compiler

Een compiler is een programma dat door de mens leesbare broncode vertaalt in computer-uitvoerbare machinecode. Om dit met succes te doen, moet de door mensen leesbare code voldoen aan de syntaxisregels van de programmeertaal waarin deze is geschreven. De compiler is slechts een programma en kan uw code niet voor u repareren. Als je een fout maakt, moet je de syntaxis corrigeren, anders compileert deze niet.

Wat gebeurt er als u code compileert?

De complexiteit van een compiler hangt af van de syntaxis van de taal en hoeveel abstractie die programmeertaal biedt. Een C-compiler is veel eenvoudiger dan een compiler voor C ++ of C #.

Lexicale analyse

Tijdens het compileren leest de compiler eerst een stroom tekens uit een broncodebestand en genereert een stroom lexicale tokens. Bijvoorbeeld de C ++ code:

int C = (A * B) +10;

kan worden geanalyseerd als deze tokens:

  • typ "int"
  • variabele "C"
  • gelijken
  • leftbracket
  • variabele "A"
  • keer
  • variabele "B"
  • rightbracket
  • plus
  • letterlijke "10"

Syntactische analyse

De lexicale uitvoer gaat naar het syntactische analysatorgedeelte van de compiler, die de grammaticaregels gebruikt om te beslissen of de invoer geldig is of niet. Tenzij variabelen A en B eerder zijn gedeclareerd en binnen bereik waren, zou de compiler kunnen zeggen:

  • 'A': niet-aangegeven ID.

Als ze zijn aangegeven maar niet zijn geïnitialiseerd. de compiler geeft een waarschuwing:

  • lokale variabele 'A' gebruikt zonder te worden geïnitialiseerd.

Negeer compilerwaarschuwingen nooit. Ze kunnen je code op rare en onverwachte manieren breken. Corrigeer altijd compilerwaarschuwingen.

Eén pas of twee?

Sommige programmeertalen zijn zo geschreven dat een compiler de broncode slechts eenmaal kan lezen en de machinecode kan genereren. Pascal is zo'n taal. Veel compilers vereisen ten minste twee passen. Soms komt dit door voorwaartse verklaringen van functies of klassen.

In C ++ kan een klasse worden gedeclareerd maar pas later worden gedefinieerd. De compiler kan pas achterhalen hoeveel geheugen de klas nodig heeft als hij de body van de klas compileert. Het moet de broncode opnieuw lezen voordat de juiste machinecode wordt gegenereerd.

Machinecode genereren

Ervan uitgaande dat de compiler de lexicale en syntactische analyses met succes voltooit, is de laatste fase het genereren van machinecode. Dit is een ingewikkeld proces, vooral met moderne CPU's.