Technically Impossible

Lets look at the weak link in your statement. Anything "Technically Impossible" basically means we haven't figured out how yet.

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

スッキリわかるC言語入門 (スッキリわかる入門シリーズ)
プログラム言語の習得において、どの言語から勉強を始めるのか、はあまり意識されることがないのだが、かなりの重要事項だ。最初の言語学習を通じて養われた知見、認識が、2つ目以降の言語を学ぶ際の橋渡しをしてくれる。さらに異なる言語の学習を続けると、言語間の共通概念、ある言語独自の機能や概念が体系的に構成、認識され、学習効率は向上する。
一方、最初に学ぶ言語、2つ目以降に学ぶ言語のコンセプトが違い過ぎる場合、その橋渡しが良好に機能せず、2つ目の言語習得に要する負担は、一つ目のときと変わらないこともあり得る。

英語学習を想像してみるとよい。日本人が英語を苦手とするのは、日常生活で英語を用いない、学校教育云々、色々言われるのだが、原理原則で考えてみてほしい。日本語はウラル・アルタイ語族に、英語はインド・ヨーロッパ語族に分類されている。両言語系統は、分類上、最も遠くに位置している。つまり全く特性の違う言語ということだ。原理原則として、タイプの異なる言語を学ぶのは難しい。プログラム言語も一緒だ。

この観点から、プログラムの初学者が初めて学ぶ言語としてC言語は、かなり良好なポジションにある。C言語を用いた場合の制約や問題をきっかけに、後発の言語へ派生している経緯もあり、C言語で学んだ概念は他の言語でも通じやすい。
学習範囲が広がれば、結局のところC言語に限らず、どの言語でも構文には、それ程変わりがないことを知る。言語特有の機能や概念を学ぶことを重視するようになる。
初学者は、まず構文を学び、加えて特有の要素を学ぶ必要があるため、最初だけは学習負荷が大きいのだ。

『スッキリ分かるC言語入門』(以下、スッキリ~)はタイトル通り、C言語の入門書だ。特にC言語特有の機能であるポインタの紹介を工夫しており、初学者にお勧めの書籍だ。

ポインタは、記録データのアドレスだけを引き渡すことによって、メモリ上の記録データを直接やり取りするのではなく、「参照」させることで処理とリソース消費を効率化する仕組みだ。
初学者に関わらず、ポインタは初見殺しの要素がある。初学者はポインタで挫折し、プログラム学習そのものを止めてしまう。他言語の経験者はポインタを面倒くさがりC言語を避ける。オブジェクトの参照など、間接的にポインタと同じことを実施しているのだが。
またC言語には文字列型が存在せず、文字の配列として処理する必要もある。普段、当然に利用できるものが使えない。他言語の経験者にとっては、またも面倒だ。
C言語には配列を多用する特性があり、この配列がポインタと密接に関わっている。『スッキリ~』はこの特性をかなり意識して学習情報を提供している。それが次の2点だ。本書の印象を非常に強くしている特徴でもある。

2つの特徴

String型の定義

typedef char String[1024];

charの配列として文字列型を定義している。これは2章で登場し、以降の章でも使いまわす前提だ。これを使いまわす前提として、「7つの約束」を定義している。これは文字列型を利用するための前提条件なのだが、自ずとポインタの特性を反映した内容となっている。引用すると、

  • 演算子で計算や連結をしてはならない
  • 演算子で比較をしてはならない
  • 関数の引数や戻り値として、文字列や配列を使ってはならない

ポインタは9章で登場するのだが、それまで読者はこの文字列型を頻繁に利用することになる。この処理を通じて、読者は配列処理を学習することになる。この学習が間接的にポインタの学習に通じている。それとなくポインタの片鱗を示しながら、その裏側に潜むメカニズムをポインタとして、9章で学ぶ構成だ。

からくり構文

からくり構文は10章で登場する。それは本書が独自に定義する構文で、本書の肝に相当する情報でもある。それは次のような構文だ。

  • ポインタ参照による関数渡し
  • 配列変数の評価
  • 添え字演算子の評価

