2009年07月10日 15:00 [Edit]

a = a + 1; /* って違和感あるはずなのに */

ここまでは、いい。

だれでもわかるプログラミングの教え方もある……といいな - 狐の王国
じゃあ「c = a + b」はどうなるのか。
これはcという新しいバケツを用意し、aとbを足した数字を入れろという意味だ。

ところが、

a = a + 1;

でまともに数学を習った人ならつっかかるはずだし、実際つっかかるなのに、ほとんどの言語が代入演算子として=を採用しているのはなぜなのだろう?

いや、私だってこれがFORTRAN由来だってことは知っている。私が知りたいのは、これが数学から見ても自然言語から見ても不自然なのに、ことプログラミングに関しては、なぜこれが自然になってしまったか、ということ。

代入に、=を使う必然性が全くないことは、それを使わぬ言語も実は少なくないことからも明らかだ。schemeだったら(set! a (+ a 1))だし、今は亡きHyperTalkだったらput a + 1 into aだ。HyperTalkの例を見て分かるとおり、代入は左から右でなく、右から左だって構わないこともわかる。R に至ってはa <- a + 1と書いてもa + 1 -> aと書いてもよい。矢印を使う記法は、疑似コードでもよく見られる。たしかにこれなら困惑は少なそうだ。

=には、二つの不自然がある。

一つは、他の世界ではそれは等号なのに、プログラミングの世界の多くでは代入になっているということ。

そしてもう一つは、プログラミングの世界では左から右に処理が進むことが多いのに、こと代入に関しては右から左になってしまうこと。

これがどれだけ思考の流れを妨げるかは、計り知れない。思考の流れを妨げるだけならまだしも、パーサーだって書きにくくなる。メソッドチェインが気持ちイイのは、左から右へという自然な流れに従っているからでもある。自然な流れに従っているので、変数も自然と省略できる。

なのに、代入に関しては、=の地位はびくともしない。どれほどびくともしないかといえば、Damian Conwayが「=を変えようとしてはならない。変えようとすると普及しない」と嘆息するぐらいだ。:=程度ですら駄目なのだ。確かにPascalは普及したとは言いがたい(delphiユーザー失礼)。

===を書き間違えて痛い思いをしなかったプログラマーはほとんどいないはずだ。JavaScriptやPHPに至っては、さらに===まである。にも関わらず、=はますます繁栄している。

それがなぜなのかわからないのが、私の困惑である。

blogger = 'Dan the Puzzled Programmer';


この記事へのトラックバックURL

この記事へのトラックバック
プログラミング言語は、数学ではないし、もちろん自然言語でもないので、その中で使われる記号の意味が数学や自然言語と異なっていたとしても何ら問題はありません。プログラムはコンピュータに対する命令の羅列にす...
プログラミングは数学ではない【語句ログ】at 2009年07月10日 19:26
a = a + 1; /* って違和感あるはずなのに */ - 404 Blog Not Founda = a + 1;でまともに数学を習った人ならつっかかるはずだし、実際つっかかるなのに、ほとんどの言語が代入演算子として=を採用しているのはなぜなのだろう?とりあえず3つの理由を愚考。??が一番重要な順番で...
たしざん!【殺したいほどママが好き】at 2009年07月11日 14:38
auケータイ「iida」の公式サイトがひどすぎる 働くモノニュース : 人生VIP職人ブログwww http://workingnews.blog117.fc2.com/blog-entry-2101.html Webデザイナーはもっと貧相なマシンを使うようにw safariだったらうまく動いたけど、これは酷いw つーか携帯ばっか使...
ここは酷いiidaですね【障害報告@webry】at 2009年07月12日 02:57
この記事へのコメント
>==と=を書き間違えて痛い思いをしなかったプログラマーは少なくないはずだ。

しなかった→した でよろしいか。
Posted by far at 2009年07月10日 15:09
>> a -> a + 1と書いてもよい。

おお〜い!そりゃよくないだろ。
a+1 -> a
ならわかるが。
Posted by Mr.FanHong at 2009年07月10日 15:57
グンミラグロプく行てれ流が章文へ右らか左
.らしかのんてっ思うどは人アビラアてっ化文

