起
本来、引数の渡し方には値渡し(call by value)や参照渡し(call by reference)などがあります。また、Python の引数渡しを説明する際には、共有渡し(call by sharing)という用語も使われます。ここでは、それぞれを簡単に整理しておきます。
- 参照渡し(
call by reference)- 変数を渡す(仮引数が実引数のエイリアス(=別名)として機能する)
- 仮引数への再代入が実引数の変数に反映される
- 共有渡し(
call by sharing/call by object sharing)- 実引数の値を仮引数に束縛する(Python などではオブジェクトへの参照値を渡す)
- 仮引数への再代入は実引数に反映されない
- ただし、共有しているオブジェクト自体を変更した場合、その変更は呼び出し元からも観測できる
承
それらに対して、最近の AI 関連では、次のような「参照渡し」と呼ばれる事例があります。
- 外部リソース等への参照を使った「参照渡し」
- オブジェクトの読み書きのための参照(URI、ID 等)を渡す
- 読み込む際にインスタンス化するのであれば、ローカルのインスタンスに対する変更は外部リソースにそのまま反映されない
- 参照値を変更しても、呼び出し元の参照値は変わらないので、プログラミング言語の参照渡しではない
- 外部リソースの内容を変更する手段はある
- 共有渡しのようにインスタンスを共有するというより、外部リソースへのアクセス手段を渡すことに近い
転
概念的には共有渡しに近い……のでしょうか。
そもそも引数の渡し方なのかと言われると微妙なところがあるので、なんとも言えない感じです。
まだ、AI 側で Python の実行環境を持ってインスタンスを取り回す、つまり共有渡しに近い形を「参照渡し」と呼んでいた頃が懐かしいまであります。
今回は外部リソースを介する方式なので、共有渡しのように同じインスタンスを共有するのではなく、それぞれの環境でオブジェクトを取得・生成するような取り回しになります。
ただ、外部リソース等への参照を渡しているだけなので、参照値を別のものに差し替えても呼び出し元の参照値は変わりません。このあたりが、概念的には共有渡しに近いと感じる理由なのかもしれません。
実際の表現としては、Pass payloads by reference や passing complex chemical data by reference through cloud storage などが使われています。
英語では文脈から区別できるものの、日本語に訳すと、そのまま「参照渡し」になりがちなのが悩ましいところです。
結
AI 界隈の用語が今後どうなっていくのかもわからないので、とりあえず最終的に固まったあたりでまた記事を書くかと思います。
以上。