[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

1. 序論

この章ではGNU m4とは何か、その由来、このマニュアルの読み方と 使い方、m4を起動する方法、バグを報告する方法などを説明します。 マニュアルの続きを読むにあたっての助言をもってこの章は終ります。

ここから後の章ではm4言語の全機能を詳しく説明します。


1.1 m4序説

マクロを展開しながら入力を出力へコピーするという意味で、m4は マクロプロセッサだと言えます。マクロにはm4に最初から組み込まれて いる組み込み(builtin)マクロと、ユーザが自分で定義するユーザ定義 (user-defined)マクロの2種類があります。マクロは何個でも引数を 取ることができます。m4には単なるマクロの展開機能に加え、 ファイルのインクルード、UNIXコマンドの実行、整数演算、さまざまな方法での テキスト操作、再帰、その他のための関数がそろっています。 m4はコンパイラのフロントエンドとして、またマクロプロセッサ そのものとしても使うことができます。

m4マクロプロセッサは、ほとんどすべてのUNIXで利用することができます。 通常その存在に気づいているのは、ほんのわずかな人たちだけです。 しかし実際に気づいた人たちは往々にして熱心なユーザとなります。 GNU Autoconfで`configure'スクリプトを生成するにはGNU m4が 必要なため、GNU Autoconfの人気が高まったのがきっかけとなってGNU m4を インストールする人が増えました。もっとも、そういう人が自分でm4の プログラミングをすることは無いでしょう。GNU m4はわずかな違いを除けば System V, Release 3 版とほぼ互換性があります。 詳細はSee section 他の版のm4との互換性を参照してください。

ユーザの中にはm4中毒になってしまった人たちもいます。 そういう人たちは最初は簡単なことにm4を使い、徐々に複雑なm4マクロ の書き方を習得しながら、大きなこと大きなことへと挑戦していくのです。 いちど病みつきになってしまえば、簡単な問題を解くためにさえ洗練された m4アプリケーションを書こうとして、実際の仕事よりも自分のm4スクリプト のデバッグに多くの時間をさくことになるのです。 熱中しやすいプログラマーはm4で健康を損なうおそれがあるので注意しましょう。


1.2 m4の由来

ここに記されている歴史に関する覚え書きはきわめて不完全なものであり、 なんら権威あるものでもありません。事情に通じている方は、どうかこの節を ふさわしいものにするのを手伝ってください。

GPMm4の重要な祖先です。 C. Stratchey: "A General Purpose Macro generator", Computer Journal 8,3 (1965), pp. 225 ff を参照してください。 GPMは、David Gries classic "Compiler Construction for Digital Computers"でも簡潔に説明されています。

GPM純粋だったのに対して、 m4は実生活にまつわる本物の複雑さを扱うことを意図したものでした。 そのため、たとえばマクロは前もって宣言しなくても認識されるようになり、 改行文字などの空白(whitespace)をスキップするのは簡単になり、多くの 構成要素が借り物ではなく内蔵されるようになりました。

もともとm4はRational FORTRANプリプロセッサすなわちratfor (cppに相当)のエンジンでした。


1.3 m4の起動(オプション一覧)

m4コマンドを起動するときの形式は次のようになります。

 
m4 [option…] [macro-definitions…] [input-file…]

オプションは、短いオプション名を使うときは`-'で始め、 長いオプション名を使うときは`--'で始めます。 長いオプション名は、 そのオプションだと明確に特定できる先頭部分を書くだけで十分です。 m4は次のオプションを受けつけます。

--version

プログラムのバージョン番号を標準出力に出力し、 input-filesはいっさい読まずに、ただちにm4の実行を終了します。

--help

ヘルプ情報の要約を標準出力へ出力し、 input-filesはいっさい読まずに、ただちにm4の実行を終了します。

-G
--traditional

System V版と比べて、この実装で拡張された機能をすべて抑制します。 これらの一覧はSee section 他の版のm4との互換性を参照してください。

-E
--fatal-warnings

すべての警告(warning)を致命的なものと見なし、 最初の警告が発行された時点でm4の実行を停止し終了します。

-dflags
--debug=flags

デバッグ・レベルをflagsに設定します。 デバッグ・レベルはデバッグ用関数が表示する情報の形式と量の制御に使われます。 flagsの形式と意味についての詳細はSee section デバッグ出力の制御を参照してください。

-lnum
--arglength=num

マクロをトレースすることによって生じる出力の量を制限します。 詳細はSee section デバッグ出力の制御を参照してください。

-ofile
--error-output=file

デバッグやトレースの出力を名前が指定されたファイルへ リダイレクト(redirect)します。 エラーメッセージは通常どおり標準エラー出力へ出力します。 詳細はSee section デバッグ出力の保存を参照してください。

-Idir
--include=dir

インクルード指定されたファイルが現在の作業ディレクトリ (current working directory)で見つからない場合に、m4dirを 探すようにします。詳細はSee section インクルードするファイルのサーチを参照してください。

-e
--interactive

起動時にm4を対話的な状態(interactive)にします。 これは、すべての出力をバッファリング無しで行ない、 割り込み(interrupt)を無視するということを意味します。

-s
--synclines

Cプリプロセッサやそれに類するツールで使うための同期情報を含む行を 生成します。これはm4をコンパイラのフロントエンドとして使う ときなどに便利です。ソースファイル名と行番号の情報は、`#line linenum "filename"'という形式の指令(directive)によって表され、 出力の途中へ必要に応じて挿入されます。この指令(directive)は次の 行が入力ファイルfilenameの第linenum行そのものであるか、 もしくはその行の展開によるものであることを意味します。 `"filename"'の部分は、ファイル名が前の指令(directive)と 変わらない場合はしばしば省かれます。

このような同期指令は、必ずそれ自身で完全な一行に対してのみ与えられます。 ある出力行の途中に同期情報の食い違いがあるときは、 対応する同期指令の出力は次の行へと持ち越されます。

-P
--prefix-builtins

m4の内部に登録されているすべての組み込みマクロの名前を 接頭辞`m4_'が付いたものに変更します。 このオプションを使ったときには、たとえば`define'の代わりに `m4_define'、`__file__'の代わりに`m4___file__'と書かなければ なりません。

-WREGEXP
--word-regexp=REGEXP

マクロ名の字句構成規則を指定します。 このオプションは試験的なものであり、 このオプションを含まないGNU m4の実装も存在する可能性があります。 (see section 単語(word)の字句構造を変更する)

-Hn
--hashsize=n

シンボルを表引きするための内部ハッシュテーブルの項目数をnにします。 この数は素数にするべきです。デフォルトは509項目です。 極端に多くのマクロを定義しないかぎり、この値を増やす必要は無いはずです。

-Ln
--nesting-limit=n

入れ子になったマクロの呼び出しをn段階に制限し、 この制限を超えたときは、プログラムの実行を停止します。 指定がない状態では、入れ子は250段階に制限されています。

このオプションの正確な効力は、動的な再帰構造というよりは、 テキスト上での入れ子構造に対して発揮されるものだと理解したほうが より正しいでしょう。 このオプションは、機械的な方法でm4への複雑な入力を生成したときに 役に立ったという例もありますが、大部分のユーザにとっては無用の長物でしょう。 目障りだということになったときは、 このオプションは(まだ試験段階です)削除されてしまうかも知れません。

このオプションを使っても、再走査(rescanning)による無限ループを抜け出す ことはできません。その一方で、再走査ループは必ずしもメモリや スタック領域を大量に消費するわけではありません。 再走査ループをうまく使えば、複雑で時間のかかる処理をm4に やらせることができます。 この領域に制限をもうけるのは、m4の能力を弱めてしまうことになるでしょう。 異常な使い方の例はいくらでもあります。 `define(`a', `a')a'はもっとも単純なものの例です (しかしsee section 他の版のm4との互換性)。 GNU m4がこのようなケースを検出するのを期待するのは、 コンパイラシステムが無限ループを検出し、診断メッセージをだすのを 期待することに似ています。つまり、決定不能ではないとしても、 一般にとてもハードな問題です。

