Az m4 egy általános célú makrófeldolgozó, amely a legtöbb Unix-szerű operációs rendszerben megtalálható, és a POSIX szabvány összetevője.
A nyelvet Brian Kernighan és Dennis Ritchie tervezte a UNIX eredeti verzióihoz. Ez egy korábbi makrófeldolgozó, az m3 kiterjesztése, amelyet Ritchie írt egy ismeretlen AP-3 miniszámítógéphez.Brian W. Kernighan and Dennis M. Ritchie. The m4 macro processor. Technical report, Bell Laboratories, Murray Hill, New Jersey, USA, 1977. pdf
A makró-előfeldolgozó szöveghelyettesítő eszközként működik. Szövegsablonok újrafelhasználására használják, jellemzően számítógépes programozási alkalmazásokban, de szövegszerkesztő és szövegfeldolgozó alkalmazásokban is. A legtöbb felhasználónak az m4-re a GNU autoconf és a GNU bison függőségeként van szüksége.
Története A makróprocesszorok akkor váltak népszerűvé, amikor a programozók általánosan használták az assembly nyelvet. A programozás kezdeti időszakában a programozók felfigyeltek arra, hogy programjaik nagy része ismétlődő szövegből áll, és egyszerű módszereket találtak ki ennek a szövegnek az újrafelhasználására. A programozók hamarosan felfedezték nemcsak a teljes szövegblokkok újrafelhasználásának előnyeit, hanem a hasonló paraméterek különböző értékekkel való helyettesítését is. Ez határozta meg a makróprocesszorok felhasználási körét akkoriban.
Az 1960-as években az AT&T Bell Laboratories egy korai általános célú makróprocesszort, az M6-ot használták, amelyet Douglas McIlroy, Robert Morris és Andrew Hall fejlesztett ki.
Kernighan és Ritchie 1977-ben fejlesztették ki az m4-et, Christopher Strachey ötleteire alapozva. A makró-előfeldolgozás ezen stílusának megkülönböztető jellemzői a következők voltak: szabad formátumú szintaxis (nem soralapú, mint egy tipikus, assembly nyelvű feldolgozáshoz tervezett makróelőfeldolgozó) a nagyfokú újrabővítés (a makró argumentumai kétszer bővülnek ki: egyszer a beolvasás során, egyszer pedig az értelmezés során)
A Rational Fortran implementációja kezdettől fogva az m4-et használta makrómotorként, és a legtöbb Unix-variáns is ezzel érkezik.
2024-től számos alkalmazás továbbra is az m4-et használja a GNU Projekt autoconf részeként. Megjelenik a sendmail (egy széles körben elterjedt levéltovábbító ügynök) konfigurációs folyamatában és a gEDA eszközkészlet lábnyomainak generálásához is. A SELinux referenciaházirend nagymértékben támaszkodik az m4 makróprocesszorra.
Az m4-nek számos felhasználási módja van a kódgenerálásban, de (mint minden makróprocesszor esetében) a problémákat nehéz lehet hibakeresni.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
Jellemzők Az m4 a következő szolgáltatásokat kínálja: szabad formátumú szintaxis a soralapú szintaxis helyett nagyfokú makróbővítés (az argumentumok kibővülnek a vizsgálat során, majd az értelmezés során is) szövegcsere paraméterhelyettesítés fájlbeillesztés karakterlánc-manipuláció feltételes kiértékelés aritmetikai kifejezések rendszerinterfész programozói diagnosztika programozási nyelvtől független emberi nyelvtől független programozási nyelvi képességeket biztosít
A legtöbb korábbi makróprocesszorral ellentétben az m4 nem céloz meg semmilyen konkrét számítógépet vagy emberi nyelvet; történelmileg azonban a fejlesztése a Fortran Ratfor dialektusának támogatására irányult. Néhány más makróprocesszorral ellentétben az m4 Turing-teljes, valamint egy praktikus programozási nyelv.
Az idézőjelek között nem szereplő azonosítók, amelyek megegyeznek a definiált makrókkal, a definíciójukkal helyettesítődnek. Az azonosítók idézőjelek közé helyezése a kibontást esetleg későbbi időpontig gátolja, például amikor egy idézőjelek között lévő karakterláncot a makrócsere részeként kibővítünk. A legtöbb nyelvvel ellentétben az m4-ben a karakterláncok idézőjelei a backtick (`) kezdő, és az aposztróf (') záró elválasztójellel vannak ellátva. A külön kezdő és záró elválasztójelek lehetővé teszik az idézőjelek tetszőleges beágyazását a karakterláncokban, ami finoman szabályozza, hogy a makrókibontás hogyan és mikor történjen a karakterlánc különböző részein.
Példa A következő kódrészlet egy egyszerű példát mutat be, amely egy HTML kód generálására szolgáló könyvtár részét képezheti. Egy kommentált makrót definiál a szakaszok automatikus számozásához:
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. $1</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>
A kód m4-gyel történő feldolgozása a következő szöveget generálja:
<HTML> <h2>1. First Section</h2> <h2>2. Second Section</h2> <h2>3. Conclusion</h2> </HTML>
Implementációk FreeBSD, NetBSD és OpenBSD az m4 nyelv független implementációit biztosítják. Továbbá a Heirloom Project fejlesztőeszközök tartalmazzák az m4 nyelv egy ingyenes verzióját, amely az OpenSolaris-ból származik.
Az M4 bekerült az Inferno operációs rendszerbe. Ez az implementáció szorosabban kapcsolódik a Kernighan és Ritchie által a Unix 7-es verziója alatt fejlesztett eredeti m4-hez, mint kifinomultabb rokonaihoz a UNIX System V és POSIX rendszerben.<ref> – Inferno – General commands Manual<ref>
A GNU m4 az m4 egy implementációja a GNU Projekt számára.GNU m4 web site "GNU M4" , accessed January 25, 2020.GNU m4 manual, online and for download in HTML, PDF, and other forms. "GNU M4 — GNU macro processor" , accessed January 25, 2020. Úgy tervezték, hogy elkerülje a hagyományos m4 implementációkban található számos önkényes korlátozást, például a maximális sorhosszt, a makrók maximális méretét és a makrók számát. Az ilyen önkényes korlátozások eltávolítása a GNU Projekt egyik kimondott célja."GNU Coding Standards: Writing Robust Programs" . quote: "Avoid arbitrary limits on the length or number of any data structure".
A GNU Autoconf csomag széles körben használja a GNU m4 funkcióit.
A GNU m4-et jelenleg Gary V. Vaughan és Eric Blake karbantartja. A GNU m4 egy szabad szoftver, amely a GNU General Public License feltételei szerint kerül kiadásra.
Jegyzetek
Fordítás
További információk GNU m4 weboldal GNU m4 kézikönyv m4 oktatóanyag Makró mágia: m4, első és második rész
Kapcsolódó szócikkek awk C előfordító Makró Make
Kategória:Programozási nyelvek Kategória:Scriptnyelvek Kategória:Unix-parancsok