メッセージ。 - 変数とは何か、箱モデルは有害か
# 変数とは何か、箱モデルは有害か
http://hirofummy.net/himo/index.cgi?1113716234.txt
hirofummyさんの文章を読んでいて、何かひらめいた気がした。変数ってのは、値を抽象化するものなんだ。変数は、数学におけるxとかyと同じなんじゃないか? 数学においてxやyを箱で説明することは適切か? たぶん適切ではない。それと同じだけ、プログラミングにおける箱モデルは不適切なんじゃないか?
変数は、箱というよりむしろ名前に近い。概念にラベルを付けて扱いやすくするためのものだ。たとえば、コンビニのレジでお客さんに買物をしてもらう例を考えてみる。ハリソン・フォードがレジにやってきた。手には少年ジャンプを持っている。ハリソン・フォードはレジでおでんを注文した。店員は少年ジャンプとおでんをレジに打つ。店員は合計金額をハリソン・フォードに伝える。ハリソン・フォードは伝えられた金額を支払う。店員は少年ジャンプとおでんをハリソン・フォードに渡す。
これがコンビニのレジ業務を表したモデルだ。もしジョディ・フォスターがアンアンとショートホープを買った場合でも同様に処理できる。出川哲郎がエッチ本とトイレットペーパーを買いに来たときも同様だ。誰が来たとしても同じに処理できる。これは、現在の小売業が、商売のモデルを「客」と「店」に単純化しているからだ。「現金掛け値なし」となる前の商売モデルでは、もっと複雑なプロセスが必要になっただろう。まそれはいいとして。
コンビニのレジモデルでは、ハリソン・フォードやジョディー・フォスターを「客」として扱うから処理の手間が省ける。システムは客というものを定義することで単純に記述できるようになる。客ははたして「箱」で表現できるだろうか? できはしない。「出川を箱に入れて」というのは絵的にアリだが、「ハリソン・フォードを箱に入れて」というのは、どうしても違和感がある。
変数に値を入れる、変数を評価するというのは、抽象を具象に適用することなんだ。
hirofummyさんの文章を読んでいて、何かひらめいた気がした。変数ってのは、値を抽象化するものなんだ。変数は、数学におけるxとかyと同じなんじゃないか? 数学においてxやyを箱で説明することは適切か? たぶん適切ではない。それと同じだけ、プログラミングにおける箱モデルは不適切なんじゃないか?
変数は、箱というよりむしろ名前に近い。概念にラベルを付けて扱いやすくするためのものだ。たとえば、コンビニのレジでお客さんに買物をしてもらう例を考えてみる。ハリソン・フォードがレジにやってきた。手には少年ジャンプを持っている。ハリソン・フォードはレジでおでんを注文した。店員は少年ジャンプとおでんをレジに打つ。店員は合計金額をハリソン・フォードに伝える。ハリソン・フォードは伝えられた金額を支払う。店員は少年ジャンプとおでんをハリソン・フォードに渡す。
これがコンビニのレジ業務を表したモデルだ。もしジョディ・フォスターがアンアンとショートホープを買った場合でも同様に処理できる。出川哲郎がエッチ本とトイレットペーパーを買いに来たときも同様だ。誰が来たとしても同じに処理できる。これは、現在の小売業が、商売のモデルを「客」と「店」に単純化しているからだ。「現金掛け値なし」となる前の商売モデルでは、もっと複雑なプロセスが必要になっただろう。まそれはいいとして。
コンビニのレジモデルでは、ハリソン・フォードやジョディー・フォスターを「客」として扱うから処理の手間が省ける。システムは客というものを定義することで単純に記述できるようになる。客ははたして「箱」で表現できるだろうか? できはしない。「出川を箱に入れて」というのは絵的にアリだが、「ハリソン・フォードを箱に入れて」というのは、どうしても違和感がある。
変数に値を入れる、変数を評価するというのは、抽象を具象に適用することなんだ。
Comment
# PHPとかのように変...
(PHPでは、変数$Aから変数$Bへ値を代入すると、Aというエリアに格納されていた値がBというエリアにコピーされます)
変数がラベルなのか箱なのかは「その言語によって違う」というのが妥当な答なのではないでしょうか。
# なるほど。PHPはそ...
ただ、ただ、……うーん。なにか違和感があるというか、うーんうーん。もうちょっと考えます。
# PHPのようなモデル...
a = b
とした時に、変数bの中身が変数aへコピーされるとしても、箱だったら変数bの中身は空になっていないといけない。
それから
a = NULL
ってすると、変数aの中身は空(NULL)になるんですけど、これも箱だと考えると「NULLってものを入れたのに何で空?」となるわけです。
ふじさわさんの「抽象を具象に適用する」というのを、私はもうちょっと下世話に「名前札」なんだと理解してます。遠足とかの時にリュックにくっついてる名前札のことです。
a = 1
というのは、「1」というものに、aという札を付けた状態。なので、
b = a
とした場合は、aがついている「1」というものに、bという札も付けたと考える、と。
なので、PHPのような動きは、プログラミング言語がサービスして、もの自体をコピーしてくれてるだけで、本質的には名前札モデルなんだと思うのです。この辺がふじさわさんの違和感では?
# なんか無駄に長くなってごめんなさい orz
# なんとなくですが
たぶんなんですが、違和感の原因は、ぼくとSHIMADAさんの主題の違いにあります。ぼくがここで主題としたいのは、「変数とは何か?」です。特定の実装に関係なく「変数とは本質的に何なのか?」が知りたい。「人間とは何なのか?」を問うようなレベルで。
多くの入門書では、これまで変数を箱で表現してきました。だけど、実際プログラミングができるようになってみると、ぼくらは変数を箱のイメージでは理解していないよね?と。たぶんPHPのプログラマでさえ、変数を箱で考えるのは特定の仕事をする場合だけでしょう。
変数のイメージもいろいろあると思います。Cの変数と、Lispの変数と、PHPの変数はだいぶ違うはずです。だけど、本質的に変数に必要なアフォーダンスは1つじゃないかと思うんです(あるいは言語にあった変数の性質があるんじゃないかと)。
それを名札モデルとして実装してもいいし、箱モデルとして実装してもいいですけど、理解しやすく扱いやすい変数のアフォーダンスを提供できるほうがよい言語だと思います(急いで付け加えると、問題領域に適したアフォーダンスを提供することも重要でしょうね)。
「PHPは変数を箱モデルで扱っている」というのは興味深いですが、とすればもっと知りたいのは、なぜPHPが変数に箱モデルを採用しているか、です。どういう観点でそれが優れているのか。変数を箱で表現することで、変数の本質的機能を生かし、PHPという言語の世界にどうパワーを与えているのか。
# 長い上に話がずれてき...
一応まとめっていうか整理のための文章です。
かえって発散してるかもしれませんが。
http://cake.dyndns.org/sociewiki/index.php?mod=WikiView&name=DiscussVariable
# SHIMADAさん、...
というところが興味深く感じました。もうちょっと考えますー。
Trackback