m4 (Computersprache) – Wikipedia

m4 ist ein Allzweck-Makroprozessor, der in den meisten Unix-ähnlichen Betriebssystemen enthalten ist und Bestandteil des POSIX-Standards ist.

Die Sprache wurde von Brian Kernighan und Dennis Ritchie für die Originalversionen von UNIX entwickelt. Es ist eine Erweiterung eines früheren Makroprozessors m3, geschrieben von Ritchie für einen unbekannten AP-3-Minicomputer.[1]

Der Makro-Präprozessor fungiert als Textersetzungswerkzeug. Es wird verwendet, um Textvorlagen wiederzuverwenden, typischerweise in Computerprogrammieranwendungen, aber auch in Textbearbeitungs- und Textverarbeitungsanwendungen. Die meisten Benutzer benötigen m4 als Abhängigkeit von GNU autoconf.

Geschichte[edit]

Makroprozessoren wurden populär, als Programmierer häufig Assemblersprache verwendeten. In jenen frühen Tagen der Programmierung stellten Programmierer fest, dass ein Großteil ihrer Programme aus wiederholtem Text bestand, und sie erfanden einfache Mittel zur Wiederverwendung dieses Textes. Programmierer entdeckten bald die Vorteile, nicht nur ganze Textblöcke wiederzuverwenden, sondern auch ähnliche Parameter durch unterschiedliche Werte zu ersetzen. Dies definierte den Verwendungsbereich von Makroprozessoren.

In den 1960er Jahren wurde ein früher Allzweck-Makroprozessor M.6 war in den AT & T Bell Laboratories im Einsatz, die von Douglas McIlroy, Robert Morris und Andrew Hall entwickelt wurden.[2]

Kernighan und Ritchie entwickelten m4 1977 auf der Grundlage der Ideen von Christopher Strachey. Zu den Unterscheidungsmerkmalen dieser Art der Makrovorverarbeitung gehörten:

  • Freiformsyntax (nicht zeilenbasiert wie ein typischer Makro-Präprozessor für die Assembler-Verarbeitung)
  • der hohe Grad der erneuten Erweiterung (die Argumente eines Makros werden zweimal erweitert: einmal während des Scannens und einmal zur Interpretationszeit)

Bei der Implementierung von Rational Fortran wurde m4 von Anfang an als Makro-Engine verwendet. und die meisten Unix-Varianten werden mitgeliefert.

Ab 2021[update] Viele Anwendungen verwenden m4 weiterhin als Teil der Autoconf des GNU-Projekts. Es wird auch im Konfigurationsprozess von sendmail (einem weit verbreiteten Mail-Transfer-Agenten) und zum Generieren von Footprints in der gEDA-Toolsuite angezeigt. Die SELinux-Referenzrichtlinie basiert stark auf dem m4-Makroprozessor.

m4 hat viele Verwendungsmöglichkeiten bei der Codegenerierung, aber (wie bei jedem Makroprozessor) können Probleme schwer zu debuggen sein.[3]

Eigenschaften[edit]

m4 bietet folgende Einrichtungen:

  • eine Freiformsyntax anstelle einer zeilenbasierten Syntax
  • ein hohes Maß an Makroerweiterung (Argumente werden während des Scans und erneut während der Interpretation erweitert)
  • Textersetzung
  • Parametersubstitution
  • Aufnahme von Dateien
  • String-Manipulation
  • bedingte Bewertung
  • arithmetische Ausdrücke
  • Systemschnittstelle
  • Programmierdiagnose
  • Programmiersprache unabhängig
  • menschliche Sprache unabhängig
  • bietet Programmiersprachenfunktionen

Im Gegensatz zu den meisten früheren Makroprozessoren zielt m4 nicht auf einen bestimmten Computer oder eine bestimmte menschliche Sprache ab. Historisch gesehen entstand seine Entwicklung jedoch aus der Unterstützung des Ratfor-Dialekts von Fortran. Im Gegensatz zu einigen anderen Makroprozessoren ist m4 sowohl Turing-vollständig als auch eine praktische Programmiersprache.

