| パラダイム | マクロ |
|---|---|
| デザイン: | ブライアン・カーニハン、デニス・リッチー |
| 初登場 | 1977年 |
| 主な実装 | |
| GNU m4 | |
m4 は、ほとんどのUnix 系オペレーティング システムに含まれる汎用マクロ プロセッサであり、 POSIX標準のコンポーネントです。
この言語は、ブライアン・カーニハンとデニス・リッチーによってUNIXのオリジナルバージョン用に設計された。これは、リッチーが無名のAP-3ミニコンピュータ用に書いた初期のマクロプロセッサm3の拡張である。[1]
マクロプリプロセッサは、テキスト置換ツールとして動作します。これは、通常、コンピュータ プログラミングアプリケーションでテキスト テンプレートを再利用するために使用されますが、テキスト編集およびテキスト処理アプリケーションでも使用されます。ほとんどのユーザーは、GNU autoconfの依存関係として m4 を必要とします。
歴史
マクロプロセッサは、プログラマがアセンブリ言語を一般的に使用していたときに人気を博しました。プログラミングの初期の頃、プログラマはプログラムの多くが繰り返しのテキストで構成されていることに気づき、このテキストを再利用する簡単な方法を発明しました。プログラマはすぐに、テキストブロック全体を再利用する利点だけでなく、類似のパラメータを異なる値に置き換える利点も発見しました。これがマクロプロセッサの使用範囲を定義しました。[2]
1960年代には、初期の汎用マクロプロセッサM6がAT&Tベル研究所で使用されていました。これはダグラス・マキロイ、ロバート・モリス、アンドリュー・ホールによって開発されました。[3]
1977 年、Kernighan と Ritchie はChristopher Stracheyのアイデアに基づいて m4 を開発しました。このスタイルのマクロ前処理の特徴は次のとおりです。
- 自由形式の構文(アセンブリ言語処理用に設計された一般的なマクロプリプロセッサのような行ベースではない)
- 再展開の度合いが高い(マクロの引数はスキャン時に 1 回、解釈時に 1 回、合計 2 回展開されます)
Rational Fortranの実装では最初からマクロ エンジンとして m4 を使用しており、ほとんどのUnixバリアントには m4 が搭載されています。
2021 年現在、多くのアプリケーションはGNUプロジェクトのautoconf[アップデート]の一部として m4 を使い続けています。また、 sendmail (広く普及しているメール転送エージェント)の設定プロセスや、 gEDAツールスイートでのフットプリントの生成にも使用されています。SELinuxリファレンス ポリシーは、 m4マクロ プロセッサに大きく依存しています。
m4はコード生成に多くの用途がありますが、(他のマクロプロセッサと同様に)問題をデバッグするのが難しい場合があります。[4]
特徴
m4 は次の機能を提供します:
- 行ベースの構文ではなく、自由形式の構文
- 高度なマクロ拡張(引数はスキャン中に拡張され、解釈中に再度拡張されます)
- テキストの置換
- パラメータ置換
- ファイルの包含
- 文字列操作
- 条件評価
- 算術式
- システムインターフェース
- プログラマ診断
- プログラミング言語に依存しない
- 人間の言語に依存しない
- プログラミング言語機能を提供する
以前のほとんどのマクロプロセッサとは異なり、m4 は特定のコンピュータ言語や人間の言語を対象としていません。ただし、歴史的には、その開発はFortranのRatfor方言をサポートするために始まりました。他のマクロプロセッサとは異なり、m4 はチューリング完全であり、実用的なプログラミング言語でもあります。
定義されたマクロに一致する引用符で囲まれていない識別子は、その定義に置き換えられます。識別子を引用符で囲むと、引用符で囲まれた文字列がマクロ置換の一部として展開されるときなど、後になって展開が抑制されます。ほとんどの言語とは異なり、m4 の文字列は、開始区切り文字としてバックティック(`) 、終了区切り文字としてアポストロフィ(') を使用して引用符で囲まれます。開始区切り文字と終了区切り文字を別々にすると、文字列内で引用符を任意にネストして使用できるため、文字列のさまざまな部分でマクロ展開が行われる方法とタイミングを細かく制御できます。
例
次のフラグメントは、 HTMLコードを生成するためのライブラリの一部を構成できる簡単な例を示しています。セクションに自動的に番号を付けるコメント付きマクロを定義します。
転用(-1)
m4には複数の出力キューがあり、
`divert'マクロ。有効なキューの範囲は0から10までで、
デフォルトのキューは0です。拡張機能として、GNU m4はより多くのキューをサポートしています。
転換は整数型のサイズによってのみ制限されます。
無効なキューで「divert」マクロを呼び出すと、テキストが
次の呼び出しまで破棄されます。出力が行われている間も
破棄されるため、`divert'やその他のマクロを引用符で囲む必要があります。
拡大を防ぐ。
# マクロはコメント内では展開されないため、
# として、divert やその他の組み込み関数は、何の影響もなく使用できます。
# HTML ユーティリティ マクロ:
定義(`H2_COUNT', 0)
# H2_COUNT マクロは、H2 マクロが使用されるたびに再定義されます。
定義(`H2',
`define(`H2_COUNT', incr(H2_COUNT)) < h2 > H2_COUNT. $1 </ h2 > ')
転用(1)dnl
ダウン
dnl dnlマクロはm4に行の残りを破棄させるので、
dnl は、出力に不要な空白行が表示されないようにします。
ダウン
H2(第1セクション)
H2(第2セクション)
H2(結論)
ダウン
転用(0)dnl
ダウン
< HTML >
undivert(1)dnl キューの1つが出力にプッシュされています。
</HTML>
このコードを m4 で処理すると、次のテキストが生成されます。
< HTML >
< h2 > 1. 第 1 セクション</ h2 >
< h2 > 2. 第 2 セクション</ h2 >
< h2 > 3. 結論</ h2 >
</ HTML >
実装
FreeBSD、NetBSD、OpenBSD は、 m4 言語の独立した実装を提供しています。さらに、Heirloom Project開発ツールには、 OpenSolarisから派生した m4 言語の無料バージョンが含まれています。
M4はInfernoオペレーティングシステムに組み込まれています。この実装は、UNIX System VやPOSIXのより洗練されたものよりも、バージョン7 UnixでKernighanとRitchieによって開発されたオリジナルのm4に近いものです。[5]
GNU m4は、GNUプロジェクトのためのm4の実装です。[6] [7] GNU m4 は、最大行長、マクロの最大サイズ、マクロの数など、従来のm4実装に見られる多くの恣意的な制限を回避するように設計されています。このような恣意的な制限を取り除くことは、GNUプロジェクトの目標の1つです。[8]
GNU Autoconfパッケージは、GNU m4 の機能を広範に活用します。
GNU m4は現在、Gary V. VaughanとEric Blakeによってメンテナンスされています。[6] GNU m4はフリーソフトウェアであり、 GNU General Public Licenseの条件に基づいてリリースされています。
参照
- Cプリプロセッサ
- マクロ(コンピュータサイエンス)
- 作る
- テンプレートプロセッサ
- Webテンプレートシステム
- AWK – プログラミング言語
参考文献
- ^ ブライアン・W・カーニハンとデニス・M・リッチー。 m4マクロプロセッサ。技術レポート、ベル研究所、マレーヒル、ニュージャージー州、米国、1977年。pdf
- ^ GNU m4の歴史
- ^ Cole, AJ (1981).マクロプロセッサ(第2版、改訂版). CUP アーカイブ. p. 254.
- ^ Kenneth J. Turner. m4 マクロ言語の活用。技術レポート CSM-126、スコットランド、スターリング大学、コンピュータ科学および数学部、1994 年 9 月。pdf
- ^ – インフェルノ一般コマンドマニュアル
- ^ ab GNU m4 Web サイト「GNU M4」、2020 年 1 月 25 日にアクセス。
- ^ GNU m4 マニュアル、オンラインおよび HTML、PDF、その他の形式でダウンロード可能。「GNU M4 — GNU マクロ プロセッサ」、2020 年 1 月 25 日にアクセス。
- ^ 「GNU コーディング標準: 堅牢なプログラムの作成」。引用: 「データ構造の長さや数に恣意的な制限を設けないでください」。
外部リンク
- GNU m4 ウェブサイト
- GNU m4 マニュアル
- m4 チュートリアル
- マクロマジック: m4、パート 1 とパート 2
≥
