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
しなかった→した でよろしいか。
おお〜い!そりゃよくないだろ。
a+1 -> a
ならわかるが。
.らしかのんてっ思うどは人アビラアてっ化文
そういえば、=に限らず入力は右から左ですね
cout << "foo" << end; (c++)
array << "foo" (ruby)
あれ?ほんとだ。
、んさ!dlrow olleH
。も語イラブヘとあ
Dan the Man with Too Many Variables to Assign
add 100 to uriage.
でこれが一番読みやすいです。
add shouhi-zei to zeinuki-kakaku giving naizei-kakaku.
とも書ける。
ピリオドがハマるんですが。
compute a = a + 1.
とも書けるんですけど全部これで書くのはヤボのような〜
COBOLはうまく書くとプログラムが英文の手順書になります。
「詩」が書けるPerlもすごいですが。。。
使える処理系は持っていなかったけど、大学にいた時画期的と思いました。
昔だな。。。
if(a<-3) # やりたい事はif(a < -3)
としてエラーが出て嵌った経験があるので、結局 = を使っています。
私は BASIC の let 構文から入って
(初めて使った機種は let が省略できなかった)
MSX で省略記法使うようになって C、その他の言語と来たので
別に何ともおもわなんだ。
↑はやっぱり間違いでしょうね…。
書き間違えて痛い思いをしたプログラマーは少なくないはずだ。
書き間違えて痛い思いをしなかったプログラマーは少ないはずだ。
このどちらかが正しいのだろうと思います。
add 1 to a
と書く方が好ましいと思う。
其れ以前に is a 等の型検査演算子に使われるので、変数名に a は使わない人が多い。
>> でまともに数学を習った人ならつっかかるはず
An = An-1 + 1
という数式で考えることができるので、まともに数学を習った人ならつっかかるというのが納得がいかないです。
> でまともに数学を習った人ならつっかかるはず
代入という概念がない(あるいは理解が足りない)と自分が納得できる解釈を模索してトンデモに走る人が意外と多いんですよね。
すみません。やったことないです。いや、あまりいないんじゃないですか。
「仙波敏郎氏高知講演会」
日時:7月12日(日)午後1時半、
場所:高知女子大学(南舎)
愛媛県警裏金事件を告発の仙波敏郎さんが高知で講演会
http://www.news.janjan.jp/living/0907/0907106704/1.php
そういえば、CP/Mのシェルでは、ファイルコピーのコマンドのパラメータの順番が、何故か右から左になってましたね。UNIXの cp や MS-DOS の copy とは逆でした。あれも不思議だったけど、なんかかっこよかった感じもした。
C言語などで代入記号が=になっているのは、ズバリ、タイプするときのストローク数が少ないからというのが理由だったと思います。可読性を重視するPASCALのように:=にするとキーストロークが2倍になってしまいますから。
私が学生の頃、C派とPascal派に分かれて、どちらの言語が優れているのなんのかんのと、いつも話のネタになってました。
かく言う私は今でもPASCALユーザーです。はい。
(権兵衛 the Real Man)
「記号なんてもともと好きに定義していいもの」
という考え方をするはずなので、かえってすんなり受け入れられると思います。
=と==を間違えて痛い思いした事はございません。
それから、メソッドチェインの連発は
書いてる方は気持ちいいかもしれないが、
読む方からしたら苦痛だという事を分かっておいた方がいいですよ。
個人サイトでjQueryでちょっと遊んでいる程度ならいいですが、
業務システムでJavaやC#であんなコーディングばかりされたら、
訳分からなくなります。
変数が手順ごとに定義されていないとデバッグも苦しくなります。
C#なんかは=をif中に入れると警告してくれるからってだけであって
他の言語を使う人は絶対に痛い思いをしたことがあると思うけれど。
JavaScriptなんてうっかりミスでよく泣く。
メソッドチェインはC#でもLINQの導入によって標準的になってきているので
むしろ、そういった新しい発想にちゃんとついていけないと
これから苦しくなっていくと思いますよ?
今でこそeclipseやvs以外の選択肢はありませんが、
昔は秀丸でガンガンコーディングやってました。
しかしそれでも、==に悩まされた記憶はありませんよ。
私だけなのですかね??
LINQもお手軽に使う分にはいいですが、個人の技術レベルが大きく異なる可能性のある
大規模システムの現場では導入は怖いですよ・・
LINQが裏でどのような処理を行っているのか「完璧」に把握していないと
パフォーマンスも心配ですし。
ちなみに私はオープンソース大好物なので、
新しい発想はどんどん受け入れていますよ(^^
卵が先、それが自然。
時を超える創造の原則 - 書評 - パターン、Wiki、XP
http://blog.livedoor.jp/dankogai/archives/51232105.html
> 見えもしない感じもしないからこそ選べない、
a = a + 1
を理解してないと
add ax, bx
を理解しづらいですね。
数学の y = f(x) とアセンブリ言語を合わせた形なのでしょう、と思っています。
別に情報系を責めてるわけじゃないんですが、数学を神聖視しすぎなんじゃないかと思います。=だって定義しちゃえば意味は何だっていいわけです。
逆に数学の"一般常識"に則るべきというのなら、文字列の連結で+が各種言語で用いられたり>が演算子になってたりとおかしい点がボロボロ出てきます。
所詮記号なんで、言語の世界ではこの記号はこう定義するのが常識である、とするのが自然だし、それは極めて数学的な思考です。