GNU M4 历史

167 阅读3分钟

1.2 历史参考 宏语言在计算机历史初期就被发明了。20世纪50年代,艾伦·佩利斯建议宏语言应独立于正在处理的语言。道格·麦克罗伊(Doug McIlroy)在贝尔实验室(Bell Labs)的“编译器语言的宏指令扩展”(Communications of the ACM 3, 4 (1960), 214-20, dl.acm.org/doi/10.1145…

m4的一个重要前身是GPM;请参见C. Strachey的“A general purpose macrogenerator”(《计算机期刊》第8卷,第3期(1965),225-41,academic.oup.com/comjnl/arti… Gries)的《数字计算机编译器构建》一书中简洁地描述了,Wiley(1971)。Strachey是一位杰出的程序员:GPM只占用了250条机器指令!

受GPM的启发,麦克罗伊在1968年访问Strachey的实验室时编写了一个模型预处理器,该预处理器适用于Snobol 3代码的一页,并且麦克罗伊和罗伯特·莫里斯(Robert Morris)在贝尔实验室(Bell Labs)开发了一系列进一步的模型。安德鲁·D·霍尔(Andrew D. Hall)随后用M6跟进,这是一个用于移植Altran计算机代数系统的Fortran源代码的通用宏处理器;请参见霍尔的“The M6 Macro Processor”(计算科学技术报告#2,贝尔实验室,1972年,cm.bell-labs.com/cm/cs/cstr/…

布莱恩·柯林汉(Brian Kernighan)和P.J. Plauger的《软件工具》一书(Addison-Wesley,1976年)描述并实现了一种Unix宏处理器语言,这激发了丹尼斯·里奇(Dennis Ritchie)编写了m3,一种用于AP-3小型计算机的宏处理器。

之后,柯林汉和里奇联手开发了原始的m4,描述在“The M4 Macro Processor”(贝尔实验室,1977年,wolfram.schneider.org/bsd/7thEdMa…

尽管GPM更纯粹,但m4旨在处理现实生活中的真正复杂性:宏可以在未预先宣布的情况下被识别,跳过空白或行尾更容易,内置的结构比派生的更多等等。

最初,柯林汉和普劳格(Plauger)的宏处理器,然后是m3,构成了Rational FORTRAN预处理器的引擎,即cpp的Ratfor等效物。后来,m4被用作Ratfor、C和Cobol的前端。

1990年,雷内·赛因达尔(René Seindal)发布了他的m4实现,GNU m4,旨在消除许多传统m4实现中的人为限制,例如最大行长度、宏大小或宏数量。

已故的A. Dain Samples教授描述并实现了M5的进一步发展:“M5宏语言用户指南:第二版”,1992年在comp.compilers新闻组上的电子公告。

1992年,弗朗索瓦·皮纳德(François Pinard)接管了GNU m4的维护,直到1994年他发布了GNU m4 1.4,这是10年来的稳定版本。就在这个时候,GNU Autoconf决定要求GNU m4作为其底层引擎,因为所有其他m4实现都有太多限制。

更近期的是,2004年,保罗·艾格特(Paul Eggert)发布了1.4.1和1.4.2,解决了古老的1.4版本中一些长期存在的漏洞。然后在2005年,加里·V·沃恩(Gary V. Vaughan)整理了网上流传的许多GNU m4 1.4补丁,并发布了1.4.3和1.4.4。2006年,埃里克·布莱克(Eric Blake)加入团队并准备了1.4.5版本的发布补丁,随后几年发布了更多版本,最近的是2016年的1.4.18。

与此同时,m4的新功能如动态模块加载和额外内置功能的开发仍在继续。完成后,GNU m4 2.0将开始一系列新的发布。