K&R周りに関する個人の読書録

先日、デニス・リッチー氏が亡くなられたということで、K&R周りに関する個人のつまらない読書録を紹介することで追悼したいと思います。

訃報: C 言語の開発者、デニス・リッチー氏が死去
http://developers.slashdot.jp/story/11/10/13/0224245/

UNIX, C言語の始祖)Dennis Ritchieから学ぶべきこと
http://jp.techcrunch.com/archives/20111015what-can-we-learn-from-dennis-ritchie/

数年前、とある大規模()エンタープライズシステムでC/C++システム開発をしていたときのこと。

僕「俺まだK&R読んでないんだよねー。」
同僚「それ知ってますよ。リッチーアンドカーニハンってやつですよね?」
僕「それじゃK&Rにならねぇじゃん!」

という香ばしい会話をしていたわけですが、そのときにK&Rはバイブルではあるがいろいろ落とし穴があるということで、他書籍に寄り道しつつ読み進めていました。

1冊目。『C言語ポインタ完全制覇 (標準プログラマーズライブラリ)

C言語ポインタ完全制覇 (標準プログラマーズライブラリ)

C言語ポインタ完全制覇 (標準プログラマーズライブラリ)

配列とポインタの関係において、世間の多くのCの入門書は、いい加減で曖昧な説明だけを書いてお茶を濁しています(K&Rを含む。というより、この本が諸悪の根源だと思う)。そのうえ、一度配列で書いたプログラムを、わざわざポインタ演算で書き直したりして、「こういうのがC言語らしいプログラムだ」なんていってる本が非常に多いのが現状です。

諸悪の根源とまで書いてありますが、C言語の成り立ちから始まりつつも1冊まるごとポインタの本です。理解しにくい宣言周りについて、詳しく書かれています。本書の最初の方に出てくる、ANSI CのRationale(理論的根拠)の一節、「Keep the spirit of C」の紹介が素敵なので紹介します。

ANSI CのRationaleはここにあるらしいです。
ftp://ftp.uu.net/doc/standards/ansi/X3.159-1989/

1.プログラマーを信じなさい(Trust the programmer.)
2.プログラマーが、理由があって何かをしようとしているとき、それを妨げてはいけない(Don't prevent the programmer form doing what needs to be done.)
3.言語を小さく、シンプルに保とう(Keep the language small and simple.)
4.ある1つの操作のためにには、たった1つの方法だけを提供しよう(Provide only one way to do an operation.)
5.たとえ移植性が保証されていなくても、高速にしよう(Make it fast, even if it is not guaranteed to be portable.)

これがC言語なんです。書きにくいとかメモリリークだとか移植性がどうとか言っちゃいかんのです。

2冊目。『アホでマヌケなプログラミング (プログラマーズ叢書)

アホでマヌケなプログラミング (プログラマーズ叢書)

アホでマヌケなプログラミング (プログラマーズ叢書)

Lepton先生のエッセイをまとめたものです。悲惨なプログラムやシグマなど、全般的にSEの悲哀を書きつつも著者のプログラミングに対する愛情溢れた本です。10ページほどK&Rのポインタ周りをネタにした箇所があります。

3冊目。『Lepton先生のCの強化書 (開発の現場セレクション)

Lepton先生のCの強化書 (開発の現場セレクション)

Lepton先生のCの強化書 (開発の現場セレクション)

これもLepton先生の著書ですが、『開発の現場』の連載をまとめたもので、2007年初版でC99などの話題もあります。ISOの規格書やK&Rを随時参照して話が進みます。

4冊目。『叫ぶ!Cプログラマ―プロが説くCのカラクリと落とし穴

叫ぶ!Cプログラマ―プロが説くCのカラクリと落とし穴

叫ぶ!Cプログラマ―プロが説くCのカラクリと落とし穴

本書もエッセイ調に面白おかしく書かれています。有名な"hello, world."について、

つまり、「K&R」にそういう説明がないのは、やさしそうな「こんにちは世界」とは裏腹に、あの本がもともと、コンパイラというプログラムが何をするモノかとか、コンパイルされた結果のコードはどうメモリに読み込まれてどう実行されるかとか、そういうコトに関して今さら解説を必要としないヒトが読むことを想定して書かれたものだからなんである。ところが、現在の本屋でC言語の解説書を手にするヒトの90%は、前章まででオレが解説したコンピュータのごくごく簡単な様式すら理解していないのが現実である。それぢゃあCを使ってイッパシのプログラムを書くのは難しいんだよ。

と身が引き締まる文章が書かれていたりします。記憶クラス指定子の解説などが詳しいです。

5冊目。『C言語撃退講座 ~K&Rは置いて、俺の話を聞け

C言語撃退講座 ~K&Rは置いて、俺の話を聞け

C言語撃退講座 ~K&Rは置いて、俺の話を聞け

タイトルと表紙から受ける印象通り、文章がかなり香ばしく冗長な印象を受けるのですが、それも含めて楽しんでください。

6冊目。『カーニハン&リッチー『プログラミング言語C』を読む (KS)

カーニハン&リッチー『プログラミング言語C』を読む (KS)

カーニハン&リッチー『プログラミング言語C』を読む (KS)

文字通りK&Rの副読本です。

7冊目。『エキスパートCプログラミング―知られざるCの深層 (Ascii books)

エキスパートCプログラミング―知られざるCの深層 (Ascii books)

エキスパートCプログラミング―知られざるCの深層 (Ascii books)

実は、冒頭のプロジェクトを離れてからC言語に触れておらず、本書を読むところまで至らなかったのですが、ぜひ読みたい本です。

おまけ。 c - *sとs[]の違い / 404 Blog Not Found

http://blog.livedoor.jp/dankogai/archives/51028910.html


他にもC言語に関する書籍は読んでいますが、K&Rに言及があって比較的重くない書籍を紹介してみました(1冊を除く)。まぁ、むしろK&Rだけ読んで自分でひたすらコード書いてみた方が近道かもしれませんね。というわけで、「そこまでしないとC言語を書いてはいけないのか」という声が聞こえてきそうですが、そういう言語ではないかと思います。他にCとC++が混在した環境だと両者の言語仕様差異やコンパイラ実装依存などもあったり、そもそもUNIXシステムコールMicrosoft MFCの話などもないので派手なアプリケーションは作れません。今は新人研修でC言語を使わずにJavaなどの言語が使われていたり、アプリケーションを構築するには不要になりつつあります。一方で、今も様々なミドルウェアC言語で書かれていたり、世界最大のオープンソースLinuxカーネルC言語です。プログラミングを極めたい人のための言語ではないでしょうか。

デニス・リッチー氏のご冥福をお祈りします。

プログラミング言語C 第2版 ANSI規格準拠

プログラミング言語C 第2版 ANSI規格準拠

プログラミング言語Cアンサー・ブック 第2版

プログラミング言語Cアンサー・ブック 第2版