だれかまとめてくれないかな

きむら(K)さんが引用していたのが、自分の思ってることに近いなぁ。

> JavaC#でも「値渡し」と「参照渡し」があります。これって結局ポインタのことでは?

そうやって理解しちゃうと、たとえば Algol60 の「名前渡し」なんか理解不能でしょ?
Algol60 はちょっと古いけど、新しいところでは Haskell なんかの引数渡し方法の理解にも障害が出るよ。

「値渡し」とか「参照渡し」とかは、そのような概念として理解して
「参照渡し」の実現方法としてある種のハードウェアではアドレスを「値渡し」することが
慣習上行われているが絶対唯一の方法ではないことをよく考えたほうがいいな。

ハードウェアとかマシン語とかの理解をベースにしちゃうと
考え方の幅が制限されて結局「プログラミング」の理解の妨げになるんだよ。
自分が一般的なハードウェアだと思っているものが
ごく特殊な実現方法がたまたま現在主流になっているだけだということもね。

そう、抽象概念を低レベルの実装で説明するとわかりやすいのは事実なんだけど、それで抽象概念を説明した気になるのはとても危険だと思う。ポインタはアドレスで dereference はアドレス参照でしょ、とか思っているとそれは大きな勘違いだ。概念を理解していないという意味だけでなく、実装としてもそれは間違っている。
要するに、いきなり実装を学習することでモデルの理解がスポイルされるのが怖いのだな。いや、まぁもちろん先に実装を学ぶことが即モデルの理解を阻害することを意味しないし、とっかかりとしての実レベルの話というのは多分有用なんだけど。
ところで、「機械語を理解せずにどうやってポインタを理解するの?」という人もいたりして、私はそれが不思議なんだけど、だったらそういう人は lexical closure とか dynamic scope とかどうやって理解するんだろ。C なら通常、すべてのローカル変数はスタック上に乗っかっているけど、lexical closure が導入されるとそういう訳にもいかないよ?ってそれは関係ないか。
そういや、Java に lexical closure が導入されるという話があって、これが導入されるとローカル変数の取り扱いがえらくかわってしまうなぁ。
閑話休題、だれも Phinloda さんのアレに言及していないような気がするので簡単に引用だけ。

極論と本人が書いておられるので別に突っ込む必要もないが、 これは極論というより単なる本末転倒だと思う。 プログラムをちゃんと書けるプログラマーなら、 仮にマシン語なんか知らなくても、 既にマシン語を理解しているのと同じレベルの知識を持ち合わせているからだ。

割と的確な気がする。