# M4 (programmeertaal)

M4 (normaal gesproken geschreven met een kleine letter: m4) is een macroprocessor die door alle Unix-achtige besturingssystemen, waaronder GNU en Linux, gebruikt wordt en een onderdeel is van de POSIX-standaard. Verschillende UNIX-varianten gebruiken eigen implementaties van m4.
De taal is ontworpen door Brian Kernighan en Dennis Ritchie voor de originele versies van UNIX. Het is een uitbreiding van een eerdere macroprocessor m3, die door Ritchie was geschreven voor de AP-3-minicomputer.
De m4-taal is Turing-compleet, maar wordt voornamelijk door andere programma's gebruikt als macro-preprocessor voor het vervangen van stukken tekst in tekstbestanden. Het is een hulpmiddel voor het schrijven van computerprogramma's, maar kan ook gebruikt worden voor het bewerken van teksten en voor tekstverwerkers. GNU m4 wordt het meest gebruikt door GNU's autoconf.

## Geschiedenis

Macroprocessors waren populaire hulpmiddelen voor computerprogrammeurs in de tijd dat computers nog veel in assembleertaal geprogrammeerd moesten worden. In die vroege periode merkten programmeurs op dat grote delen van hun programma's uit herhaalde tekstblokken bestonden. Ze bedachten methoden voor eenvoudig hergebruik van deze tekstblokken omdat ze de voordelen inzagen van dit hergebruik en het vervangen van de waarden van parameters in die tekstblokken.
Kernighan en Ritchie ontwikkelden m4 in 1977, op basis van de ideeën van Christopher Strachey. De m4-macroprocessor onderscheidde zich door:
* free-form-syntax (niet regel-gebaseerd, zoals een typische preprocessor voor assembleertaalverwerking)
* de hoge mate van herexpansie (de argumenten voor macro's worden tweemaal uitgebreid: een keer tijdens het scannen en eenmaal tijdens de interpretatie)
M4 wordt veel toegepast voor het genereren van code, maar heeft (net als elke macroprocessor) als nadeel dat de gegenereerde code doorgaans moeilijk te debuggen is.

## Eigenschappen

M4 biedt systeemontwikkelaars de volgende faciliteiten:
* een vrije syntaxis in plaats van regelgebaseerde syntaxis
* een hoge mate van macro-expansie (argumenten worden tijdens het scannen uitgebreid en opnieuw tijdens de interpretatie)
* tekstvervanging
* parametersubstitutie
* bestandsinclusie
* stringmanipulatie
* voorwaardelijke evaluatie
* rekenkundige uitdrukkingen
* een systeeminterface
* programmeurdiagnostiek
* programmeertaalonafhankelijkheid
* onafhankelijkheid van mensentaal
* het biedt programmeertaalmogelijkheden
In tegenstelling tot de meeste oudere macroprocessors is m4 niet gericht op een speciale computertaal of menselijke taal. Historisch gezien is m4 voortgekomen uit de ontwikkeling van het Ratfor-dialect van Fortran. In tegenstelling tot sommige andere macroprocessors, is m4 Turing-compleet en een praktische programmeertaal.
Niet-gequote identifiers die overeenkomen met gedefinieerde macro's worden vervangen door hun definities. Het plaatsen van identifiers tussen aanhalingstekens stelt uitbreiding eventueel tot later uit, zoals wanneer een tekenreeks tussen aanhalingstekens wordt uitgebreid als onderdeel van macrovervanging. In tegenstelling tot de meeste talen worden strings in m4 gequoot met behulp van de backtick ( `) aan het begin en een apostrof ( ') aan het eind. Het gebruik van afzonderlijke eerste en laatste scheidingstekens maakt het mogelijk strings willekeurig te nesten. Daardoor wordt een hoge mate van controle verkregen over hoe en wanneer de macro-expansie van strings plaatsvindt.

## Voorbeeld

Het volgende fragment laat een voorbeeld zien van een onderdeel uit een bibliotheek voor het genereren van HTML-code. De m4-code definieert een macro om secties in een HTML-bestand automatisch te nummeren.
M4 beschikt over meerdere queues voor uitvoer. Tussen de queues kan geschakeld worden met de `divert'-macro.
De verwerking van bovenstaande code met m4 genereert de volgende tekst:

## Implementaties

FreeBSD, NetBSD, en OpenBSD leveren onafhankelijk van elkaar een zelfstandig ontwikkelde implementatie van de m4-taal. Bovendien zit in de Heirloom Project Development Tools een gratis versie van de m4-taal, afgeleid van OpenSolaris.

### GNU m4

GNU m4 is een implementatie van m4 voor het GNU-project. GNU m4 is ontworpen om verschillende, willekeurige maxima in traditionele m4-implementaties, zoals de maximale regellengten, de maximumgrootte van een macro en aantallen macro's te voorkomen. Het verwijderen van dergelijke, willekeurige grenzen is een van de gestelde doelen van het GNU-project.
GNU m4 wordt onderhouden door Gary V. Vaughan en Eric Blake en uitgegeven onder de voorwaarden van de GNU General Public License. GNU m4 is gratis software.