Een codegenerator is een stuk software dat tot doel heeft bron-, markup- of objectcode aan te maken (te genereren) op basis van een abstracte beschrijving. Dit kan zowel een invoerbestand in een of ander formaat zijn, maar ook de interne representatie van een (deel van een) programma of bibliotheek in het werkgeheugen van een compiler. Deze techniek wordt veelal gebruikt om grote tabellen te genereren in talen zoals C of C++, maar vormt ook een vast onderdeel van compilers.

Broncode bewerken

Vooral grote tabellen, die intern zijn gestructureerd in bijvoorbeeld een boomstructuur, zijn erg foutgevoelig als deze door softwareontwikkelaars "met de hand" worden geïmplementeerd, niet alleen omdat het soms grote hoeveelheden gegevens betreft, maar ook omdat het, door repetitie van tamelijk nietszeggende symbolen, zeer saai werk is en fouten moeilijk op te sporen zijn. Om dit te voorkomen wordt de tabel in een handzaam en vooral leesbaar formaat geschreven waarna een codegenerator deze informatie omzet naar broncode. Omdat het grootste en foutgevoeligste deel is geautomatiseerd, treden veel minder fouten op. De codegenerator zelf is doorgaans in een functionele of macrotaal geïmplementeerd, bijvoorbeeld Python, Perl, sed of M4. Op deze manier kan veel tijd en frustratie worden bespaard.

Objectcode bewerken

Codegeneratoren zijn eveneens een vast onderdeel van compilers die tot taak hebben de uiteindelijke objectcode, maar soms ook (geannoteerde) assembly aan te maken uit een interne beschrijving van het programma of de bibliotheek. Als zodanig is codegeneratie de laatste stap van het compilatieproces. Door een compiler van verschillende codegeneratoren met een gemeenschappelijke interface te voorzien, kan objectcode voor verschillende processoren worden aangemaakt, zodat crosscompilatie mogelijk is. In dit verband spreekt men van een compiler back-end.

Voorbeelden bewerken

Een aantal bekende voorbeelden zijn:

  • Lex, genereert broncode voor een lexical analyzer
  • Yacc, genereert broncode voor een parser
  • XSLT, genereert (o.a.) HTML op basis van XML-documenten.
  • GCC maakt gebruik van diverse backends om een grote variëteit aan processors te ondersteunen.