仕事でC言語を使う人の為の基礎教養的な10冊

私のポリシー*1として、

  • 何事にも半歩以上遅れて反応する。
  • 意外とビーンボール気味。

が挙げられるようなので、今頃になって本を挙げてみる。

仕事でC言語を使う場合に基礎教養というかC言語にまつわるベーシックな部分で読んでおくべきだと思う本10冊だ。

ちなみに実際に仕事で使う場合は、少なくともこの他にライブラリなりシステムコールなりのリファレンスが必要。

あと「C言語にまつわるベーシックな部分」と書いたように、C言語いう括りなので以下のラインナップにしているけど、実際にはもっと広い範囲で本を読んでおかないとマズイ*2

『明解C言語 入門編』

新版 明解C言語 入門編

新版 明解C言語 入門編

C言語の言語部分の入門にはこの本を使う。中身が難しいと感じた場合は『やさしいC 第3版 [やさしいシリーズ]』などのもっとやさしい入門書と併読するべし。

いや、C言語の入門書の中では間違いや抜けが非常に少ない本なのですよ。『やさしいC』なんてヌルポインタもNULLマクロも出てこないし……*3

少なくとも定番の入門書の中ではこの本だ。

『C実践プログラミング』

C実践プログラミング 第3版

C実践プログラミング 第3版

プログラミングに不慣れな人が実際にC言語で開発する場合は、この本で入門するか、他の入門書と併用すること。

大抵のC言語の入門書はC言語の文法しか扱ってない。実際の開発で必要な要素が抜けているのだ。未経験で入ってきた新人が『新版 明解C言語 入門編』などで一通り文法を学んだ後に、試しにちょっとしたツールを書かせてみると散々な出来になる*4

実際の所、「どんな文法があるか」だけでなく「その文法をどんな時にどう使えばよいか」という点も重要だ。それにC言語は文法以外に気にするべき要素がかなり多い言語でもある*5。その辺りをそこそこカバーしているこの本はおススメ。

C言語ポインタ完全制覇』

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

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

ポインタが分からない人は適当なポインタ本を読んでおくこと。これ1冊しか読んでないので、読んだ本のみ挙げておく。

世の中には「ポインタなんてやめちまえ!」的な発言もある気がするけど、実際に仕事でC言語を使う場合にはどうしてもポインタを使うことになるので、覚悟しておくこと。

実際のところ、ポインタの概念自体は比較的簡単だ。例えダブルポインタやトリプルポインタになっても、紙に図でも書きつつ解読すれば何とかなる訳で*6、それよりも文法がヤヤコシイとか不慣れなのに無理して頭の中で解読しようとするとか、そういった点が問題を引き起こしているケースが多い気がする。

『CプログラミングFAQ』

CプログラミングFAQ―Cプログラミングのよく尋ねられる質問 (新紀元社情報工学シリーズ)

CプログラミングFAQ―Cプログラミングのよく尋ねられる質問 (新紀元社情報工学シリーズ)

C言語は結構息が長い言語で、ANSI C89が成立してから数えても20年ぐらいになる。それ以前から、世界中のプログラマが大量のCのソースを書いてきた。沢山の先人がいる訳だ。

なのでC言語を使っていて自分が疑問に思ったことの大半は、既に先人が解決済みな内容だと考えた方がよい。

この本のFAQの解答は comp.lang.c にて沢山のCプログラマの目に晒されて、長い間かけてアップデートされてきたものだ。下手にググるよりも、この本の目次を眺めた方が正しい答えに辿り着くと思う*7

『エキスパートCプログラミング』

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

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

C言語の世界を深く掘り下げていく第一歩にちょうどよい本。

他の言語もそうだけど、C言語は特に掘り下げて理解しておくことが欠かせない部類に入ると思う。浅い理解で下手に使うと痛い目にあう。

『組込み開発者におくるMISRA-C:2004 C言語利用の高信頼化ガイド』

組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド

組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド

Cプログラマなら組込み開発者でなくても読んでおく価値がある本。1つ前の『組込み開発者におくるMISRA‐C―組込みプログラミングの高信頼化ガイド』でもよい。

