「プログラミング経験者向けのCプログラミングの入門書」が欲しい

タイトルに書いたことが全てだが、思考の整理を兼ねて、もう少し深掘りしてみたい。

以下に示す要求に合致した書籍の類を探しているのである:

  1. C言語(言語仕様)よりも「C言語を用いたプログラミング」に主軸を置いた内容。
  2. 最低でもC99、できればC11/C17の利用を前提とした内容とコーディングスタイル。
  3. プログラミング未経験者ではなく「すでに他のモダンな言語によるプログラミングを経験している人」を想定した内容。
  4. C言語(や古典的なC++)でのプログラミングに付き物の「変数と記憶領域」についての解説がある。

イメージとしては「『プログラミング言語C 第2版 ANSI規格準拠』と『Cプログラミング専門課程』を足して2で割って近代化改修して若干マイルドにしたもの」だろうか?

プログラミング言語C 第2版』のターゲット層は1970~1980年代基準の「コンピュータとプログラミングの基礎」を知っている人*1であるし、内容も「Unix系OSのシェルないし類似環境を想定した、ホスト環境向けのCプログラミング」に軸足が置かれている*2。想定読者はプログラミング経験者であるし、内容も「C言語の言語仕様」よりも「Cプログラミング」の入門書としての側面が大きいといえる。

残念なことに『プログラミング言語C 第2版』は進化が止まって久しい*3。Cプログラマの血と汗の結晶である「言語仕様の落とし穴を回避するための防御的なコーディングスタイル」や、モダンな言語仕様による「より楽で明快な書き方」といった側面が抜け落ちたままとなっている。それ故に、Cプログラミングの中級~上級者向けの奥義書としての価値はまだ残っているものの、Cプログラミング初級者に読ませるには問題がありすぎる、という扱いの難しい本になってしまっている。

『Cプログラミング専門課程』は、Cプログラミングとは切っても切れない「変数と記憶領域」について大々的に解説している本だ。細かい部分は置いておくとして、本書で学んだC言語におけるメモリの扱いについての基本的な考え方は、組込み向けのCプログラミングにも流用できるだろう*4

残念ながら本書は絶版しているらしく、入手が難しい。

あと「ANSI CではなくK&R Cでサンプルが書かれている」という特徴もある。C言語分かっている勢なら問題にならないのだけど、C言語の初学者に読んでもらうには問題がある。この点より、「本書を薦めても問題ない読者」のレベルが「本来、この本を読んで欲しい読者」のレベルよりも若干高めになってしまうという、読者層のミスマッチが起きているように思う。

「ぼくのかんがえたさいきょうのCプログラミング入門書」の内容は、『プログラミング言語C 第2版』と『Cプログラミング専門課程』の抱き合わせだ。どちらも、まずサンプルコードのスタイルを近代化(ANSI C対応+防御的なコーディングスタイルに書き換え)するだけでも、喜ぶ人がいると思うのだ。その上で、C11/C17に対応していたら、もう言うことはない。

対象読者については、最近の人がC言語でプログラミング入門するとは思えないので、そろそろ「プログラミング未経験者向け」という制約を取り除くべきだろう。今日日のC言語入門者って、PythonJavaScript/TypeScriptなどの「モダンなプログラミング言語」でプログラミングしたことがある人が大半だと思う。だから、手続き型プログラミング言語の諸々の基本概念についてすでに知っていると仮定した上で、「C言語でプログラミングする場合にはこう書く/こうアプローチする」みたいなスタイルで説明しても許されるように思うのだ。

一方で、『プログラミング言語C 第2版』の頃には考えにくかったシチュエーションだと思うのだが、Pythonなどの「モダンで安全なプログラミング言語」の経験者からすると、C言語でのプログラミングは「原始的で野蛮なプログラミング言語による縛りプレイ」である。その点について、教育用のコンテンツを作成するにあたり、従来とは違う角度からのアプローチが求められるのかもしれない。

開発環境については、素人のことを考えなくてもよいならば、2023年の時点では「Unix系のシェル環境」に一本化しても大丈夫かもしれない。WindowsにもWSLがあるし、何なら学習環境を一括導入できるDockerイメージを用意することもできる。どちらもWeb系のソフトウェア開発経験者なら触ったことがあるだろう。

つらつらと書き連ねてきたが、タイトルにもあるように、モダンな「プログラミング経験者向けのCプログラミングの入門書」が欲しいのである。何か良い本はないだろうか?

*1:コンピュータ科学の基礎知識を持っていて、かつ他の言語(時代的にBASIC・FORTRANPascalあたりだろうか)でのプログラミング経験がある人。

*2:だから、言語仕様の細かい話については、実のところ他の書籍を参照した方がよい。

*3:少なくとも日本語訳については。原書については知らない。

*4:n=1の感想なので、断言まではできないが、私に場合は流用できた。