スッキリわかるC言語入門

「スッキリC」が少し「ズレた入門書」である理由

こんにちは、「スッキリC」著者の中山です。今回から著者ブログ記事スタイルで、スッキリシリーズの中でも特に異彩を放つこの本について、その特徴とか裏話とかをお届けしていこうと思います。

まずは、なんといっても某大手ネット書店のレビュー欄で話題沸騰のこの話題からいきましょう!

スッキリCが、C言語入門書業界の「歴史と伝統」から若干ズレている問題

いろいろズレてるらしい「スッキリC」

...そうなんです。実は「C言語入門書」っていうものを数多く見てきた方こそ、スッキリCの解説アプローチや紹介手法が特殊であることにすぐに気づかれます。以下のような特徴は、C言語の総合入門書としてはおそらく本書しかないんじゃないかなと思います(俺調べ)。

具体的には、すぐに思いつくものだけでも

  • 変数宣言を関数の冒頭にすることを注意喚起・推奨していない
  • 制御構文(if/for)を学んだ直後にいきなり構造体が出てくる
  • unsignedの紹介が「型」の解説でスルーされて、コラムと付録にしかでてこない(紹介記事)
  • typedef char String[1024]で解説前半を爆走する(紹介記事)
  • 登場する女の子がイ○シャルDばりにドリフトするシーンが登場する1

実はぞれぞれ思い入れがあって、あえてそのような解説設計になっているのですが、
詳細はおいおい記事にできればと思います。ただ、それらの全てに共通する思いはただ1つです。

2019年の今、たくさんの言語が溢れる時代に、あえてCを学ぶ意味と価値が届けばいいな...
(できれば楽しく、学び手の方の苦労や疲れが最小限で済みますように...)

実際にレビューを見て戴くと、「今までのC言語の本より圧倒的にわかりやすい!」という評価と、「今までのC言語の本からすると違和感を感じる」というお声の両方があることからも、この本が意図的に「今までのC言語入門書の解説とは違うアプローチ」で執筆されたことをご評価いただけていると感じ、本当にありがたく感じました。

たとえば、上記にもでてきた「変数宣言を関数冒頭でやることを推奨しない」という執筆方針。スッキリCでは「変数宣言」の解説章で、この話題を完全スルーしました。

「なにそれ?」補足

昔のC言語標準は、「変数宣言文は関数の先頭でしか行えない」という制約がありました。つまり、printfなどの命令を呼び出したあとに「int a;」などはできなかったわけです。

某ネット書店レビューにも投稿いただいたように、「この書き方は古い言語処理系では使えない!」「こんなのを入門書で教えるとは、けしからん!」などとお叱りをいただくだろーなー...ってことは、もちろん覚悟の上でした。

「けしからん!」の気持ちが共感できすぎる件

その「けしからん!」っていう気持ち、実は、私もすごく共感できるんです。私がはじめてC言語を学んで使い始めたのが約30年前。各社がK&Rを勝手に解釈して非互換の処理系を出しまくるという混沌としたC言語ワールドに、世界標準「ANSI-C(今でいうC89)」が登場し、「うぉーーー」となっていた頃でしょうか。

平成生まれの方に「冗談でしょ?」と笑われましたが、当時コンパイラって「高額ソフトウェア」の代表格で、小学生だった私が買えるはずもなく「LSI-C 試食版」とかいう謎のコンパイラ2を使ったりしていました3

当時、今とは違ってPythonもJavaもなかったから、世の中の多くのコードはCで書かれていて移植性が大事だったと思うんです。その一方で、上記のように俺に何か恨みあるのか、っていうぐらい処理系によって互換性がなかったり、些細な記法の違いでコンパイラによって動きが違ったりしたので、そういう「安全側に倒して、より多くのコンパイラで着実に動く、可搬性が高い書き方をする」ってことが大事だったんです。

でも「思い出」はいつも綺麗すぎるから。

今でも、「後方互換性を大事にする」っていう考え方はとても大事なことだと思います4

ただですね...

1999年には、もう世界標準(C99)でこの制約は撤廃されている

んです。

いいですか、20年前ですよ? 20年前っていったら、

  • NTTドコモがiモード対応の携帯電話を発売
  • MicrosoftがInternet Explorer 5を発表
  • 「ダンスダンスレボリューション」「ヤマンバファッション」「だんご三兄弟」が大流行
  • 今は腹が出たオッサンの中山が、スマートな大学生だった

です5

もちろん、世界標準規格として縛り撤廃が定められても、処理系実装がそれに対応し、さらに現場に広まるまでには長い時間が必要でしょう。
ただ、それに10年の月日を要したとしても、さらに10年は経過しています。

そして世の中は大きく変わりました。

ヤマンバは絶滅し、IEはMS自身が非推奨しはじめ、「え!まだやってたんか?!」という驚きしかないiモードも2019年9月末にとうとう正式に終了します。

後方互換って大事だけど、こだわりすぎると「技術の進化に足輪をつける」「不便・古くさい・(今の学習者にとって)理不尽、という印象が広がり、学ぶ人が減る」ことになるのではないだろうか...などとも思うわけです。

