時間はないのですが、自分でもやっと何が問題なのかが明確になってきた感じがあるので、簡単にメモっておきます。
上記の記事に書かれた4つの事例を「実装を一切引き合いに出さない能書き」によって説明することは可能だと私は考えました。
しかし、それが分かりやすいかというと話は別です。これらの説明には、「参照」あるいは、それに類するアドレス、ポインター等の概念がどうしても入り込んできます。
そして、問題はこの「参照」です。
実は参照とは何かを「実装を一切引き合いに出さずに説明する」のは非常に大きなハードルだと感じます。
ここで、アドレス演算子などを持ち、明示的なアドレスの概念を持つCの場合は簡単です。Cでは、実装に依存しないアドレスの概念が存在するからです。それを使って説明すれば、実装に依存しない説明ができます。
しかし、アドレスやポインターの概念が存在しない言語で、「参照」を分かりやすく説明するのは難しい気がします。
実装に依存する理解 §
実は、実装レベルで考えれば参照もthisポインタも簡単なのですよね。
参照とはCPUのインダイレクト(間接)アドレッシングに相当するもの。
thisはインスタンス識別のためにメソッド呼び出し時に暗黙的に追加されるポインタ。
そんなの常識~~~、たったたらりら~♪
いやいや、それを常識と思うのはハードを半田付けで自作し、OSやコンパイラも自作したという経験のある私のような「昭和の妖怪」だけで、一般的には実装の詳細はプログラマから隠されるものであって、常識とは呼べないでしょう。
アドレスを経由する参照の理解 §
それが常識ではないとしても、アドレスという番号が存在するという概念があれば、参照とは「番号」であるという説明が可能です。番号は具体的で容易にイメージ可能です。要するに整数と同じですから。参照型の変数に入っている内容は「番号」という整数であるという理解は可能でしょう。
ではアドレスという概念を封じられたら? §
アドレスという概念を使わないで「参照」を説明せよと言われると非常に厳しい感じがあります。
「参照とは実体を指し示す情報だよ」と説明してみたところで、「ならば参照型の変数に入っているものはいったい何か?」と言われるとそれが上手く説明できません。「指し示す何かだよ」としか言えなくなってしまいます。
というのが、私がこの問題に感じる最大の障害です。