M4

編程語言

m4 是一個通用的宏處理器,由 Brian Kernighan 和 Dennis Ritchie 設計。m4 是基於 Ritchie 早先為 AP-3 小型機開發的 m3 宏處理器擴展的。

使用


m4 是 POSIX 標準中的一部分,所有版本的 UNIX 下都可用。雖然這種語言可以單獨使用,但大多數人需要 m4 僅僅是因為 GNU autoconf 中的“configure”腳本依賴它。宏處理器(或預處理器)一般用作文本替換工具。最終用戶經常會用它來處理要反覆使用的文本模板,典型的是用於編程工具,還會用於文本編輯和文字處理工具。

歷史


宏處理器開始流行的時候,程序員還都在使用彙編語言來編程。在早期,程序員發現他們的程序中包含了很多重複的代碼,於是他們創造了這種簡單的方法來重用。程序員們很快發現它不僅能用於重用整塊代碼,還能為類似的參數替換不同的值。這明確了宏處理器的使用範圍。在 1977 年,Kernighan 和 Ritchie 基於 Christopher Strachey 的想法開發了 m4。一些與眾不同的特徵有:
1. 自由形式的語法(而不是像那些用於處理彙編語言的典型宏處理器一樣使用基於行的語法)
2. 高度的宏擴展(宏參數被擴展兩次:掃描時一次、插值時一次)
從一開始,Rational Fortran(RatFor) 就使用 m4 作為它的宏引擎,而大多數 UNIX 變種發布時都包含了它。截止 2009 年,許多應用仍在使用 m4(作為 GNU autoconf 項目的一部分)。它還出現在 sendmail(一個廣泛使用的郵件傳輸代理)的配置過程,以及用於 gEDA 工具包中生成腳印。m4 大多用於代碼生成,和其他宏處理器一樣,一旦出了問題會很難調試。

特性


m4 提供如下功能:
* 語法形式自由,而不是基於行的語法;
* 高度的宏擴展(宏參數在掃描和插值中都會被擴展)
* 文本替換
* 參數替換
* 文件包含
* 字元串操作
* 條件判斷
* 數算運算
* 系統介面
* 程序員診斷
* 獨立於計算機編程語言
* 獨立於自然語言
* 可編程
與大部分早先的宏處理器不同,m4 並不面向任何計算機語言或自然語言;但從歷史角度來說,它最初是為支持 Fortran 的方言 Ratfor 而開發的。此外,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_COUNT. $1

')
divert(0)dnl Diversion to 0 means back to normal. dnl macro removes this line.
H2(First Section)
H2(Second Section)
H2(Conclusion)
上述代碼在 m4 中執行,生成以下結果:

1. First Section

2. Second Section

3. Conclusion

dnl 用於刪除前面的空行。

自由軟體版本


GNU 實現了一個 m4 版本;FreeBSD、NetBSD 和 OpenBSD 也提供一個 m4 語言的獨立實現版本;此外,OpenSolaris 的 Heirloom 項目開發工具中葉包含一有一個 m4 語言的自由版本。