Posted by !dlrow olleH at 2009年07月10日 16:00
「しなかった」で合ってると思いますよ

そういえば、=に限らず入力は右から左ですね

cout << "foo" << end; (c++)
array << "foo" (ruby)
Posted by at at 2009年07月10日 16:05
Mr.FanHongさん?
あれ?ほんとだ。
、んさ!dlrow olleH
。も語イラブヘとあ
Dan the Man with Too Many Variables to Assign
Posted by at 2009年07月10日 16:21
COBOL は
add 100 to uriage.
でこれが一番読みやすいです。
add shouhi-zei to zeinuki-kakaku giving naizei-kakaku.
とも書ける。
ピリオドがハマるんですが。

compute a = a + 1.
とも書けるんですけど全部これで書くのはヤボのような〜

COBOLはうまく書くとプログラムが英文の手順書になります。
「詩」が書けるPerlもすごいですが。。。
Posted by yabuki at 2009年07月10日 16:53
APLも矢印が代入でしたね。
使える処理系は持っていなかったけど、大学にいた時画期的と思いました。
昔だな。。。

Posted by charlestonblue at 2009年07月10日 17:39
R では <- も使えますが、条件文で負の数と比較する時に
if(a<-3) # やりたい事はif(a < -3)
としてエラーが出て嵌った経験があるので、結局 = を使っています。
Posted by kokoro at 2009年07月10日 18:31
今の(?)「=」は演算子だけど、
私は BASIC の let 構文から入って
(初めて使った機種は let が省略できなかった)
MSX で省略記法使うようになって C、その他の言語と来たので
別に何ともおもわなんだ。
Posted by 名前を入力してください。 at 2009年07月10日 19:52
>書き間違えて痛い思いをしなかったプログラマーは少なくないはずだ。
↑はやっぱり間違いでしょうね…。

書き間違えて痛い思いをしたプログラマーは少なくないはずだ。
書き間違えて痛い思いをしなかったプログラマーは少ないはずだ。
このどちらかが正しいのだろうと思います。
Posted by りょう at 2009年07月10日 20:13
HyperTalk では 代入を使わずに
add 1 to a
と書く方が好ましいと思う。

其れ以前に is a 等の型検査演算子に使われるので、変数名に a は使わない人が多い。
Posted by HyperTalker at 2009年07月10日 20:27
>> a = a + 1;
>> でまともに数学を習った人ならつっかかるはず

An = An-1 + 1
という数式で考えることができるので、まともに数学を習った人ならつっかかるというのが納得がいかないです。
Posted by at 2009年07月10日 21:49
> a = a + 1;
> でまともに数学を習った人ならつっかかるはず

代入という概念がない(あるいは理解が足りない)と自分が納得できる解釈を模索してトンデモに走る人が意外と多いんですよね。
Posted by at 2009年07月10日 22:24
> ==と=を書き間違えて

すみません。やったことないです。いや、あまりいないんじゃないですか。
Posted by カーネルサンダース見習い at 2009年07月10日 23:05
仙波敏郎さんが高知で講演会を行います。

「仙波敏郎氏高知講演会」

日時:7月12日(日)午後1時半、
場所:高知女子大学(南舎)

愛媛県警裏金事件を告発の仙波敏郎さんが高知で講演会
http://www.news.janjan.jp/living/0907/0907106704/1.php
Posted by カーネルサンダース見習い。宣伝です。 at 2009年07月10日 23:28
>プログラミングの世界では左から右に処理が進むことが多いのに、こと代入に関しては右から左になってしまうこと。

そういえば、CP/Mのシェルでは、ファイルコピーのコマンドのパラメータの順番が、何故か右から左になってましたね。UNIXの cp や MS-DOS の copy とは逆でした。あれも不思議だったけど、なんかかっこよかった感じもした。

C言語などで代入記号が=になっているのは、ズバリ、タイプするときのストローク数が少ないからというのが理由だったと思います。可読性を重視するPASCALのように:=にするとキーストロークが2倍になってしまいますから。

