C言語が教育用言語として優れているという考えやその風潮は、たしかに間違ってはないが、その教育の対象はプログラミング入門者や初心者のことではなく、コンピューターサイエンスを学ぶ学生のことであることを忘れてはならないと思う。
実際、C言語はコンピュータの仕組みやアルゴリズムの考え方/実装方法を学ぶのには非常に適した言語である。事実、情報系の大学や学部では今でもC言語を教えており、C言語を主軸にしてカリキュラムを組む教育機関も多い。
そもそも初心者にC言語を学ばせるというのは、免許を持ってない人に大型トラックやF1マシンの運転方法を教えたり、教習所の生徒に自動車の整備方法を教えたりするようなもので、明らかなミスマッチだと思う。
カレーの作り方を教えて欲しいと頼まれて、ジャガイモの育て方やスパイスの混ぜ方から教えようと思う人はいないだろう。C言語を教えるということは、つまりそういうことなんじゃないだろうか。
C言語は「コンピュータ・サイエンス」や「プログラミング言語」を学ぶには最高の言語ではあるが、「プログラミング」や「コーディング」を学ぶのには適していない言語のように思える。プログラミング初心者にはもっと、抽象度が高く、文法もシンプルで、記法の自由度の少ない言語を与えたいものである。
備考
教育用C言語や機能制限版C言語みたいなものがあれば理想なのだが、誰も作ってくれない。少なくともその手の言語が受け入れられた例がない。そもそもそこまでする必要があるのかという気がしないでもない。
結局のところC言語が一番安心して採用できるのである。業界標準であることや過去の資源(知見・書籍・ノウハウ)が多いことも関係している。
言語のコア機能自体も非常にコンパクトにまとまっており、記法のブレも生じにくい。変数の初期化方法だけでいくつものバリエーションが存在するC++言語とは大違いである。
/* C++の愉快な初期化記法たち */
struct Number { Number(int v) {} };
Number a(9);
Number a{9};
Number a = 9;
Number a = {9};
Number a = 8 + 1;
Number a = Number(9);
Number a = Number{9};
Number a = Number({9});
Number *a = new Number(9);
auto a = std::make_unique<Number>(9);
auto a = std::unique_ptr<Number>(new Number{9});
/* C言語の数少ない初期化記法たち */
typedef struct { int value; } Number;
Number a = {9};
Number a = {.value = 9};
Number a;
a.value = 9;
Number *a = malloc(sizeof(Number));
Number *a = malloc(sizeof(*a));
a->value = 9;
C言語は紛れもなくシンプルな言語である。C言語は理解することこそ難しいものの、一度理解できてしまえば、言語仕様自体は非常に簡潔でまとまりのあるものだということに気づく。そしてシンプルであるが故に、間違いを犯しやすい言語でもあることも同時に理解する。
C言語を学ぶということはある意味、哲学や歴史、教訓を学ぶことに等しい。高等教育でC言語を学ばせるというのも、単にコードを書く能力を身につかせるためだけではなく、より広い視野で物事を判断できる人材を育むという意図があるのだ。
考察
初心者向け言語の理想
var str = "Shop "
var num = 99
// 文字と数字を結合する
var shop = str + num
// 表示する
print(shop) // "Shop 99"
C言語の現実
#include <stdio.h>
#include <string.h>
int main(void) {
const char str[] = "Shop ";
int num = 99;
// 数値を文字列化する
char buf_num[2/*numの桁数に合わせること!*/ + 1]; // VLA禁止!!
snprintf(buf_num, sizeof buf_num, "%d", num);
// 結合用のバッファーを用意する
char buf_str[sizeof str / sizeof(char) +
sizeof buf_num / sizeof(char)];
strcpy(buf_str, str);
// 文字と数字を結合する
strncpy(buf_str + strlen(str),
buf_num,
sizeof(buf_num) / sizeof(buf_num[0]));
// 表示する
printf("%s\n", buf_str); // "Shop 99"
}
C言語という言語は実現したいことを実現できるようになれるまでの道のりが長くなる傾向にあると感じる。
数値を文字に変換する単純な作業においても、ポインタやメモリ領域の知識が必要になる。
また、右も左も分からないような初心者に#include <stdio.h>
やprintf("%d\n", 9);
という記法はあまりにも酷である。
セミコロン;
も不要だ。こんなコードを書いてしまう生徒が出て来るかもしれない。
#include <stdio.h>;
int main() {
printf("Hello world");
};
教員の力量と生徒の質に極端に依存してしまう言語という時点でダメダメである。
醜悪至極の言語としかいいようがない。