本書の書名『Short Coding』からは、無駄を省いた、見通しの良いプログラミングについて解説した本を予想した。しかし、その予想は完全にはずれた。

本書は、短い簡潔なアルゴリズムによって、効率の良いプログラミングを行う本ではない。ソースをなるべく短くして、バグの発生を未然に防ごうという本でもない。ただひたすら、C言語のソースコードの文字数を減らすことだけを目的にした本である。したがって、プログラムに実用性はなく、きわめてデバッグ困難なプログラムを作る本となっているのである。

通常のプログラムとは異なり、ソースの文字数削減が目的なので、インデントしない、スペースも改行も入れないのは当たり前、{ }や( )もできる限り省略、#includeも省略、変数はすべて1文字、if文は使わず、条件演算子(? :)やAND(&&)、OR(||)の演算子を使用、そのほか、ありとあらゆる反則的なコーディング手法を用いて1バイトでもソースを減らすことに命を燃やしているのである。

本書のコードを実際にコンパイルしてみると、多数のWarningが出たり、コンパイラ/OS/ハードウェアなどの処理系に依存したコーディングのため、正常に動作しないものも含まれているが、もちろんそんなことはお構いなしで、特定の環境で動作すればOKという考えでコーディングが行われている。

ショートコーディングの例

ショートコーディングの一例として、次のコードがある。

a,b;main(c){…プログラム本体…}

これは、本来は、

main(){int a, b, c; …プログラム本体…}

と書くべきところだが、変数宣言の型名のintを省略するために、aとbをグローバル変数として外に出し、gccではグローバル変数の宣言でintの記述を省略できることを利用してコードを短くしている。さらに、3つの変数のうち最後のcについては、main()関数の、本来はargcとなるべき仮引数の位置に書き、argcとは無関係な変数として流用している。こうすると、「a,b,c;main()」と書くよりも、カンマひとつ分、短いコードが書けるというわけだ。このコードからもわかるとおり、グローバル変数とローカル変数の使い分けはもちろん行わない。

さらには、グローバル変数は0で初期化されること、上記の変数c(本来はargc)が、コマンド起動時には1に初期化されること(コマンドに引数が付けられると1にはならないが、本書ではそのことは無視している模様)を利用して、プログラム本体では変数の初期化を省略している。

ちょっとやり過ぎな例もあり!?

本書はさまざまなプログラムの例題に対し、例題を実行する最短のコードを解答する形でページが進んで行く。各解答例の中には、「なるほど」と思わせる技が含まれているが、中には「これはちょっとやり過ぎでは」と思われるものもある。たとえば、戻り値を返すべき関数内で、わざとreutrn文を書かず、それでも値が戻り値用のCPUレジスタに残っていることを期待して、呼び出し元では関数の戻り値を使う、といった手法である。

そのほか、バッファオーバーフローの危険のため、使用が推奨されていないgets()関数や、実用プログラムではなるべく使用を避けるscanf()関数がテクニックの中心に据えられている点が、本書全体として気になるところである。

対象読者は - 駆け出しプログラマは読まないほうがいい?

以上のように、本書には通常のコーディングルールとはおよそ正反対のことが書かれているため、C言語を勉強中、または経験1年未満のプログラマは、コーディングに変な癖をつけないためにも、本書は読まないほうがいいかも知れない。あくまで通常のC言語を知っているプログラマが、本書の特異なコーディングを見て、その奇抜さを楽しむための本であろう。

一方、経験があるプログラマが本書を読めば、異常なほどに好奇心をそそられるし、書かれているプログラムの動作原理を理解するには、C言語についての相当な理解が要求されていることがわかるだろう。つまり、本書の内容は実用プログラムには役に立たないが、本書の内容を理解するためには、読者自身が実用プログラムにおいても高いスキルを持ったプログラマでなければならないということだ。

気になるところ

本書では"POJ"と呼ばれるオンラインジャッジシステム(Web上で出題される問題に対し、解答のソースを投稿すると自動的に正解判定を行うシステム)が冒頭で紹介され、以降、このPOJが正解とみなすかどうかを「絶対的な評価基準」として解説が行われている。扱っている例題はPOJで出題されているものであり、「POJ No.XXXX 問題名」といった項目立てでページが構成されている。

第3章冒頭には、これから先の章はPOJを必ずしも前提としない旨の記述があるが、読んでみると3章以降も大部分がPOJを前提とした記述になっている。よって、POJに馴染みのない人が、POJとは関係なく、ショートコーディングの技だけを知りたいと思って読むと、少々引っかかるものを感じるかもしれない。

さらに細かいことを言えば、改行コードを表すエスケープ文字が、日本の一部OS環境での表示である「¥n」で印刷されているが、これは一般的な「\n」で印刷してほしかったと思う(実際は半角)。

おわりに

とは言え、本書はプログラマの頭脳を強烈に刺激する本であることは間違いない。普通のC言語の本では満足できないプログラマには、一読の価値があると言えよう。

『Short Coding ~職人たちの技法~』

Ozy著 やねうらお監修
毎日コミュニケーションズ発行
2007年8月8日発売
B5変形判 / 396ページ
ISBN978-4-8399-2523-9
定価 2,940円

本稿で取り上げた書籍『Short Coding ~職人たちの技法~』を2名様にプレゼントいたします。ご希望の方はこちらからお申し込みください(応募締切:2007年10月31日)。