数学者にとって、

$$x = x + 1$$

という一行は解のない方程式である。両辺から $x$ をひくと $0 = 1$ が残る。プログラマーにとっては、もっともよく出てくる行のひとつで、「$x$ の値をとり、一を足し、結果を $x$ にしまえ」という意味である。同じ記号が、二つの共同体で正反対の仕事をしている。あちらでは等しいことを主張し、こちらでは代入を命じるのである。

Fortran が等号を選んだ

張本人は Fortran である。広く使われた最初の高水準プログラミング言語で、ジョン・バッカスの率いるチームが IBM で作り、1957 年に公開された。プログラムはパンチカードに打ちこまれ、一枚に一文で、カード穿孔機のキーボードには記号が少なかった。「$N$ に値 $27$ をしまえ」と言うために、Fortran は技術者の式のように N=27 と書いた。

Fortran の文が打たれたパンチカード。二枚めのカードの `N=27` は、N が 27 に等しいと主張しているのではない。N に 27 をしまえと命じているのである。
Fortran の文が打たれたパンチカード。二枚めのカードの N=27 は、N が 27 に等しいと主張しているのではない。N に 27 をしまえと命じているのである。Tangopaso · ウィキメディア・コモンズ · パブリックドメイン

この選択は実用的なもので、そのまま定着した。しかし、プログラミングを数学として考える人々は落ち着かなかった。1958 年から 1960 年にかけて国際委員会が作った Algol 言語は、代入には別の記号 := を使い、= は比較のためにとっておいた。スイスのニクラウス・ヴィルトは Pascal(1970)で := を引きつぎ、ドナルド・クヌースは『The Art of Computer Programming』で代入を矢印 $x \leftarrow x + 1$ で書く。アイバーソンの APL も矢印を使い、統計言語 R はそれを <- として受けついだ。

C 言語の ==

1972 年に作られた C 言語は Fortran にならい、= を代入とした。比較のためには別の記号が必要になり、等号を二つ重ねて == とした。その結果、プログラミングでもっとも有名な誤りのひとつが生まれた。

if (x = 0) { ... }

プログラマーは $x$ がゼロかどうかをたずねたかった。ところが等号をひとつしか書かず、$x$ にゼロを入れるよう命じてしまった。代入の値は $0$ で、C はそれを「偽」と読むので、このブロックは決して実行されず、$x$ のもとの値は黙って失われる。多くの現代のコンパイラは、この行を見つけると警告を出す。数学から来た人にとって、この記号には二つの意味があるからである。

数学が得たもの

代入は等式ではない。しかしそれは、伝統的な数学がほとんど書かなかった考えを書きものにもちこんだ。時間である。x = x + 1 では、左の $x$ と右の $x$ は、二つの時点での同じ名前である。数学はこれを添字で表す。数列やニュートンの反復法のように、$x_{n+1} = x_n + 1$ と書くのである。プログラミングは、名前を中身が変わる箱として考えればアルゴリズム全体を書けることを示し、この考え方はアルゴリズムの本を通って数学にもどってきた。

学ぶ人にとって、二つの読み方はうまく同居しない。第4章は、学校の等号がすでにたくさんの仕事をもっていることを示した。コンピュータの等号は、命令という仕事をもうひとつ加えたのである。「…と主張する」と「…となるようにせよ」を区別することは、ひとつの共同体から別の共同体へ移るときに学ぶことのひとつである。

練習:プログラムをたどる

あるプログラムが順に x = 3、x = x + 1、x = 2 * x を実行する。$x$ の最後の値はいくらか。三行が方程式だったらどうか。

プログラムとしては、$x$ は $3$、次に $4$、最後に $8$ になる。方程式としては、連立方程式 $x = 3$、$x = x + 1$、$x = 2x$ に解はない(二つめは成り立ちえず、三つめは $x = 0$ のときしか成り立たない)。添字を使って $x_0 = 3$、$x_1 = x_0 + 1 = 4$、$x_2 = 2x_1 = 8$ と書き直すと、三行はまた正しい等式になる。

練習:if の誤り

C で if (x == 0) はうまくいき、if (x = 0) はうまくいかないのはなぜか。数学者ならどう書くか。

x == 0 は比較であり、$x$ によって真か偽になる。x = 0 は $x$ にゼロを代入し、値は $0$ で、偽として扱われる。条件は決して満たされず、$x$ は消されてしまう。数学者なら単に「$x = 0$ ならば」と書くだろう。数学の書きものでは、条件の中の等号は比較でしかありえないからである。


章の目次 · ← 思考の道具としての記法:アイバーソン · 定理につけられた名前:スティグラーの法則 →