/ 最近 .rdf 追記 編集 設定 本棚

脳log[20120109]



2012年01月09日 (月) どうでもいい話。call by valueと call by reference. 「参照(※)の値渡し」と「値の参照渡し」を区別する必要性が、まずない。(※ここでいう「参照」っていうのは「特定の言語において参照と呼ばれるもの」程度の意味しかないんでしょうね。そこからまた不毛な議論が……。) だから混同が起こるのだが、最初の定義にこだわっても得るものはない。だからどうでもいい。そこはコンパイラなど言語処理系の領域で、言語(利用者)の関知するところではない。不変オブジェクト(JavaScriptの文字列とか)であれば特に値(実体が遍在する)だ参照(実体がひとつ)だ値渡しだ参照渡しだと区別する必要がない。振る舞いは同じだ。だいたい参照って何?言語が用意したポインタ(メモリアドレスとその幅と値の解釈)の代替じゃないの?代替の行うことが値の追加の解釈だとすれば、それもポインタに含めうる。で、ポインタは値だ。参照が概念的な存在なのと、視点の存在するレイヤーによって同じものが値(と呼ばれるもの)だったり参照(と呼ばれるもの)だったりするからその対象が定まらないんだよ。■ 俺が JavaScriptと Rubyを使い始めた初期にそれらの言語を気に入った点には、扱いがどちらにもなりうる文字列の振る舞いがはっきりしていたことがある(JavaScriptでは文字列を変更することができない。Rubyでは明示的にコピーしなければ変更が伝播する)。C#も classと structの対比と boxingの説明で明確にしてた。いつのまにか関数呼び出しから話がそれてるが、結局、関数の外に影響するかしないかしか興味がないからだ。■ Wikipedia(ja):引数では値渡しと並記されてるのは変数渡しで、参照渡しは変数渡しの実装手段のひとつだという位置づけだなあ。■■■共有渡し。「参照渡しとの大きな違いは、関数内部での仮引数への新しい値の代入は、外側の対象には影響しない(参照渡しの場合は影響します)ということです。」そういう違いがあったのね。それは「ゴツいシンボル」が存在しない JavaScriptや Rubyと C++の、言語レベルの違いとして処理してる(ので意識してなかった)なあ。