実際私の知るかぎりですが、近年のメジャーなプログラミング言語で同様の制約がある言語はありません。「Effectiveほげほげ」系の書籍では、随分昔から遅延評価や初期化忘れ防止の観点から、「関数冒頭で宣言するな。使用するときになってはじめて変数宣言をしろ」と推奨していたりします。

ガチの組み込みC屋からの意外なアドバイス

とはいえ、執筆当時の私はそれでもまだ迷っていました。「C言語を代表する制約」であるこの話題を、亡きものにしてしまっていいのか...。

そんな悩みに終止符を打ってくれたのが、執筆協力をしてくれた岸氏です。
17年前に出会って以来、私が尊敬する数少ないプログラマの一人である彼は、それはもう現役バリバリの組み込み現場で、業界人以外知らないであろう処理系とともに、日々モフモフお仕事をしている「ガチなC屋」。私が、悩んだあげく彼に相談した日のこと、、、。

「ねぇねぇ。やっぱ組み込みとかの世界だと、古ーい謎な処理系とかだから変数宣言先頭縛りとかあるんだよね?」

そしたら返ってきた答えが意外すぎて。

「はぁ? どんだけ昔の組み込み業界の話してんの? 最近の組み込み現場は割と進んでて、普通にgccとか使うし、そうじゃなくてもさすがにC99ぐらい対応しとるわ。
まぁときたま特殊な処理系使う案件もあるけど、そういう案件は現場に"ノウハウ"がある。標準と違う点や注意ポイントも文書化されてるし、新人さんは別途教育されるし、レビューもしっかりやる。6

思考すること5分...

助さん、角さん、もーいいでしょうッ!

それが、私の結論でした。

本文解説で「全力スルー」してみた

このような経緯があり、スッキリCの「変数宣言」の解説章では、「宣言位置縛り」の話題は一切でてきません。きっとはじめて学ぶ人は、関数呼び出しや制御構文同様、「あぁ、必要なときに、書けばいいんだな」としか思わないでしょう。

でも、それでいいと思うんです。

そこで私が、「いやー、昔はだな、ここに制約があってだな、これは恐らく関数宣言のコールスタックとローカル変数のスタック領域を隣接して設計したほうが言語処理系の設計が、、、」なんて嬉しそうに語り始めたら、それはもう「著者が自分が気持ちよくなるための解説」になってしまう。

あんだけ「あ!冒頭に変数宣言するのうっかり忘れちゃった! いけね、いけねー」って苦労した自分の日々のことを思い出すと、そんな煩わしさに悩まされない2019年の学び手のことを羨ましく思う自分がどこかにいることも否定はしないけれども、「あんなに手がかかる時代もあったよな、、ふふふ。」って美化された思い出として、私が私の中で大切にしていけばいい。

それより、ただでさえ敷居が高い(と思われがちな)C言語の学習に取りかかってくれた方が、まだ不安を抱えながら学びはじめたばかりの1章や2章の段階で変な制約に煩わされず、なるべくスムーズに旅をしてもらったらいいと思うんです。

将来、特殊な処理系を使うことになった人や、C言語の歴史に興味を持った人は、別途付録Cに、かなり詳細に言語標準の違い(C89では変数宣言位置に制約があることを含む)や処理系の互換性について記述しておきましたので、楽しんでいただければそれで十分です。

「俺、ズレてます!」

こういうとC屋さんに怒られるかも知れませんが、C言語自体(C++やC#を含まない)は、私が学んだ20〜30年前が黎明期・黄金期だったと思います。「Cを学ばずんばプログラマにあらず」という勢いで大学等では活発に教えられ、企業の開発現場でも「注目のイケてる新言語C」をどんどんCを取り入れていった。

そして多くの有名なC言語入門書は、そのC言語黎明期にそのベース構造や骨組みが確立され、その流れを汲んでいます7

そう考えれば、それらの入門書と「黎明期から30年の月日が流れた後にゼロから設計され生み出された」スッキリCとを見比べたとき、違和感がないっていうほうがむしろ不自然なのだと思います。

そんなこんな「悩み」と「想い」が詰まりすぎて、750ページもある武器的な厚みとなっているスッキリC。ぜひ、Cとの素敵な旅のお供にしていただけたら幸いです。

  1. この描写はC言語最難関であるアドレスやポインタの解説をスムーズに理解するための重要な伏線
  2. 今もあります。
  3. Borland C++を入手し、(別に不要なのに)largeモデルでコンパイルしたとき、俺も大人になったなって思ったもん
  4. v3あたりのRailsみたいに、マイナーバージョンアップなのにバンバン破壊的な仕様変更があって現場に悲鳴があがるなんていうのを経験すると、マジでそう思う。
  5. 時の流れって残酷だと、お腹をみて思う
  6. 良い意味で「組み込み現場なめんな」的なコメントで安心した
  7. 30年前に、当時小学生だった中山自身がまさに読んでいたのですから、間違いありません

-スッキリわかるC言語入門
-,