Nicht zitierte Bezeichner, die mit definierten Makros übereinstimmen, werden durch ihre Definitionen ersetzt. Durch das Platzieren von Bezeichnern in Anführungszeichen wird die Erweiterung möglicherweise erst später unterdrückt, z. B. wenn eine Zeichenfolge in Anführungszeichen als Teil der Makroersetzung erweitert wird. Im Gegensatz zu den meisten Sprachen werden Zeichenfolgen in m4 mit dem Backtick (`) als Startbegrenzer und dem Apostroph (‘) als Endbegrenzer in Anführungszeichen gesetzt. Durch getrennte Trennzeichen für Start und Ende kann die willkürliche Verschachtelung von Anführungszeichen in Zeichenfolgen verwendet werden. Auf diese Weise können Sie genau steuern, wie und wann die Makroerweiterung in verschiedenen Teilen einer Zeichenfolge erfolgt.

Beispiel[edit]

Das folgende Fragment enthält ein einfaches Beispiel, das Teil einer Bibliothek zum Generieren von HTML-Code sein kann. Es definiert automatisch ein kommentiertes Makro, um Abschnitte zu nummerieren:

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.

# 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. $1h2>')

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>

Die Verarbeitung dieses Codes mit m4 generiert den folgenden Text:

<HTML>
<h2>1. First Sectionh2>
<h2>2. Second Sectionh2>
<h2>3. Conclusionh2>
HTML>

Implementierungen[edit]

FreeBSD, NetBSD und OpenBSD bieten unabhängige Implementierungen der m4-Sprache. Darüber hinaus enthalten die Heirloom Project Development Tools eine kostenlose Version der m4-Sprache, die von OpenSolaris abgeleitet ist.

M4 wurde in das Inferno-Betriebssystem aufgenommen. Diese Implementierung ist enger mit dem ursprünglichen m4 verwandt, das von Kernighan und Ritchie in Version 7 Unix entwickelt wurde, als mit seinen anspruchsvolleren Verwandten in UNIX System V und POSIX.[4]

GNU m4 ist eine Implementierung von m4 für das GNU-Projekt.[5][6] Es wurde entwickelt, um viele Arten von willkürlichen Grenzen zu vermeiden, die in herkömmlichen m4-Implementierungen zu finden sind, wie z. B. maximale Zeilenlängen, maximale Größe eines Makros und Anzahl der Makros. Das Aufheben solcher willkürlichen Grenzen ist eines der erklärten Ziele des GNU-Projekts.[7]

Das GNU Autoconf-Paket nutzt die Funktionen von GNU m4 in großem Umfang.

GNU m4 wird derzeit von Gary V. Vaughan und Eric Blake gewartet.[5] GNU m4 wurde unter den Bedingungen der GNU General Public License veröffentlicht und ist freie Software.

Siehe auch[edit]

Verweise[edit]

  1. ^ Brian W. Kernighan und Dennis M. Ritchie. Der m4-Makroprozessor. Technischer Bericht, Bell Laboratories, Murray Hill, New Jersey, USA, 1977. pdf
  2. ^ Cole, AJ (1981). Makroprozessoren (2., überarbeitete Ausgabe). CUP-Archiv. p. 254.
  3. ^ Kenneth J. Turner. Ausnutzung der Makrosprache m4. Technischer Bericht CSM-126, Institut für Informatik und Mathematik, University of Stirling, Schottland, September 1994. pdf
  4. ^ m4(1) – Inferno General Befehle Handbuch
  5. ^ ein b GNU m4 Website “GNU M4”, abgerufen am 25. Januar 2020.
  6. ^ GNU m4 Handbuch, online und zum Herunterladen in HTML, PDF und anderen Formen. “GNU M4 – GNU Makroprozessor”, abgerufen am 25. Januar 2020.
  7. ^ “GNU-Codierungsstandards: Schreiben robuster Programme”. Zitat: “Vermeiden Sie willkürliche Grenzen für die Länge oder Anzahl von Datenstrukturen”.

Externe Links[edit]