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

14. 凍結状態(frozen state)の高速ロード

何百もの定義やその他の手間がかかる初期化をまとめた共通の基盤を土台として、 その上にさらに大きなm4アプリケーションをいくつも構築していくことが できます。通常はその共通の基盤を1つ以上のファイルに格納しておいてm4を 起動するたびにユーザの入力ファイル名の前にそれらのファイル名を羅列するか、 ユーザの入力ファイルからincludeします。

巨大なアプリケーションの共通基盤を何度も何度も繰り返し読み込むのは 時間がかかることでしょう。m4には大きな共通基盤を使う アプリケーションの開始時間をスピードアップするための機構が用意されて います。ユーザが次のコマンドラインを繰り返し使うとします。

 
m4 base.m4 input.m4

ここで`input.m4'は起動のたびにいろいろな内容を持ち、 `base.m4'はかなり固定的な内容を持っているとします。 こういうときは、次のようにした方がいいでしょう。

 
m4 -F base.m4f base.m4

このように一度実行しておき、必要になるたびに次のように実行します。

 
m4 -R base.m4f input.m4

最初の-Fオプションを含んでいる呼び出しは`base.m4'を読んで実行 することで、さまざまなアプリケーションマクロの定義やその他の初期化を 行います。入力ファイル`base.m4'の処理が完全に終ってから、 GNU m4は凍結(frozen)ファイルを`base.m4f'として生成します。 このファイルはm4の内部状態のある種のスナップショットとなっています。

後者の-Rオプションを含んでいる呼び出しでは、どの入力ファイルが 読み込まれるよりもに、`base.m4f'からm4のメモリの内部状態を リロード(reload)しておくことができます。 このようにして、まっさらな状態のm4から始めるかわりに 前もって起動しておいたときの状態へと効率的に復帰したあとで入力を読み込み ます。この例では`base.m4'を新たに読んだときと効果は同じですが、それを ずっと速く行うことができます。

m4の1回の起動で作ったり読み込んだりできる凍結ファイルはそれぞれ 1つだけです。 一度に2つの凍結ファイルの内容を回復することはできません。 しかし-R-Fオプションを同時につかうことで、凍結ファイルを すこしずつ更新していくことはできます。例えば多少の注意を払う事で、次のコマンドは、

 
m4 file1.m4 file2.m4 file3.m4 file4.m4

最終的にこれと同じ出力が段段と蓄積されていくような、次の一連の コマンド列に分けることができるでしょう。

 
m4 -F file1.m4f file1.m4
m4 -R file1.m4f -F file2.m4f file2.m4
m4 -R file2.m4f -F file3.m4f file3.m4
m4 -R file3.m4f file4.m4

多少の注意を払う必要があるというのは、これがどんな場合にもうまく動く ようにするためのあらゆる対策がこうじられているわけではないからです。 とりわけ、マクロのトレース属性には対応していませんしchangewordの 現在の設定に関してもそうです。m4のいくつかのオプションが1度目で 使用されて、次は使用されなかった場合にどのように作用するかも完全には検討 されていません。一方でpushdefされた定義のスタックが正しく扱われる ことは保証されています。またundefineされた定義、組み込みマクロの 名前変更、引用符やコメント記号の変更についても同じく正しい動作が保証され ています。

m4の実行が凍結されるとき、実行終了時に起こる自動的な出力の 逆切替え(undiversion)は抑制されます。そのかわり全ての正の番号をもつ 出力切替え先の内容は凍結ファイルに保存されます。使用中の出力切替え先の 番号も伝えられます。

リロード(reload)しようとしている凍結ファイルがカレントディレクトリに ある必要はありません。凍結ファイルを探す方法はインクルードファイル (include)の場合と同じです。(see section インクルードするファイルのサーチ)

凍結ファイルは複数のアーキテクチャで共有することができます。 1つのマシンで凍結ファイルを作り、それを他のマシンで使うときは2番目の マシンで同じか新しいバージョンのGNU m4を使っているのなら確実です。 凍結ファイルは単純な(編集可能な)テキストファイルで、アルファベット大文字 で始まり改行文字(NL)で終る指令から成り立っています。指令があるはず の場所に#があるときはコメント行の始まりとなり、空行とあわせて無視 されます。次の説明ではlengthは常に対応するstringを参照します。 数字は常に10進数で表されます。指令の一覧です。

V number NL

凍結ファイルのフォーマットを確認します。 numberは1のはずです。

C length1 , length2 NL string1 string2 NL

string1string2を開始コメントと終了コメント文字列として使います。

Q length1 , length2 NL string1 string2 NL

string1string2を開始クォートと終了クォート文字列として使います。

F length1 , length2 NL string1 string2 NL

pushdefを使い、string1が組み込みマクロとして名前string2を もつ関数に展開されるように定義します。

T length1 , length2 NL string1 string2 NL

pushdefを使い、string1がテキストstring2に展開される ように定義します。

D number, length NL string NL

番号numberを出力切替え先番号として選択し、それを現在の出力切替え先 (current diversion)にし、stringをその出力切替え先にコピーします。 numberは存在しない出力切替え先を表す負数にすることができます。 現在の出力切替え先の選択だけをしたいときは、stringを空文字列にして、 このコマンドを使います。出力切替え先番号numberとして0を使うと、 リロード時にstringが標準出力へ出力されるでしょう、しかしm4内部 からそのようにこのコマンドが生成されることはありません。


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

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