この付録には主にgawk
の実装者(implementor)や保守者(maintainer)にと
って重要な情報がある。すべては他の実装系ではなく、特別にgawk
にあ
てはまる。
POSIXのawk
にはない、GNUによるawk
言語やプログラムに対する拡
張はセクション POSIX awk
にはないgawk
の拡張を参照にまとめられている。これ
らの機能は全て、`--traditional' オプションや `--posix'オプショ
ンと共にgawk
を起動することにより禁止することができる。
gawk
がデバッグのために`-DDEBUG'をつけてコンパイルされた
場合、使えるコマンドラインオプションが一つ増える。
-W parsedebug
--parsedebug
このオプションはgawk
開発者(developer)にのみ適用され、一般のユーザー
は使えない。実行速度を低下させてしまうので、あなたの使っているgawk
ではこのオ
プションが使えないようにコンパイルされているだろう。
gawk
に追加を行うもしあなたがあなたが有意義な方法でgawkの質を高めることを望むなら、 あなたは全く自由にそれを行うことができる。 重要なのは、フリーソフトウェアの所有についてのポイントであり、 ソースコードは自由に入手可能であり、あなたの望むように 変更できる(セクション GNU GENERAL PUBLIC LICENSEを参照)。
このセクションでは、現在我々がgawk
に対して行なおうとしている拡張の説
明を簡単に行なう。
あなたがgawk
に対して好きなように新しい機能を追加することは自由で
ある。しかし、あなたがおこなった変更点をgawk
の配布キットに含めた
いと思うのなら、その変更点を私(元の開発者)が適用できるようにするための幾
つかのステップを通る必要がある。
gawk
の配布バージョンに対し
ての変更がもっとも手間がかからないものだからである。もし、あなたの使った
gawk
が非常に古いバージョンだったりしたら、私は変更点のすべてを取
り込むことはできないかもしれない。gawk
の最新バージョンの入手に関
する情報はセクション Getting the gawk
Distributionを参照。
gawk
の変更を始める前に読んで欲しい。
(GNU Coding Standardsは、FSFからのAutoconfの
配布の一部として入手することができる)。
gawk
のスタイルを使用する。
gawk
のCソースコードはGNU Coding Standardsに従っているが、
幾つかの小さな例外がある。ソースコードのフォーマットは(特にブレースの
位置について)"K&R"スタイルを使用しており、タブを使っている。簡単に
まとめると、gawk
のコーディングルールは、
int
であっても、関数の戻り値の型を
関数名と関数の引数がある行の上の行に記述する。
if
, while
, for
, do
, switch
,
return
)を使う場合のカッコの回りには空白を置く。
for
ループの初期化部分や、incremnt part、
マクロの本体は除く。
if
文、while
文、for
文の条件部分、
switch
文のcase
では、
ポインタやキャラクタの値だけの代わりに、
NULL
や'\0'
に対する比較を使う。
1
や0
の代わりに、
TRUE
、FALSE
、NULL
といった
シンボリックな定数や、適切なところで\0
というキャラクタ定数
を使用する。
alloca
を使わない。
これを使用することによって、(割り付けた領域を陽にfreeしなくても良いという)
ちょっとした利益を受けるよりも重大なトラブルが引き起こされる。
alloca
の代わりに、malloc
とfree
を使うように。
gnu@gnu.org
に連絡して欲しい
(セクション 問題やバグの報告を参照)。
gawk
のソースツリーと、あなたの修正したバージ
ョンのgawk
との比較を`diff -c -r -N' か`diff -u -r -N'を
使って行う(私は文脈差分のほうが読みやすいと思う。しかし、単一化差分のほ
うが小さくなる)。ここで、GNUバージョンのdiff
を使うことをお薦めす
る。diff
の実行によって生成された出力を私に送って欲しい。電子メイ
ルの情報はセクション 問題やバグの報告を参照。
この書式を使う事によって、私があなたの変更をgawk
のソースコードの
マスターバージョンに(patch
を使って)適用するのが簡単になる。もし変
更を手作業でやる必要があるならテキストエディタを使って行うが、特に変更点
が多数あった場合には私はそれをできないかもしれない。
多くの作業があるように思えるかもしれないが、あなたは新しいコードを書くこ とができたとして、私はそれをメンテナンスし、サポートしなければならない ということを忘れないで欲しい。
gawk
to a New Operating System
gawk
を新しいオペレーティングシステムに移植したい場合、
以下に挙げるような幾つかのステップがある。
gawk
の残りの部分や、他
の移植と共存しなければならないということに注意すること。システムに関係な
い部分のコードを変更しないようにし、もし可能ならば、移植のためのコードを
単に`#ifdef'をばらまくような形で行わないこと。
もし特定なシステムのために必要とされた変更が、コード全体のあまりに多くに
影響するならば、私は恐らくその変更を受け入れないだろう。このような場合で
も、もちろん、あなたはあなたの行った変更を
GPL(セクション GNU GENERAL PUBLIC LICENSEを参照).
に従って配布することができる。
gawk
を構成するファイルの幾つかはFree Software Foundationの他の人
々によってメンテナンスされている。したがって、はっきりした理由がない限り
は、そのようなコードの変更は行うべきではない。つまり、変更は不可能ではな
いが、これらにファイルに対する変更は慎重に、注意深く調べられることになる。
該当するファイルとしては、`alloca.c', `getopt.h', `getopt.c',
`getopt1.c', `regex.h', `regex.c', `dfa.h',
`dfa.c', `install-sh', `mkinstalldirs'がある。
gawk
をコンパイルしたり実行したり
するのに必要なコードをメンテナンスしているボランティアによってサポートさ
れている。もし、その様なメンテナンスを行うボランティアが誰もいなければ、
その移植はサポート外のものとなり、配布キットから取り除く必要が生じるかも
しれない。
gawk
をインストール、コンパイル
するのに必要なステップを記述したこのマニュアルのセクション
を書いて欲しい。
これらのステップに従うことによって、あなたのgawk
に対する変更をま
とめることが容易になり。すでにある他のオペレーティングシステムへ移植する
ためのコードと問題なく共存できるようになるのである。
あなたが提供し、メンテナンスするコードの中では、コーディングスタイルやブ レースの配置をあなたの好きなようにすることができる。
AWKはPERLに似た言語であるが、ちょっとばかし洗練されている。 Arnold Robbins おい! Larry Wall
このセクションでは、現在我々がgawk
に対して
行おうとしている拡張や、可能な改良点について簡単に説明する。
gawk
の配布キットにある`FUTURES'
というファイルにはこれらの拡張がリストアップされている。
以下のリストはawk
プログラマーにとって有用な、
将来行われるだろう改良案である。
gawk
が警告やエラーのメッセージを英語以外の
言語で出力することを可能とする。
これはおそらく、awk
プログラムも同様に複数言語機能
を使えるようになり、gawk
そのものとは分離される。
awk
の配列をGDBM/NDBM/SDBMのファイルにマッピングすることを
可能にする。
PROCINFO
gawk
を参照)
は、同じ情報をより簡単なやり方で提供する
配列PROCINFO
に取って代わられる。
lint
によるより多くの警告
gawk
のプログラム中で配列ENVIRON
の内容を
変更すると、gawk
から実行する子プロセスにそれが伝播する。
以下のリストはgawk
の能力をより向上させることのできる
改良である。
dfa
grep
から持ってきたdfa
パターンマッチャーは幾つかの問題を
抱えている。新しく作るにしろ、問題点を修正するにしろ、一部の重要な正規表現
のマッチングがこれを扱っている。
mmap
システムコールをサポートしているシステムでは、それを
使うことによってファイルからの入力を高速化し、入力バッファの
管理をかなり簡単にできるだろう。
malloc
の使用
gawk
は動的なメモリ割当を多用してるので、GNUによる
malloc
を使うことによってgawk
を高速化できる可能性がある。
以下に挙げるのは gawk
ハッカーが望むであろう幾つかの
プロジェクトである。作業に要するのは数日から数週間であるが、
プロジェクトやプログラマーの能力にもよる。
もしなんらかの改良を行ったのなら、GNUプロジェクトの担当者まで
送って欲しい。
gawk
に新しく機能を追加するときに従うガイドラインは
セクション Adding New Featuresを参照,
にある。
メンテナンス担当者へコンタクトするための情報は
セクション 問題やバグの報告を参照.
awk
プログラムのコンパイル。gawk
は与えられた文法を解析木に変換
するのにBison(YACCライクな)パーサを使っている。解析木は単純な再帰的評価器に
よって実行される。このやり方は、再帰的評価器が単純なことであっても多くの手続
きを呼出す為に大きなオーバーヘッドを招く。
gawk
がスクリプトを解析し、ユーザーがコンパイルできるような Cプログラ
ムに変換するのを可能にする為に、普通のCコンパイラと、必要とされる関数全て
(正規表現、フィールド、連想配列、type coercion など)を提供する
特別なgawk
ライブラリが使われる。
もっと実現しやすいのはawk
の中間フェイズで解析木を、GNU Emacs Lispで
使用されているようなリニアバイトコードに変換するということである。再帰的評
価器はstraight line byte code インタプリタに置き換えられるだろう。このイン
タプリタはコンパイルしたプログラムの実行速度とgawk
の現在の動作
速度の中間で動作する。