関数の引数や戻り値に配列を指定すると、その値へのポインタを指定したとみなされる。ポインタを介した変数のやり取り、配列の添え字を操作することによって、ポインタが指し示す値全体を取得、評価する仕組みだ。
ポインタを単機能で紹介するのではなく、その利用を含めた一連の体系を構文としてまとめている。この構文に即して配列とポインタを行き来しながら、読者は理屈だけではない、実用的な知識を学ぶことができる。

再び本題

初心者、初学者向けの本と言えば、大きく2つのタイプに判別できる。紹介型と説明型だ。紹介型は、一連の機能や特徴などを列記するだけだ。読者の理解は求めず、情報提供だけを追求している。説明型は、とにかく読者に何かを理解させようとする。初学者が選ぶのは後者の書籍であるべきだ。
本書は特に「理解させる」ことに重きを置いている。筆者がそのことを意識していることが、前述の特徴、工夫に強く反映されている、と私は感じた。

プログラムの学習と言えば、そのサンプル・プログラムは無味乾燥なものが多い。中にはロジック・パズルのようなものを提示する書籍もあるが、ロジックが難しすぎても、読者離れを招くだろう。この点においても、本書は工夫を忘れない。本書を通じて作成するのは「パズルRPG」だ。回りくどい表現だが、いわゆる大人の事情があるのだろう。端的にはパズドラと呼ばれるような類のゲームだ。今風のゲームを題材にするあたりに、読者の関心を引き付ける工夫も感じられた。

作業環境について

本書ではVirtualBox上の仮想マシンに作業環境を構築する前提だ。おそらく本書で唯一、不親切に感じられる箇所だ。ほとんど説明はない。ダウンロード提供されるVMを利用する前提だ。おそらくWindowsMac等の環境差異に煩わされず、読者をC言語学習に集中させる配慮なのかもしれないが、あまり実践的ではない。
この点については、読者自らの努力が試される。もしこだわるならば自身の環境にGCCを導入するか、WindowsであればVisual Studioを導入すればよいと思う。Visual Studioに含まれるVisual C++は、C言語にも対応している。次の投稿が参考になるだろう。
impsbl.hatenablog.jp

余談

プログラミング言語C

C言語の書籍と言えば、カーニハンとリッチーの『プログラミング言語C』が有名だ。C言語の開発者自らが執筆している。特に初学者に対しては、この本を真っ先の読む一冊としてはお勧めしない。
C言語には、最小限の機能を組み合わせて様々なことを実現するようなミニマムさ、簡潔さが好まれる傾向がある。それはきっと筆者の志向でもあるのだろう。それを反映するように、本書の記述は簡潔でドライだ。例えばポインタを初めて紹介する一節だ。このように紹介されている。

普通のコンビュータは、個々にあるいは連続したグループとして扱うことのできる連続的な番号付きの、すなわちアドレス付きのメモリ・セルという形の配列をもつ。よく出てくる状況は、任意のバイトがcharとして扱える場合、1バイト・セルの対がshortな整数として扱える場合、四つの隣接したバイトがlongをなす場合、である。ポインタはアドレスを保持することのできるセル(2個または4個のことが多い)のグループである。

どうだろう、もう少し別の表現で説明してもらえないか?と感じないだろうか。その後に詳細な説明が続くとは言え、ことごとく、このような調子が続く。
またサンプル・プログラムはロジック・パズル的で、ほんの少し難易度が高い。実際、解答が書籍化されているぐらいだ。初めての言語習得で苦労しているのに、サンプル・プログラムの解法で悩むのは、無用な苦労を増やしているとしか思えない。

これらの書籍は大変有意義なのだが、まず他の本でC言語のことをある程度把握した上で一読することを、私は勧める。

C言語でゲームを作る

プログラム学習において、ゲームは関心をひきつけやすい題材の一つだろう。特に80年代に登場したゲームくらいであれば、その基礎的な要素は数時間で実装することができる。プログラミングの実況動画を参照してみてほしい。このような動画も、プログラム学習の参考になる。パズドラ的パズルは小一時間で実装している例もある。

パズドラを小一時間で作ってみた【プログラミング実況】

ドラクエを小一時間で作ってみた(フィールド、イベント編)【プログラミング実況】

ウィザードリィを小一時間で作ってみた【プログラミング実況】