参照渡し

4月17日水曜日、晴れ

プログラミング界隈に『値渡し』、『参照渡し』というキーワードがある。鬼門なので避けたほうがよい。

というのは、これが『値渡し』、これが『参照渡し』という定義、コンセンサスがないため。結果、僕の考える『〜渡し』はこれこの通りで、だから合ってる、それは違っているという無益な場外乱闘にもつれ込む。(という僕も、参照渡しはポインター渡しのことだと信じている一派に連なる。さっきまで調べていて、最終的に意見を翻した)

* * *

ここにある回答の引用。

Three modes of parameter call are possible; call by value (which is equivalent to the ALGOL call by value), call by substitution (equivalent to ALGOL call by name), and call by reference. In the latter case, the LH value of the actual parameter is handed over; this corresponds to the "call by simple name" suggested by Strachey and Wilkes (1961). Note the correspondence to the three kinds of initialization...

"The Main Features of CPL" from The Computer Journal, August 1963; 6: 134 - 143 (British Computer Society)

引数呼び出しには三つのモードがある。それは値渡し、置換渡し、参照渡しである。最後のケース(つまり参照渡し)は、左辺値(LH value)として実引数を受け渡すもので単純名による呼び出しと対応する。三種類の初期化方法との関係にも注意されたい……

置換渡しは、別の回答から類推するに、式渡しということのようだ。

Fortran 66's "association by name" can be viewed as a restricted (degenerate) form of Algol 60's "call by name". The restriction being that in Fortran, the name had to be a simple variable or array name, where in Algol 60 it could be any expression.

式渡しというと難しいけれど、要は x + 1 のような計算を引数に与えられる、ということだ。現代のプログラミング言語においてはあまりに当たり前の機能におもえる。

参照渡しが名前渡しであるというのは、昔の言語は全てがグローバル変数だったことを考えると理解できる。名前で参照されるものが、どのスコープであっても唯一存在するグローバルオブジェクトだ、ということ。呼び出し元の変数が呼び出し先の変更によって変わる──というよりは、そのプログラムが実行されている環境がごそっと書き換わる。参照が渡っていると言えなくもない。
名前がつけられれたアドレスの中身を触る。

これが由来だと考えると、うん。ポインター渡しが参照渡しだという論もわからなくはない。

* * *

僕たちが触るプログラムは巨大化の一途をたどってきた。管理性を高めるために変更の局所性が必要とされ、だからグローバル変数は忌避されるようになった。

おもえば PC-9801 の頃、 MS-DOS では実行プログラムをまたがって物理アドレスを共有していた。こちらのプログラムから別のプログラムのメモリーを書き換えて落とす、なんてこともできた。(というより巻き添えを食ってクラッシュする)

いまやアプリが一つ落ちたからといって別アプリが次々と死ぬなんてないし、ましてや OS ごと逝ってしまうなんてことはあり得ない。

安全にはなったけれどそれだけ距離は遠くなった。ハードウェアを直接いじる楽しさも消えて久しい。

まあなんだ。昔の用語が現代になって(文脈が変わり)違う意味で使われるというのは、そりゃあ当たり前だよな。

* * *

ところで引数に「式」が入ること、その式の評価結果の値が処理・手続き・関数に渡る、というイメージはしやすい。しかるに参照を受け取る処理に引数として式を渡す、それが意味することはなんなのだろう?(文法エラーになるだろうけれど、あえてその意味を考えるとすれば、これはどう評価できる?)

* * *

レジスターと番地付きのメモリーがある計算機を考えて、その操作から参照渡しの意味を考え説明することは、多分できる。
それをせずに、計算機をもっと抽象化して、プログラムが行う計算というものを考え、その枠組みで参照渡しを説明するとどうなるだろう?

この記事が気に入ったらサポートをしてみませんか?