補足(いいわけ?)001


参照とポインタ(2001/3/1)

これまた検索エンジン(Google)で「C言語ポインタ完全制覇」 で検索して見つけたんですが、rubyのメイリングリスト(ruby-list)で、 まつもとゆきひろさんがこんなことおっしゃってますね (2行しかないので全文引用します。あしからず)。

http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/27218

Subject: [ruby-list:27218] C 言語ポインタ完全制覇
From: matz@zetabits.com (Yukihiro Matsumoto)
Date: Thu, 18 Jan 2001 07:12:58 +0900
------------------------------------------------------------
また、迷教科書の登場なのでしょうか?

リファレンス(参照)とポインタ(アドレス値)の違いって常識だと思ってたんだけど。

なにぶんこれだけなので、まつもとさんの真意はいまひとつわかりませんが、 まつもとさんが著書(「オブジェクト指向スクリプト言語Ruby」)の中で こんなことを書いておられることから察するに(p.26)、

Rubyにはポインタという概念がありません。 あるのはオブジェクトに対する参照という概念だけです。

私が、「JavaにもRubyにも(LispにもSmalltalkにもVBにも)ポインタはある」 なんてことを書いていることを問題にしているのだと、とりあえず解釈します。

で、確かにこれらの言語では「ポインタ」と呼ばずに「参照(リファレンス)」 と呼ぶことが多いわけですが、「リファレンス」と「ポインタ」が 違うもので、そしてそれが常識かというと...

「常識だと思ってたんだけど」ではわかりかねるので、 ご本人がこれを読むことがあればぜひ説明願いたいところです。

例えばPascalやModula2の「ポインタ」であるとか、 Bertrand Mayerさんの「オブジェクト指向入門」(Object-oriented Software Constructionの初版の方)のp.119にある

この問題はポインタを備えたどんな言語(Pascal, Ada, Modula-2, C, Lispなど) についても生じる問題であるが、単純な型以外の型がすべてポインタ型である Eiffelのようなオブジェクト指向言語ではとくに深刻である。

という表現(第1版の原書は持ってないので原書による確認はしてません。 第2版には、上記そのものずばりの表現はないみたい)における 「ポインタ」とか、あるいはJLSの 「4.3.1 オブジェクト」

参照値(しばしば単に 参照(references) と呼ぶ)は,オブジェクトへの ポインタ(pointers)もしくは, いかなるオブジェクトも参照しない特別な空参照となる。

に出てくる「ポインタ」が、「参照」と何か違ったものである、とは、 常識知らずの私にはちとわかりかねるのですが。

そういえばfortran90にも「ポインタ」はあったっけ。 いま調べたところによると、あれはちょっと目C++の参照みたいだけど、 代入はできるようだから、やっぱりポインタ(JavaやRubyの参照)相当品ですね。

ところで、Rubyについてはよく知りませんが、 Javaについては、ポインタのあるなしはいくつかの場所で既に話題になっています。

とりあえずメジャーなところで、JavaHouseの トピックスの 「Java言語→変数/引数」には、

「Javaにはポインタがない」という言説はそろそろ撲滅されるべきである [j-h-b:28505] [j-h-b:28630] [j-h-b:28763]

なんて項目があります。関連項目としては、(これを振ったのは私自身ですが) [j-h-b:37867]「『Javaにはポインタがない』の出処」てのもあります。

他には、「誰にも分からないJava講座」における 「javaはポインタの言語だ」とか、 Peter van der Lindenさんの Java Programmer's FAQの、
5.(Sect. 6) How can I program linked lists if there are no pointers?
の項とか(これは昔は日本のSunのページに日本語訳も載ってたんだけど、 今はFAQごとなくなっている。ちぇっ)。

ときに、まつもとさんの元メイルを見ると、『ポインタ(アドレス値)』と、 ポインタといえばアドレス値であるかのように書いてあります。

まあ、参照(リファレンス)と「アドレス値」の違いなら、私にも分かります。 これは確かに常識でしょう(まあ、 参照を「アドレス値」で実装することもあるだろうけど、 少なくとも概念の階層が違う)。

「ポインタといえばアドレス値」というのが、 まつもとさんにとっての「ポインタという言葉の定義」であるのなら、 言葉の定義なんてのは人によって異なるのはよくある話なので とやかく言ってもしょうがないことかもしれませんが、 それにしても、その定義(?)は、 少なくとも「万人にとって説明不要の常識ではない」ぐらいのことは 言ってもよいと思います。


「補足(いいわけ?)」の目次に戻る | ひとつ前のページ | ひとつ後のページ | 「C言語 ポインタ完全制覇」のページに戻る | トップページに戻る