title: M4 (programmeertaal)
text: 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. 
  divert(-1)
  
  Geldige nummers voor de queues variëren van 0 tot 10, inclusief de queue
  voor standaard output met nummer 0.
  
  Het aanroepen van de `divert'-macro met een ongeldige queue zorgt ervoor dat 
  de uitvoer verdwijnt totdat de uitvoer naar een geldige queue wordt omgeleid.
  Merk op dat zelfs wanneer de output wordt weggegooid, er quotes rond `divert'
  en andere macro's nodig zijn om expansie te voorkomen.
  
  # Macro's worden niet uitgebreid in comments, zodat ingebouwde keywords,
  # zoals divert, comments zonder gevolgen gebruikt kunnen worden.
  
  # De HTML-utility macro H2_COUNT:
  
  define(`H2_COUNT', 0)
  
  # De H2_COUNT-macro wordt elke keer opnieuw gedefinieerd als de H2-macro wordt
  # gebruikt:
  
  define('H2',
     `define(`H2_COUNT', incr(H2_COUNT))<h2>H2_COUNT. $1</h2> ')
  
  divert(1)dnl
  dnl
  dnl De dnl-macro zorgt dat m4 de rest van de regel weggooit, waardoor wordt
  dnl voorkomen dat ongewenste lege regels weergegeven worden in de output.
  dnl
  H2(Eerste sectie)
  H2(Tweede sectie)
  H2(Conclusie)
  dnl
  divert(0)dnl
  dnl
  <HTML>
  undivert(1)dnl Een van de queues wordt op de output-queue geduwd.
  </HTML>
  De verwerking van bovenstaande code met m4 genereert de volgende tekst:
  <HTML>
  <h2>1. Eerste Sectie</h2>
  <h2>2. Tweede Sectie</h2>
  <h2>3. Conclusie</h2>
  </HTML>
  
  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.
  
  Externe links
    GNU m4 website
    m4 tutorial
    Linux magazine: Macro Magic: m4, Part One en Part Two
  
  Programmeerhulpmiddel