-Q
--quiet
--silent

マクロの呼び出しで、引数が不足していたり余分にあるときの警告を抑制します。

-B
-S
-T

これらのオプションはSystem V版m4との互換性のために存在しますが、 この実装では何の効果もありません。

-Nn
--diversions=n

これらのオプションはGNU m4の以前のバージョンとの互換性のためだけに 存在し、同時に使うことができる出力切替え先(diversion)の数を制御するために 使われていました。現在は固定された制限値がなくなったので、 何の働きもしません。

`-D'や`-U'オプションを使うと、コマンドライン上でマクロを定義したり 削除したりすることができます。これらは次の形式をとります。

-Dname
-Dname=value
--define=name
--define=name=value

どの入力ファイルを読むよりも前に、nameをシンボルテーブルに 登録します。`=value'が省略されたときは、値は空文字列として 解釈します。valueはどんな文字列でもよく、したがって、マクロは入力内で 定義するときと同じように引数を取るものとして定義することもできます。

-Uname
--undefine=name

nameのすでに定義された意味を削除します。 当然、この方法で削除できるのは定義済みのマクロだけです。

-tname
--trace=name

nameを未定義として、しかしトレースが行われるように、シンボルテーブルへ 登録します。 その結果、このマクロは定義された時点からトレースされるようになります。

-Ffile
--freeze-state file

実行が終了すると、凍結状態(frozen state)の内容を指定されたfile (see section 凍結状態(frozen state)の高速ロード)へ書き出します。

-Rfile
--reload-state file

実行の前に、指定された凍結ファイルfile (see section 凍結状態(frozen state)の高速ロード)から 内部状態を復元します。

コマンドライン上の残りの引数は、入力ファイルの名前として解釈します。 ファイル名の指定がないときは、標準入力から読み込みます。 ファイル名`-'は、標準入力を意味するものとして解釈します。

