Macro processors became popular when
programmers commonly used
assembly language. In those early days of programming, programmers noted that much of their programs consisted of repeated text, and they invented simple means for reusing this text. Programmers soon discovered the advantages not only of reusing entire blocks of text, but also of substituting different values for similar parameters. This defined the usage range of macro processors at the time. In the 1960s, an early general-purpose macro processor, M6, was in use at
AT&T Bell Laboratories, which was developed by
Douglas McIlroy,
Robert Morris and Andrew Hall. Kernighan and Ritchie developed m4 in 1977, basing it on the ideas of
Christopher Strachey. The distinguishing features of this style of macro preprocessing included: • free-form syntax (not line-based like a typical macro preprocessor designed for assembly-language processing) • the high degree of re-expansion (a macro's arguments get expanded twice: once during scanning and once at interpretation time) The implementation of
Rational Fortran used m4 as its macro engine from the beginning, and most
Unix variants ship with it. many applications continue to use m4 as part of the
GNU Project's
autoconf. It also appears in the configuration process of
sendmail (a widespread
mail transfer agent) and for generating footprints in the
gEDA toolsuite. The
SELinux Reference Policy relies heavily on the m4 macro processor. m4 has many uses in
code generation, but (as with any macro processor) problems can be hard to debug. ==Features==