「A.V.Aho, P.J.Weinberger, B.W.Kernighan. プログラミング言語AWK. トッパン. 1989」を読んで

久しぶりにawkスクリプトを書く機会(可能な限り何もない環境でも動かせるようにしたい)があって、本棚から引っ張り出して再読したら、始めて読んだときの感動が蘇ってきました。最初はリファレンス的なところだけ読んでたのですが、目次を見て懐かしくなってチョコチョコとつまみ読みしたら、あっという間に時間がたちます。改めて素晴らしい本だと思います。元々、名作の誉れ高く、私などが今更書いてもしょうがないのですが、書きたくなったのでしょうがないのです。
というわけで、「プログラミング言語AWK (アジソン ウェスレイ・トッパン情報科学シリーズ)」の話です。

本の内容

題名からするとawkの解説本なんですが、この本の後半では色々と逸脱しています。(もちろん良い意味で)
そして作者たちは、それを意図して書いているわけです。序文から引用します。

われわれはまた、プログラミングの諸問題に立ち向かうためのさまざまな方法を説明するように試みた。awkがうまく手助けできる方法のひとつに、素早い試作品作りがある。また、これほど明白な戦略ではないが、大きな仕事を小さな部品に分解してから、一時に一つずつそれらの部分に集中する分解攻略法というのもある。他のプログラムを生成するようなプログラムを書く方法もある。小さな言語で、よいユーザ・インターフェイスを定義し、しばしば矛盾のない実現法も提案する。こうしたアイディアは、ここではawkの文脈で語られているが、それ以上に広く適用できるもので、すべてのプログラマのレパートリーの一部になるべきものである。

最後の一文にあるように、作者たちは、単にawkを使いこなすということ以上のものを、提供しようとしているわけです。
それは、以下のような構成にも表れています。

第1章 AWK入門 (26Page)
身近な例を使った簡単なAWKの使い方。特定の欄のみを表示するとか、平均や合計を計算したりとかの、チュートリアル的なものを提供。この章だけでも、簡単なスクリプトは書けるようになります。
2章 AWK言語 (62Page)
AWK言語の系統だった説明。言語の解説書ということなら、この章だけでお終い。現在のモダンなスクリプト言語と比べると、その言語仕様のシンプルに改めて驚かされる。(まあ、用途によっては"不便"とも言えるが、AWKのターゲットからすると十分。)
3章 データ処理 (32Page)
より複雑なデータ処理の方法について解説していく。複行レコードのような、少し工夫が必要なデータの取り扱い方等についての方法が書かれており、実際の場面で困った際の解決にヒントが得られるかもしれない。最初の方で、データ生成スクリプトヒストグラム表示スクリプトをパイプでつないで動かす例が、さりげなく提示されたりして、一つ一つのサンプルにも心配りが素晴らしい。(下手な本だと、こういう異なる仕事を一つのサンプルにまとめたりしてわかりにくくしたりする)
4章 レポートとデータベース (32Page)
前章よりもさらに高度な処理の提示というか、より組織的なアプローチを示す。(ちなみに、前章の(十分に役に立つ)方法を「場当たり的手法」と切って捨てたりする!) そして、その延長でテキストデータを使用した簡易関係データベース・システムまでも実現する。データファイルのメタデータを管理するrelfileファイルとawkもどきの問い合わせ言語qの仕様を提示し、その実装をおこなってみせる。チュートリアルから初めて、ここまでわずか150ページ。濃いなあ。
5章 語句処理 (30Page)
文章操作に関する処理、簡易文書生成、文書フォーマッタ、索引作成プログラム等が紹介される。その説明の中で、さりげなく6章の準備として言語の「文法」の定義方法について解説しているのがポイント。
6章 小さな言語 (30Page)
AWKを”(特殊な応用向けに設計された)小さな言語”のための翻訳プログラム(translator)開発に用いた例が説明される。簡易アセンブラインタープリタ、後置記法による電卓、AWK自身のサブセットのための再帰下降型翻訳プログラム、グラフ作成言語、整列コマンド生成言語、と各種サンプルを用いて、AWKが新しい応用分野のための実験に利用できる事が示される。実際に書かれているのはエッセンスとなる機能に絞ってあるけど、1つ1つのサンプルコードはその目的の範囲内では完全なので、作者の主張を過不足なく理解できる。
7章 アルゴリズムの実験 (36Page)
各種sortアルゴリズムを対象に、アルゴリズムの実装・評価をおこなう。評価については簡易プロファイラの作成までやってみる。そして、最後に位相整列(topological sorting)と簡易makeの実現をおこなう。作者は「どちらかというとawkの解説というよりアルゴリズムの入門コース」と言っているが、「はっきりと」そうなっていると思う。楽しいんですけどね。
8章 エピローグ (8Page)
AWKの歴史的な経緯から始めて、特徴や問題点を書いている。
付録A AWKのまとめ (10Page)
リファレンス。
付録B 演習問題解答 (21Page)
各章に設けられた主な演習問題の解答が載せられている。これが無い本も多いが、教育目的でそれは無いだろうと思う。とは言っても、この本も全ての解答を載せているわけではない、そこは不満点。
付録C AWK処理系の入手法 (3Page)
さすがに古くて、今となっては意味が無い。インターネットで検索など無い時代、ソフトの入手方法についての情報は重要だった。
索引 (11Page)
そのまま

