M4 (computer language)
m4 is a general-purpose macro processor included in most Unix-like operating systems, and is a component of the POSIX standard. The language was designed by Brian Kernighan and Dennis Ritchie for the original versions of UNIX. It is an extension of an earlier macro processor, m3, written by Ritchie for an unknown AP-3 minicomputer. The macro preprocessor operates as a text-replacement tool. It is employed to re-use text templates, typically in computer programming applications, but also in text editing and text-processing applications. Most users require m4 as a dependency of GNU autoconf . History. 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. In the 1960s, an early general-purpose macro processor, M, 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: The implementation of Rational Fortran used m4 as its macro engine from the beginning; and most Unix variants ship with it. m4 has many uses in code generation, but (as with any macro processor) problems can be hard to debug. Features. m4 offers these facilities: Unlike most earlier macro processors, m4 does not target any particular computer or human language; historically, however, its development originated for supporting the Ratfor dialect of Fortran. Unlike some other macro processors, m4 is Turing -complete as well as a practical programming language. Unquoted identifiers which match defined macros are replaced with their definitions. Placing identifiers in quotes suppresses expansion until possibly later, such as when a quoted string is expanded as part of macro replacement. Unlike most languages, strings in m4 are quoted using the backtick (`) as the starting delimiter, and apostrophe (') as the ending delimiter. Separate starting and ending delimiters allows the arbitrary nesting of quotation marks in strings to be used, allowing a fine degree of control of how and when macro expansion takes place in different parts of a string . Example. The following fragment gives a simple example that could form part of a library for generating HTML code. It defines a commented macro to number sections automatically: divert(-1) m4 has multiple output queues that can be manipulated with the `divert' macro. Valid queues range from 0 to 10, inclusive, with the default queue being 0. As an extension, GNU m4 supports more diversions, limited only by integer type size. Calling the `divert' macro with an invalid queue causes text to be discarded until another call. Note that even while output is being discarded, quotes around `divert ' and other macros are needed to prevent expansion. define(`H2_COUNT', 0) define(`H2', divert(1)dnl dnl dnl The dnl macro causes m4 to discard the rest of the line, thus dnl preventing unwanted blank lines from appearing in the output. dnl H2(First Section) H2(Second Section) H2(Conclusion) dnl divert(0)dnl dnl <HTML> undivert(1)dnl One of the queues is being pushed to output. </HTML> Processing this code with m4 generates the following text: <HTML> <h2>1. First Section</h2> <h2>2. Second Section</h2> <h2>3. Conclusion</h2> </HTML> Implementations. FreeBSD, NetBSD, and OpenBSD provide independent implementations of  the m4 language. Furthermore, the Heirloom Project Development Tools includes a free version of the m4 language, derived from OpenSolaris. M4 has been included in the Inferno operating system. This implementation is more closely related to the original m4 developed by Kernighan and Ritchie in Version 7 Unix than its more sophisticated relatives in UNIX System V and POSIX. "GNU m4" is an implementation of m4 for the GNU Project. It is designed to avoid many kinds of arbitrary limits found in traditional m4 implementations, such as maximum line lengths, maximum size of a macro and number of macros. Removing  such arbitrary limits is one of the stated goals of the GNU Project. The GNU Autoconf package makes extensive use of the features of GNU m4. GNU m4 is currently maintained by Gary V. Vaughan and Eric Blake. Released under the terms of the GNU General Public License, GNU m4 is free software.