MISRA-Cの解説書なので、各ルール1つ1つに対して解説やサンプルコードが付いている。読むべきなのはその解説部分で、

  1. どのような問題があるのか?
  2. その原因は?
  3. ルールを破ると何が起きるか?
  4. 解決策は?

といった部分が充実している。特に (1) はC言語の仕様や制約によるものが大半なので、組込み以外でC言語を使う場合にも注意すべき項目となる。

随所に『Cプログラミングの落とし穴 (新紀元社情報工学シリーズ)』への参照があるので、持っている人は2倍楽しめる(かもしれない)。

『S.P.ハービソン3世とG.L.スティール.ジュニアのCリファレンスマニュアル』

S・P・ハービソン3世とG・L・スティール・ジュニアのCリファレンスマニュアル

S・P・ハービソン3世とG・L・スティール・ジュニアのCリファレンスマニュアル

リファレンス本は必須。C言語の各バージョン*8C++ 2003あたりの互換性や違いを気にする必要がある場合はこの本がおススメ。

元々コンパイラ開発から端を発した本なので、規格書代わりに多用しても何とかなると思う*9

ANSI C89の範囲で十分なら『CユーザのためのANSI C言語大辞典』でもよい。

C/C++セキュアコーディング』

C/C++セキュアコーディング (SEI SERIES・A CERT BOOK)

C/C++セキュアコーディング (SEI SERIES・A CERT BOOK)

C言語脆弱性は切っても切れない関係なので、この手の勉強は必須。

とかく最近は組込み機器といえどもファイルを読むしネットワーク通信もする訳で、何となく90年代後半以降のWindowsのように、

といったような状況を追体験しているような気がする。

『定本 Cプログラマのためのアルゴリズムとデータ構造』

定本 Cプログラマのためのアルゴリズムとデータ構造 (SOFTBANK BOOKS)

定本 Cプログラマのためのアルゴリズムとデータ構造 (SOFTBANK BOOKS)

少なくとも、配列以外の簡単なデータ構造の知識は必須。だって何かしらライブラリを使わない限り、自前でデータ構造を実装することになるから。

例えば私の周囲ではFIFO(リングバッファ)は良く使われる。時々連結リストも。まあどちらもヒープメモリを使わない実装だけど。

この本は基本的な部分しか扱っていない。より突っ込んだ所を勉強したい場合は別の本を読むことになる。

『プログラミング作法』

プログラミング作法

プログラミング作法

C言語と関係ない? そんなことはない。この本の大半のプログラムがC言語で書かれているので、必然的にC言語(ないしその派生の言語)での開発にそのまま適用できるネタが多くなっている。

例えば「第2章 アルゴリズムとデータ構造」ではC言語でリスト、ツリー、ハッシュなどを実装している。また「第8章 移植性」にはC言語で複数プラットフォームに対応したコードを書くのに欠かせない内容が詰め込まれている。

現実にはこの本の内容を全てそのまま適用する訳にはいかないのだが*10、ただでさえ危険と隣り合わせなC言語を使うのだから、バグ低減の第一歩として良いコードを書くようにして欲しいところだ。

*1:単なる癖ともいう。というか絶対ポリシーではない。

*2:本を読むだけでなく、コードの読み書きも必要だけど。

*3:確認した限り、第2版と第3版にはでてこない。

*4:全部main()に書いてあるとか、データを構造体に纏めずに個別の配列に格納しているとか、構造体のオブジェクトをそのままfwrite()で書き出すとか、コメントが全く書いてないとか、逆に1行1行事細かくコードの中身をコメントで反復しちゃうとか……。

*5:C言語に限った話ではないけど。

*6:慣れれば紙に書かなくても脳内イメージで理解できるようになる。

*7:でもGoogleは便利。

*8:厳密にはバージョンではないが、K&R/C89〜C95/C99のこと。

*9:もちろん厳密な所を調べるなら規格書。

*10:例えばmalloc()が使えない環境もあるし。