索引まで入れて、トータル301Page。見てわかるように、4章以降はawkでなくても適用可能な内容で、それが全体の6割を占めるわけです。
この本は、全体の構成や内容も含めて優れたソフトウェア教育の教科書だと改めて思います。

著者について

これは説明不要でしょう。この3名でダメな本というのが考えられない。

どんな人向けなのか

プログラミングをおこなう全ての人へ。
で、終わってしまうのですが、私が初めて読んだときの話でもすると、当時、プログラム(当時の私は、C,COBOLの両方を仕事によって使い分けてました)を何とか書けるようになった頃(今考えると酷かったんですけど)に、ちょっとした作業用に使えるツールとしてawkをちょっと憶えようかな、というくらいの軽い気持ちで手に取ったんです。最初は「これなら簡単に使えるし便利だな」位だったのが、半分くらいから「これは背筋を伸ばして読まねば」「このサンプルを動かして見ねば」という気持ちになり、読み終わった後はもうawk(というよりは後半のさまざまなレパートリー)で頭が一杯でした。
「ああ、これを仕事でも使って、もっとエレガントに問題を解決していきたい、いや、いかなきゃ」と。つまり、やっとプログラマの入り口に立ったわけです。
今でも多くいるであろう、情報処理の専門教育をほとんど受けてこずにプログラマとなったような人、受けたけど右から左だった人は読むべきです。awkというツールを使用した情報処理入門であり、中級以上のスキルを身につけるためには、この本で書かれている事は必須なのです。
なお、単純にAWKの使い方とかtipsだけが知りたい場合は、gawkのドキュメントを見ればよいです。邦訳もありますしね。

得られるメリット

まあ、ここまでで、さんざん書いたのでわかるでしょう。たったの300ページでここまで色々なトピックのエッセンスに触れられるのは、そうそう無いです。トピックの範囲は広いですが、例えば、GoFInterpreter パターンとかも身近に感じられるようになるでしょう。
現在のモダンなスクリプト言語だと、普通の言語解説部分だけで500ページとかになったりしますから、時間がない人にもお得です。

キーワード

上述の構成、特に4章以降でピンと来たら手に取る価値あると思います。

入手方法

アジソン ウェスレイ トッパン → シイエム・シイ → 新紀元社 と版元を変えて絶版・再版を繰り返しているけど、それなりに部数も出回ったからか、中古の入手も比較的容易です。特に最初のトッパンのものが安いモノからあるようです。

一応、新品の入手も可能で、3度目の再版であるUSP出版版がココから直接購入できます。(というか通常は書店にはほぼ並ばないようです)