(Fr.: compilateur; Du.: Übersetzer; Eng.: compiler), een vertaalprogramma bij een gegeven hogere programmeertaal dat een programma in die taal omzet naar een programma in een andere taal.
Bij een vertaalprogramma ofwel vertaler behoort een bepaalde brontaal en een bepaalde doeltaal; de vertaler accepteert als invoer een programma in de brontaal (bronprogramma); de uitvoer bestaat uit een gelijkwaardig programma in de doeltaal (doelprogramma). Twee programma’s heten gelijkwaardig als ze bij dezelfde invoer altijd dezelfde uitvoer opleveren.
Vertalers worden onderscheiden in assemblers en compilers: een assembler is een vertaler met als brontaal de assembleertaal van een computersysteem; een compiler een vertaler met als brontaal een hogere programmeertaal zoals Algol 60, Algol 68, Pascal, Fortran, Cobol en PL1. Het doel van een compiler is het vertalen van een programma in een gegeven taal naar een taal waarin het kan worden uitgevoerd. Een programma in machinetaal wordt uitgevoerd door de hardware, in een andere taal door een interpretatieprogramma dat een computersysteem simuleert, d.w.z. het analyseert telkens de aan de beurt zijnde opdracht en voert deze na herkenning uit. Door de gecompliceerde structuur van programma’s in hogere programmeertalen laten deze zich meestal niet gemakkelijk interpreteren en worden zij meestal eerst vertaald naar een taalniveau waarop interpretatie wel eenvoudig mogelijk is.
In het geval dat een machinetaal optreedt als doeltaal, wordt het vertaalproces veelal in twee hoofdstappen verdeeld. Tijdens de eerste stap wordt het programma in de brontaal vertaald naar een gelijkwaardig programma in een zgn. tussentaal; in de tweede stap wordt dat laatste vertaald naar een gelijkwaardig programma in machinetaal. Het doel van de tussentaal is een brug te slaan tussen de hogere programmeertaal en de machinetaal. Enerzijds moet het mogelijk zijn gecompliceerde taalstructuren in de hogere programmeertaal uit te drukken in meer elementaire opdrachten in de tussentaal. Anderzijds moet de tussentaal zodanig gestructureerd zijn dat programma's in de tussentaal zonder al te veel moeite kunnen worden vertaald naar de machinetaal.
Wanneer gebruik wordt gemaakt van een interpretatieprogramma, eindigt het compilatieproces bij een tussen de hogere programmeertaal en de machinetaal in staande tussentaal. Aan deze tussentaal stelt men net als in het eerste geval weer de eis dat een programma in de hogere taal zich goed in de tussentaal laat uitdrukken. Anderzijds moet de tussentaal zo gestructureerd zijn, dat een programma in de tussentaal eenvoudig interpreteerbaar is. Aan het compilatieproces kunnen twee aspecten worden onderscheiden: de analyse van het bronprogramma en de samenstelling van het doelprogramma; uitgangspunten zijn de definities van brontaal en doeltaal. De taaldefinitie is vastgelegd in de syntax en de semantiek (zie Programmeertaal); het analyseproces wordt dan ook onderscheiden in de syntactische en de semantische analyse. Aan dit analyseproces gaat echter de zgn. lexicografische analyse vooraf.
Onder de lexicografische analyse wordt verstaan: het herkennen van woorden in een rij letters en andere tekens. De syntax gaat uit van basissymbolen; veelal worden per basissymbool verscheidene tekens gebruikt. De syntactische analyse gaat uit van een eigen interne representatie waarin onder meer alle basissymbolen in een codering van uniform formaat zijn weergegeven. De lexicografische analysator verzorgt de vertaling van de door de programmeur gehanteerde representatie van basissymbolen naar de door de syntactische analysator geaccepteerde representatie. Tijdens de lexicografische analyse worden spaties en commentaar genegeerd, zodat het resulterende programma bestaat uit een rij basissymbolen.
Syntactische analyse bestaat uit het onderzoek of een als programma aangeboden rij symbolen syntactisch correct is en het bepalen van de structuur in termen van de syntax. Juist doordat de syntax sterk is geformaliseerd, zijn op het gebied van de syntactische analyse veel wetenschappelijke resultaten geboekt. Wanneer de syntax is gegeven als een generatief schema bestaat de syntactische analyse uit het onderzoek hoe de aangeboden rij volgens de syntax kan worden gegenereerd. Steeds wanneer de analysator een syntactische constructie heeft herkend, wordt een semantische routine aangeroepen, die de desbetreffende taalconstructie semantisch analyseert.
Semantische analyse bestaat uit het onderzoek naar de betekenis van een syntactisch herkende taalconstructie. De semantische routine bepaalt dus welke acties met de desbetreffende taalconstructie bedoeld worden. Op grond hiervan roept de semantische routine een code-genererende routine aan die opdrachten in de doeltaal genereert die dezelfde acties weergeven. Het schrijven van een compiler vergt vele manjaren. Om deze taak te vereenvoudigen en te bekorten zijn zgn. translator writing systems ontwikkeld; onderdelen daarvan zijn programma’s die bij een gegeven syntax een analysator genereren of hulptabellen construeren. Een translator writing system kan ook bestaan uit de definitie van een realisatietaal, waarin men zeer goed een compiler kan beschrijven; een voorwaarde is dat voor bepaalde computersystemen compilers beschikbaar zijn die de nieuw ontworpen compiler in deze realisatietaal vertalen naar de machinetaal van zo’n systeem. Omdat in zo’n geval een compiler wordt gecompileerd, spreekt men wel van een compiler-compiler. De meer officieel aanvaarde definitie van een compiler-compiler is echter meer idealistisch geformuleerd als; een hulpmiddel dat gegeven een formele definitie van de brontaal en een formele beschrijving van de machine, een compiler voor die brontaal op die machine produceert. Echter, juist omdat de formalisering van de semantiek nog niet voldoende ver is gevorderd, mag men op korte termijn nog geen al te hoge verwachtingen koesteren.