私が学生の頃、C派とPascal派に分かれて、どちらの言語が優れているのなんのかんのと、いつも話のネタになってました。

かく言う私は今でもPASCALユーザーです。はい。

(権兵衛 the Real Man)
Posted by 権兵衛 at 2009年07月11日 02:57
 「まともに数学を習った人」なら、むしろ、

 「記号なんてもともと好きに定義していいもの」

 という考え方をするはずなので、かえってすんなり受け入れられると思います。
Posted by 寿命 at 2009年07月11日 13:32
一次関数を習うとき、y = 2x + 1 の場合、右辺の x にある値をいれた結果が左辺のy であると理解します。この理解は a = a + 1 の表現とほとんど違和感を生じさせません。左辺の a と右辺の a には時間的な差があると暗黙に了解できます。これが y -1 = 2x にすることができるような a - 1 = a という表現が可能なとき、= の意味について混乱がでてくると思います。
Posted by jar at 2009年07月11日 14:16
現在経験10年目程度でJava現役のSE兼PGですが、
=と==を間違えて痛い思いした事はございません。

それから、メソッドチェインの連発は
書いてる方は気持ちいいかもしれないが、
読む方からしたら苦痛だという事を分かっておいた方がいいですよ。

個人サイトでjQueryでちょっと遊んでいる程度ならいいですが、
業務システムでJavaやC#であんなコーディングばかりされたら、
訳分からなくなります。

変数が手順ごとに定義されていないとデバッグも苦しくなります。
Posted by 奈々氏 at 2009年07月11日 14:57
> 奈々氏
C#なんかは=をif中に入れると警告してくれるからってだけであって
他の言語を使う人は絶対に痛い思いをしたことがあると思うけれど。
JavaScriptなんてうっかりミスでよく泣く。

メソッドチェインはC#でもLINQの導入によって標準的になってきているので
むしろ、そういった新しい発想にちゃんとついていけないと
これから苦しくなっていくと思いますよ?
Posted by C#er at 2009年07月11日 15:27
>C#さん。

今でこそeclipseやvs以外の選択肢はありませんが、
昔は秀丸でガンガンコーディングやってました。
しかしそれでも、==に悩まされた記憶はありませんよ。

私だけなのですかね??

LINQもお手軽に使う分にはいいですが、個人の技術レベルが大きく異なる可能性のある
大規模システムの現場では導入は怖いですよ・・
LINQが裏でどのような処理を行っているのか「完璧」に把握していないと
パフォーマンスも心配ですし。

ちなみに私はオープンソース大好物なので、
新しい発想はどんどん受け入れていますよ(^^
Posted by 奈々氏 at 2009年07月11日 17:45
卵 = 雄鶏 + 雌鳥

卵が先、それが自然。

時を超える創造の原則 - 書評 - パターン、Wiki、XP
http://blog.livedoor.jp/dankogai/archives/51232105.html

> 見えもしない感じもしないからこそ選べない、
Posted by edry(えどりぃ) at 2009年07月11日 21:00
アセンブリ言語を勉強する際、逆に
a = a + 1
を理解してないと
add ax, bx
を理解しづらいですね。

数学の y = f(x) とアセンブリ言語を合わせた形なのでしょう、と思っています。
Posted by たかおん at 2009年07月11日 21:08
情報系の人は「数学的な思考をもって結論を出すとこうである」という思考をすることが多いけど実はそれが数学的でないことが多々あるんですよね。

別に情報系を責めてるわけじゃないんですが、数学を神聖視しすぎなんじゃないかと思います。=だって定義しちゃえば意味は何だっていいわけです。
逆に数学の"一般常識"に則るべきというのなら、文字列の連結で+が各種言語で用いられたり>が演算子になってたりとおかしい点がボロボロ出てきます。

所詮記号なんで、言語の世界ではこの記号はこう定義するのが常識である、とするのが自然だし、それは極めて数学的な思考です。
Posted by 132番目の素数さん at 2009年07月20日 01:19