Scribble at 2022-06-14 14:24:44 Last modified: 2022-06-14 16:33:20

先日、プロプロセッサ命令を省いてるような本でも〈僕は〉読み慣れているから気にしないと書いたのだが、もちろん C や C++ の初心者には適切に書かれた教科書を勧める。それこそ、日本では教科書が相当な数の著者によって書かれているし、素性の分からないライターから大学教授、あるいは現職のエンジニアから趣味的な範囲でブログ記事を書いている人物のコンテンツを本にしたようなものまで、本当にいろいろな本がある。もちろん、僕は悪い意味での「アカデミズム」なんて信じてないから、大学教授やプロのエンジニアが書いた本をアマチュアやライターの書いた本よりも理由なしに優れているなどと考えたりしない。しかし、表面的な分かりやすさを優先した物書きの著作物が概して底の浅い見識で書かれたものであることは、残念ながら事実である。そして、いちばん困るのは「動かないコード」を本に掲載する人々だ。

ダイテル親子の C を扱ったテキストはアメリカでよく売れているようだが、動かないコードを掲載したり、無定義でプログラミングの用語を説明に使ったり、正直なところ読み慣れている僕でも疑問を覚える(改めて言っておくが、原著の新しい版では修正されて、プリプロセッサ命令がすべてのコードに付いている。僕が言っている感想は、あくまでも翻訳と翻訳の底本になった古い原著についてだ)。愛着のある本ではあるが、はっきり言わせてもらえば教科書としての「名著」ではない。 #include <stdio.h> も記述しないで、いきなり main() { ... などと書き始める Hello World は、もう現代の開発環境では正しくコンパイルされない(何か特別な環境設定でもしないかぎり)。初心者がごく普通に Clang + LLVM を入れてコンパイルしても、絶対に "note: include the header <stdio.h> or explicitly provide a declaration for 'printf'" とエラーを返されるに決まっており、1ページ目から動かないコードを入力させられる苦痛は、初心者にとって学習での不安にしかならない(「動かないプログラムの書き方を教わるのかよ・・・」)。同じく、Hancock, Krieger, Zamir の "The C Primer" にしても、第1章で C に対する批判的な内容も本書には書かれているなどと大上段のセリフを放った直後に、やはりこの本でもプリプロセッサ命令なしに main() {... と書いてしまい、これを cc コマンドでコンパイルしようなどと言う。他にも、日本人が書いたものだと有名どころでは石井晴久氏の『Cプログラミング』(岩波書店)なんかも、「名著」と言われているらしいが、これもプロプロセッサ命令を書いていない。「冒頭に書くべきところを省略している」という但し書きもないから、これで動くという前提なのかもしれないし、実際にそれでも動く環境で運用されていたのかもしれないが、たいていの初心者はプリプロセッサ命令を省略できる特殊なコンパイラの設定(# clang main.c -include stdio.h とやれば "Hello world." を printf() で出力するだけの main.c にプリプロセッサ命令がなくてもコンパイル・エラーにはならない)など知らないだろう。

確かに、これらはどれも30年近く前の古い本ではあるが、C や C++ の基本的な言語仕様なんて殆ど変わっていない筈であり(それでは Perl5 vs. Raku のような別の言語になってしまう)、適正なコーディングの事例として動くソースを掲載するのであれば、プリプロセッサ命令を冒頭に記述することは儀礼や好みやイデオロギーの問題ではなく、それこそ〈機械的に〉必要な要件である。そして、このような機械的な条件を理解したうえで、コンパイラの設定などによっては一部の命令を省略しても通るようなハックができるなどという特殊な知識を身に着けることもありえるが、最初にそんな条件を仮定して初心者にものを教えるのは不見識というものだろう。そういうわけで、C や C++ の教科書として冒頭で紹介される Hello World のコードだけを見ても、初心者に勧められる本であるかどうかの判断ができたりする(もちろん、これは嘆かわしいことなのだ)。上記の2冊に比べて、たとえば Ivor Horton の "Beginning C" などは、全てのコードに最初からきちんとプリプロセッサ命令が書かれているし、この1行を全てのコードに書くために多少はページ数が増えたとしても、もともと1,000ページの本として企画されているのだから、大した影響はないだろう。

  1. もっと新しいノート <<
  2. >> もっと古いノート

冒頭に戻る


※ 以下の SNS 共有ボタンは JavaScript を使っておらず、ボタンを押すまでは SNS サイトと全く通信しません。

Twitter Facebook