入力ファイルは、指定された順番に読み込みます。 標準入力は1度しか読むことができませんので、ファイル名`-'は コマンドライン上で1度しか使えません。


1.4 問題やバグへの対処方法

GNU m4に関して問題が起こったり、バグと思われることを見つけたときは、 ぜひ、それを報告してください。 バグを報告する前に、実際にそれが本物のバグなのか確かめてください。 注意深くドキュメントを読み直して、あなたのしようとしたことが 実際にできると本当に書いてあるか確かめてください。 もし、ある事ができるのかどうか明確でないときは、それも報告してください。 それはドキュメントのバグです。

バグを報告したり、自分で直そうとする前に、 そのバグを発現させる、できるだけ小さな入力ファイルを作れないか試してください。 作ることができたときは、その入力ファイルとm4が出す正確な結果を 私たちに送ってください。 また、あなたはどうなるはずだと思ったのかも添えてください。 これは、問題の原因が実はドキュメントにあるものなのか判断するのに役立ちます。

問題を正確に把握したら、電子メールを(インターネット) `bug-m4@gnu.org'または(UUCP) `mit-eddie!prep.ai.mit.edu!bug-gnu-utils'へ送ってください。 あなたが使っているm4のバージョン番号も書いてください、 コマンド`m4 --version'で調べられます。

バグの報告以外の提案もいつでも歓迎します。 ドキュメントの不明確なところや分かりにくい機能についての質問があれば、 それも送ってください。


1.5 このマニュアルの読み方

このマニュアルにはm4の入力と出力の例がたくさん含まれており、 入力、出力およびm4からのエラーメッセージを区別するための 簡単な表記法が用いられています。 これらの例は通常の文章とは間隔をあけて、 固定幅フォントで次のように表示されます。

 
This is an example of an example!

入力と出力を区別するため、m4からの出力にはすべて`'が、 エラーメッセージにはすべて`error-->'が先頭につきます。 したがって次のようになります。

 
Example of input line (入力行の例)
⇒Output line from m4 (m4からの出力行の例)
error-->and an error message (エラーメッセージの例)

m4に最初から定義されているマクロの説明をするときは、 引数に分かりやすい名前をつけたマクロ呼び出しのプロトタイプを示します。 これは次のようになります。

 
regexp(string, regexp, opt replacement)

m4ではマクロの引数はすべて文字列ですが、 数字、ファイル名、正規表現としてなど特別な解釈のされかたをするものもあります。

3番目の引数の前にある`opt'は、この引数が省略可能であることを 表しています。省略したときは、空文字列として解釈されます。 引数リストの最後にある省略記号(`...')は、その後にいくつでも引数を 続けてよいことを示してます。


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Akihiro Sagawa on June, 15 2005 using texi2html 1.70.