Movatterモバイル変換


[0]ホーム

URL:


Jump to content
WikipediaThe Free Encyclopedia
Search

m4 (computer language)

From Wikipedia, the free encyclopedia
General-purpose macro processor
m4
Paradigmmacro
Designed byBrian Kernighan,Dennis Ritchie
First appeared1977; 48 years ago (1977)
Majorimplementations
GNU m4

m4 is ageneral-purpose macro processor included in mostUnix-like operating systems, and is a component of thePOSIX standard.

The language was designed byBrian Kernighan andDennis Ritchie for the original versions ofUNIX. It is an extension of an earlier macro processor, m3, written by Ritchie for an unknown AP-3 minicomputer.[1]

The macropreprocessor operates as a text-replacement tool. It is employed to re-use text templates, typically incomputer programming applications, but also in text editing and text-processing applications. Most users require m4 as a dependency of GNUautoconf andGNU Bison.

History

[edit]

Macro processors became popular whenprogrammers commonly usedassembly 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.[2]

In the 1960s, an early general-purpose macro processor, M6, was in use atAT&T Bell Laboratories, which was developed byDouglas McIlroy,Robert Morris and Andrew Hall.[3]

Kernighan and Ritchie developed m4 in 1977, basing it on the ideas ofChristopher 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 ofRational Fortran used m4 as its macro engine from the beginning, and mostUnix variants ship with it.

As of 2024[update] many applications continue to use m4 as part of theGNU Project'sautoconf. It also appears in the configuration process ofsendmail (a widespread[citation needed]mail transfer agent) and for generating footprints in thegEDA toolsuite. TheSELinux Reference Policy relies heavily on the m4 macro processor.

m4 has many uses incode generation, but (as with any macro processor) problems can be hard to debug.[4]

Features

[edit]

m4 offers these facilities:

  • afree-form syntax, rather thanline-based syntax
  • a high degree of macro expansion (arguments get expanded during scan and again during interpretation)
  • text replacement
  • parameter substitution
  • file inclusion
  • string manipulation
  • conditional evaluation
  • arithmetic expressions
  • system interface
  • programmer diagnostics
  • programming language independent
  • human language independent
  • provides programming language capabilities

Unlike most earlier macro processors, m4 does not target any particular computer or human language; historically, however, its development originated for supporting theRatfor dialect ofFortran. Unlike some other macro processors, m4 isTuring-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 thebacktick (`) as the startingdelimiter, andapostrophe (') 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

[edit]

The following fragment gives a simple example that could form part of a library for generatingHTML 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, withthe default queue being 0. As an extension, GNU m4 supports morediversions, limited only by integer type size.Calling the `divert' macro with an invalid queue causes text to bediscarded until another call.  Note that even while output is beingdiscarded, quotes around `divert' and other macros are needed toprevent expansion.# Macros aren't expanded within comments, meaning that keywords such# as divert and other built-ins may be used without consequence.# HTML utility macro:define(`H2_COUNT', 0)# The H2_COUNT macro is redefined every time the H2 macro is used:define(`H2',`define(`H2_COUNT', incr(H2_COUNT))<h2>H2_COUNT. $1</h2>')divert(1)dnldnldnl The dnl macro causes m4 to discard the rest of the line, thusdnl preventing unwanted blank lines from appearing in the output.dnlH2(First Section)H2(Second Section)H2(Conclusion)dnldivert(0)dnldnl<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

[edit]

FreeBSD,NetBSD, andOpenBSD provide independent implementations of the m4 language. Furthermore, theHeirloom Project Development Tools includes a free version of the m4 language, derived fromOpenSolaris.

M4 has been included in theInferno operating system. This implementation is more closely related to the original m4 developed by Kernighan and Ritchie inVersion 7 Unix than its more sophisticated relatives inUNIX System V andPOSIX.[5]

GNU m4 is an implementation of m4 for theGNU Project.[6][7] 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.[8]

The GNUAutoconf package makes extensive use of the features of GNU m4.

GNU m4 is currently maintained by Gary V. Vaughan and Eric Blake.[6] GNU m4 isfree software, released under the terms of theGNU General Public License.

See also

[edit]

References

[edit]
  1. ^Brian W. Kernighan and Dennis M. Ritchie. The m4 macro processor. Technical report, Bell Laboratories, Murray Hill, New Jersey, USA, 1977.pdf
  2. ^History of GNU m4
  3. ^Hall, Andrew D. (1972).The M6 Macro Processor. Computing Science Technical Report #2(PDF) (Report). Bell Labs.
  4. ^Kenneth J. Turner. Exploiting the m4 macro language. Technical Report CSM-126, Department of Computing Science and Mathematics, University of Stirling, Scotland, September 1994.pdf
  5. ^m4(1) – Inferno General commandsManual
  6. ^abGNU m4 web site"GNU M4", accessed January 25, 2020.
  7. ^GNU m4 manual, online and for download in HTML, PDF, and other forms."GNU M4 — GNU macro processor", accessed January 25, 2020.
  8. ^"GNU Coding Standards: Writing Robust Programs".quote: "Avoid arbitrary limits on the length or number of any data structure".

External links

[edit]
The WikibookGuide to Unix has a page on the topic of:Commands
File system
Processes
User environment
Text processing
Shell builtins
Searching
Documentation
Software development
Miscellaneous

Retrieved from "https://en.wikipedia.org/w/index.php?title=M4_(computer_language)&oldid=1297537184"
Categories:
Hidden categories:

[8]ページ先頭

©2009-2025 Movatter.jp