1.2 歴史的な参考文献
マクロ言語はコンピューティングの歴史の初期に考案されました。1950年代、Alan Perlisはマクロ言語を処理対象の言語から独立させることを提案しました。条件付きマクロ、再帰マクロ、マクロを使って他のマクロを定義する技法は、Bell LabsのDoug McIlroyが「Macro Instruction Extensions of Compiler Languages」、Communications of the ACM 3, 4(1960年)、214–20、https://dl.acm.org/doi/10.1145/367177.367223で説明しています。
m4の重要な先駆けはGPMです。C. Stracheyの「A general purpose macrogenerator」、Computer Journal 8, 3(1965年)、225–41、https://academic.oup.com/comjnl/article/8/3/225/336044を参照してください。GPMはDavid Griesの著書Compiler Construction for Digital Computers、Wiley(1971年)にも簡潔に説明されています。Stracheyは優れたプログラマで、GPMは250個の機械命令に収まりました。
1968年にStracheyの研究室を訪れた際、GPMに着想を得たMcIlroyは、Snobol 3のコード1ページに収まるモデルとなるプリプロセッサを書きました。その後、McIlroyとRobert MorrisはBell Labsで一連の後続モデルを開発しました。Andrew D. Hallはそれに続いて、数式処理システムAltranのFortranソースコードを移植するための汎用マクロプロセッサM6を開発しました。Hallの「The M6 Macro Processor」、Computing Science Technical Report #2、Bell Labs(1972年)、http://cm.bell-labs.com/cm/cs/cstr/2.pdfを参照してください。M6のソースコードは約600個のFortran文で構成されていました。その名前が、m4系統の最初のものになりました。
Brian KernighanとP.J. Plaugerの著書Software Tools、Addison-Wesley(1976年)は、Unixのマクロプロセッサ言語を説明し、実装しています。これに着想を得たDennis Ritchieは、AP-3ミニコンピュータ向けのマクロプロセッサm3を書きました。
その後KernighanとRitchieは協力し、オリジナルのm4を開発しました。これは「The M4 Macro Processor」、Bell Laboratories(1977年)、https://wolfram.schneider.org/bsd/7thEdManVol2/m4/m4.pdfで説明されています。組み込みマクロはわずか21個でした。
GPMはより純粋でしたが、m4は実際の利用で生じる複雑さに対応するように作られています。たとえば、あらかじめ宣言しなくてもマクロを認識でき、空白や行末を読み飛ばしやすく、他の構成から導出する代わりに組み込みで用意された構成が多い、といった点です。
当初、KernighanとPlaugerのマクロプロセッサ、続いてm3は、Rational FORTRANプリプロセッサ、すなわちRatforにとってのcppに相当する処理系の中核となりました。その後、m4はRatfor、C、Cobolのフロントエンドに使われました。
René Seindalは1990年、多くの従来のm4実装にあった最大行長、マクロサイズ、マクロ数などの人為的な制限を取り除くことを目指し、自身によるm4実装であるGNU m4を公開しました。
故A. Dain Samples教授は、さらに発展させたM5を説明・実装しました。「User’s Guide to the M5 Macro Language: 2nd edition」、comp.compilersニュースグループでの電子的な告知(1992年)を参照してください。
François Pinardは1992年にGNU m4の保守を引き継ぎ、1994年にGNU m4 1.4をリリースするまで担当しました。1.4は10年間にわたって安定版でした。この時期にGNU Autoconfは、他のすべてのm4実装には制限が多すぎるとして、基盤の処理系にGNU m4を必須とすることを決めました。
より最近では、2004年にPaul Eggertが1.4.1と1.4.2をリリースし、長年使われてきた1.4に残っていたバグを修正しました。続いて2005年、Gary V. Vaughanはネット上に散在していたGNU m4 1.4用の多数のパッチをまとめ、1.4.3と1.4.4をリリースしました。2006年にはEric Blakeがチームに加わり、1.4.5のリリースに向けたパッチを用意しました。その後もリリースは続き、近年では2025年に1.4.20がリリースされています。
一方、m4の動的モジュール読み込みや追加の組み込み機能など、新機能の開発も続いています。完成すると、GNU m4 2.0から新しいリリース系列が始まります。