「M4 (プログラミング言語)」の版間の差分
m →例 |
|||
57行目: | 57行目: | ||
[[Hello World]] コード |
[[Hello World]] コード |
||
<syntaxhighlight> |
|||
<source> |
|||
define(`print', `Hello World!') |
define(`print', `Hello World!') |
||
print |
print |
||
</syntaxhighlight> |
|||
</source> |
|||
以下のコード断片は[[HyperText Markup Language|HTML]]生成ライブラリの一部を示したものである。自動的に節見出しに番号を振るマクロを定義している。 |
以下のコード断片は[[HyperText Markup Language|HTML]]生成ライブラリの一部を示したものである。自動的に節見出しに番号を振るマクロを定義している。 |
||
<syntaxhighlight> |
|||
<source> |
|||
define(`H2_COUNT', 0) |
define(`H2_COUNT', 0) |
||
define(`H2', `define(`H2_COUNT', incr(H2_COUNT))' dnl |
define(`H2', `define(`H2_COUNT', incr(H2_COUNT))' dnl |
||
72行目: | 72行目: | ||
H2(Second Section) |
H2(Second Section) |
||
H2(Conclusion) |
H2(Conclusion) |
||
</syntaxhighlight> |
|||
</source> |
|||
m4 でこれを処理すると、次のようなテキストが生成される。 |
m4 でこれを処理すると、次のようなテキストが生成される。 |
||
<syntaxhighlight> |
|||
<source> |
|||
<h2>1. First Section</h2> |
<h2>1. First Section</h2> |
||
<h2>2. Second Section</h2> |
<h2>2. Second Section</h2> |
||
<h2>3. Conclusion</h2> |
<h2>3. Conclusion</h2> |
||
</syntaxhighlight> |
|||
</source> |
|||
==実装== |
==実装== |
2020年7月5日 (日) 22:58時点における版
パラダイム | マクロプロセッサ |
---|---|
登場時期 | 1977年 |
設計者 | ブライアン・カーニハン、デニス・リッチー |
主な処理系 | GNU m4 |
開発元 | GNUプロジェクト |
---|---|
最新版 |
1.4.18
/ 2016年12月31日[1] |
対応OS | Unix系 |
種別 | m4マクロプロセッサ |
ライセンス | GNU General Public License |
公式サイト | gnu.org/s/m4 |
m4 は、ブライアン・カーニハンとデニス・リッチーが設計した汎用テキストマクロプロセッサである。その名称は「macro」(マクロ)の「m」と、AP-3ミニコンピュータでデニス・リッチーがそれ以前に書いたマクロプロセッサ「m3」の次、というところから来ている。
使用
テキストマクロプロセッサとは、マクロと呼ばれるコマンドに従ってテキストを置換するテキスト処理ツールである。プログラミングにおいて、ソースコードのプリプロセス(前処理)でテキストをテンプレートとして再利用する、といった用途に多用されるが、あらゆる文書における定型処理のようなものに使うことができる。
歴史
クリストファー・ストレイチーのGPM[2]、『ソフトウェア作法』[3]で例題として解説されているマクロプロセッサ、AP-3ミニコンピュータでデニス・リッチーがそれ以前に書いたマクロプロセッサm3、などを基に[4]、1977年にm4は開発された。アセンブリ言語用などの特定のフォーマットに強く依存したマクロプロセッサではなく、汎用のマクロプロセッサであり、高度な拡張性を備えている(しかし、C言語的な構文に縛られている部分があるため、どんな対象にも必ずしも対応できるわけではない)。Ratforの最初の実装で使われ、UNIXにも添付された。Sendmailの設定ファイルにも使われているが、おそらく今日これを最もよく使っているのはGNUプロジェクトのautoconfである(autoconfにはGNU版m4が必須である。なお、autoconfが生成したconfigureスクリプトの実行だけであれば通常はm4は必要ない)。チューリング完全であり、コード生成に向いているとされることもあるが、過度の利用はデバッグを困難にするという問題がある(ある程度はデバッグを支援する情報の出力などといったm4の実装固有の問題であり、ある程度はマクロを利用するメタプログラミングに遍在する問題である)。
機能
- テキスト置換
- パラメータ置換
- ファイルのインクルード
- 文字列操作
- 条件付き評価
- 数式表現
- システムインタフェース
- プログラマ診断
m4は、もとはFORTRANの方言であるRatforの開発を契機として開発されたものの、汎用のものであり、その適用対象は特定のコンピュータ言語や自然言語に限定されてはない。他のマクロプロセッサとは異なり、m4 は一般的なプログラミング言語と同様、チューリング完全である。
例
Hello World コード
define(`print', `Hello World!')
print
以下のコード断片はHTML生成ライブラリの一部を示したものである。自動的に節見出しに番号を振るマクロを定義している。
define(`H2_COUNT', 0)
define(`H2', `define(`H2_COUNT', incr(H2_COUNT))' dnl
`<h2>H2_COUNT. $1</h2>')
H2(First Section)
H2(Second Section)
H2(Conclusion)
m4 でこれを処理すると、次のようなテキストが生成される。
<h2>1. First Section</h2>
<h2>2. Second Section</h2>
<h2>3. Conclusion</h2>
実装
元々の m4 の実装である UNIX 版は、現在は OpenSolaris から派生した Heirloom Project でフリー版が配布されている。FreeBSD、NetBSD、OpenBSD といった BSD の子孫の m4 は、1990年頃 Ozan S. Yigit が書いた実装がベースである。GNU版[5]は、やはり1990年頃に René Seindal が書いた別の実装がベースである。以上のどれかをWindowsで実行できるようビルドしたWindows用バイナリもある。
標準
POSIXで標準化されている[6]。
関連項目
参考文献
- Brian W. Kernighan and Dennis M. Ritchie. The M4 macro processor. Technical report, Bell Laboratories, Murray Hill, New Jersey, USA, 1977. pdf
- 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
- René Seindal. GNU M4 Manual. GNU Press. 2004. html
脚注
- ^ Eric, Blake (31 December 2016). "[M4-announce] m4-1.4.18 released [stable] released" (Mailing list). info-gnu. 2017年2月22日閲覧。
- ^ C. Strachey:『A General Purpose Macrogenerator』、The Computer Journal 誌、8(3):225–241, 1965.
- ^ プログラミングツールの考え方を世に広めた書籍。
- ^ Software Toolsとm3は、どちらが先なのか資料によって書いてあることが異なり、よくわからない。
- ^ http://www.gnu.org/software/m4/
- ^ http://pubs.opengroup.org/onlinepubs/9699919799/utilities/m4.html