プログラミング教育の雑談シリーズ第二弾です、プログラミング言語の中で変数は難しいものです。コンピューターのハードウェア(CPUやメモリー…)の動作を理解し、アセンブリ言語や機械語を学んだ人は変数の実体が理解できるかもしれませんが、JavaScriptやPython, Ruby, Javaなどから学んだ人には変数は謎の箱というイメージなのでしょうか?
DALL·Eで生成したプログラミング教育の画像
数学の=とは違う
プログラミング言語初心者にプログラミングを教えているときにn = n + 1
というコードを見て「先生これはおかしいです、この式を満たすnは存在しないのです」のような質問をしてくれる人がたまにいます。このような質問をしてくれる人は、良いプログラマーになれる可能性が高いと思います。😊
=
は代入を行う演算子(または代入文)で、数学の=
とは違うのです。ただしHaskellのような数学の=
に近い=
をサポートするプログラミング言語もあります。
そろばんを知らない若者
=
で思い出したのですが、以下のプログラムを見てください。プログラマーの方は数秒で、1から10までの和を計算し表示するプログラムと判ると思います。
let sum = 0;
for(let n = 1; n <= 10; n++) {
sum = sum + n;
}
console.log(sum);
初心者に、このプログラムを理解しにくくしているのはsum
という変数です。最初に0を入れ、繰り返し(for文)のなかでsum
に1から10までの数値を足し込んで行きます。
以前は、sum
という変数を説明する時にはそろばんに例えて説明していました。そろばんの勉強では「願いましては、1円なり、2円なり・・・ 10円では。」の読み上げにたいし、
「願いましてはのところでそろばんを払うところがsum = 0
で、 1円なり、2円なり、・・・ のところがfor文とsum = sum + n
に対応するのです。」と、解説すると通じる事が多かったのです。そろばんは計算機ではなく計算中の数値を置いておく道具なのも、変数と似ています。
しかし、平成も後半になると「先生『そろばん』ってなんですか?」という質問が出るようになり、最近はそろばんの例えは止めました。😅
代入演算子と比較演算子
さて、C言語では、代入の演算子が=
で、等しいいかチェックする比較演算子は==
です。この記法は、JavaやC#、JavaScript, Python, Ruby … とたくさんのプログラミング言語で採用されました。
そのため、以下のようなバグで悩むプログラマーを多数生み出しました。ほとんどのプログラマーに経験があると思います。
if (a = 0) {
// ここは実行されない😅
}
ただし、ALGOL系のプログラミング言語であるPascalや、その進化形のDelphiでは代入の演算子が:=
で、等しいいかチェックする演算子は=
です。
こちらの記法が流行っていれば上のようなバグは発生しにくいかと思います。またn := n + 1
だと数学の=
と混乱する事もなくなるかもしれません。
=
が代入に使わるのは、Assignment (computer science):英語Wikipediaによると1949年に作られたプログラミング言語まで遡るそうです、そして1957年にリリースされたFORTRANにより広まったようです。
私を含めほとんどの読者の方が生まれる前に我々プログラマーの運命は決まっていたのですね。😲