linux M4


M4 编程语言 通用宏处理器 经常被用来生成 Makefile 脚本语言来使用
M4 通用的宏处理器 由布莱恩·柯林汉和丹尼斯·里奇设计 M4 是基于 Ritchie 早先为 AP-3 小型机开发的 m3宏处理器扩展的
M4 是 POSIX 标准 的一部分 所有版本的 UNIX  都可用 虽然这种语言可以单独使用 但大多数人 要 M4 仅仅是 GNU autoconf 中 configure 脚本依赖它

宏处理器 或 预处理器
一般用作文本替换工具 用户 用来处理要反复使用的文本模板 典型的是用于编程工具 文本编辑 和 文字处理工具
宏处理器 流行的时候 程序员 都在用 汇编语言 编程 程序员发现程序中包含了很多重复的代码 于是创造了这种简单的方法来重用
程序员们很快发现它不仅能用于重用整块代码 还能为类似的参数替换不同的值 这明确了宏处理器的使用范围
在 1977 年 Kernighan 和 Ritchie 基于 Christopher Strachey 的想法开发了 M4  与众不同的特征
自由形式的语法( 不是像 汇编语言的 典型宏处理器 一样使用基于行的语法)
高度的宏扩展(宏参数被扩展两次 扫描时一次 插值时一次)

从一开始 Rational Fortran(RatFor) 就使用 M4 作为它的宏引擎 多数 UNIX 变种发布时都包含了M4
M4 是一种图灵完备的编程语言 大多用于代码生成 和其他宏处理器一样 出了问题 很难调试
M4 与大部分早先的宏处理器不同 M4 不面向任何计算机语言或自然语言



M4 功能


语法形式自由 而不是基于行的语法
高度的宏扩展(宏参数在扫描和插值中都会被扩展)
文本替换
参数替换
文件包含
字符串操作
条件判断
数算运算
系统接口
程序员诊断
独立于计算机编程语言
独立于自然语言
可编程


以下宏代码 生成 HTML 代码 为每个章节编号
divert(-1)
This `divert' discards this text. Note that I had to quote the `divert'
in the comment so it wouldn't get undiverted.

# In a true comment, I'm free to use words such as divert and other builtin
# M4 macros' names without consequence.

# This starts the count at ONE as the incr is a preincrement.
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(0)dnl Diversion to 0 means back to normal. dnl macro removes this line.
H2(First Section)
H2(Second Section)
H2(Conclusion)

上述代码在 M4 中执行 生成以下结果:

<h2>1. First Section</h2>
<h2>2. Second Section</h2>
<h2>3. Conclusion</h2>

dnl 用于删除前面的空行
GNU实现了 M4 版本
FreeBSD NetBSD 和 OpenBSD  提供一个 M4 语言的独立实现版本
OpenSolaris的Heirloom 项目开发工具中 包含 M4 语言的自由版本




M4详细参考


//zh.wikipedia.org/wiki/m4_(%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80)   介绍了这个语言的特性,历史,作用等。
//www.ibm.com/support/knowledgecenter/zh/ssw_aix_72/com.ibm.aix.genprogc/M4macro.htm  介绍了该语言的详细使用规则。