

参照渡し、値渡しという言い方があると思いますが、一部プログラミング言語には共有渡しとよばれる渡し方があると聞きました

僕自身がその用語を聞くのが初めてだったので調べてみたのですが、あまり使われていない（というより、他の言い方も存在する）ようで、共有渡しや参照の値渡し、ただ単に値渡しといったり、参照渡しと書いている記事もありました

共有渡しについて一般的にはどのような呼ばれ方をしているのか、仕様やリファレンスなどで決まっているものはありますか？

* * *

読んだサイト

  1. [評価戦略](https://ja.wikipedia.org/wiki/%E8%A9%95%E4%BE%A1%E6%88%A6%E7%95%A5)
  2. [共有渡しと参照の値渡しと](https://www.haya-programming.com/entry/2018/06/19/181657)

もしそういったちゃんとした資料があればそれに従った名称を使おうと思うのですが・・・


CC BY-SA 4.0
2019-05-02T04:50:59.650
54644
2019-05-03T06:58:41.583
2019-05-02T05:11:06.773
34156
34156
question
プログラミング言語
共有渡しは一般的な用語ですか？


## 短い回答

  * 「共有渡し」という言い方をしているプログラミング言語はあります。
  * 私が知る限り、日本語では「参照の値渡し」という言葉の方が使われているように思います。
  * **ただし** 、以下の理由から「参照の値渡し」という言葉の使い方には注意すべきです。 
    * プログラミング言語によって意味が微妙に異なります。
    * 「参照」という言葉が何を意味しているのか紛らわしいです。
  * このため、プログラミング言語に応じて適切な言い方を選ぶのが安全だと個人的には思っています。

## 長い回答

### 「共有渡し」という言い方

「共有渡し (call-by-sharing, pass-by-
sharing)」という言い方をドキュメントや仕様に書いているプログラミング言語は存在します。ふたつ具体例を挙げてみます。

  * CLU (CLU Reference Manual より引用、[PDF](http://publications.csail.mit.edu/lcs/pubs/pdf/MIT-LCS-TR-225.pdf))

> Argument passing is defined in terms of assignment, the formal arguments of
> a routine are considered to be local variables of the routine and are
> initialized, by assignment, to the objects resulting from the evaluation of
> the argument expressions. We call the argument passing technique _call by
> sharing_ , because the argument objects are shared between the caller and
> the called routine.

  * Julia ([マニュアル](https://docs.julialang.org/en/v1/manual/functions/index.html)より引用)

> Julia function arguments follow a convention sometimes called "pass-by-
> sharing", which means that values are not copied when they are passed to
> functions.

ただしあまり広く使われている言葉では無いように思います。たとえば英語版 Wikipedia ["Evaluation
strategy"](https://en.wikipedia.org/wiki/Evaluation_strategy) には以下のように書かれています。

> However, the term "call by sharing" is not in common use; the terminology is
> inconsistent across different sources.

### 「参照の値渡し」という言い方

上に挙げた言語以外でも「共有渡し」に相当する渡し方をしているプログラミング言語は存在します。

この際、値渡しの特別な場合という意味で「参照の値渡し」と言うことがあり、日本語のブログ記事だと Java の例が検索によくヒットします
([例](https://qiita.com/mdstoy/items/2ef4ada6f88341466783))。Java
の場合、[評価戦略は全て値渡しであるという立場です](http://www.javadude.com/articles/passbyvalue.htm)。この上で参照値を渡す場合「参照値を値渡しする」という意味で「参照の値渡し」と言うことがあります。「共有渡し」よりも「値渡し」と言うことが多く、特に日本語だと「参照の値渡し」という言葉が使われている印象です1。

ただし一般には、この「参照の値渡し」という言葉は注意して使う必要があります。ひとつの理由は、「参照」という言葉が厄介で、プログラミング言語によって少しずつ異なる意味を持っていることです。

  * Java において「参照」あるいは「参照値」とは、オブジェクトへのポインタか、null ポインタのことです。[Java SE 12 の仕様 JSR 386](https://docs.oracle.com/javase/specs/jls/se12/html/index.html) から引用すると：

> An object is a class instance or an array.
>
> The reference values (often just references) are pointers to these objects,
> and a  
>  special null reference, which refers to no object.

  * C++98 において「[参照](https://ja.cppreference.com/w/cpp/language/reference)」とは、既存のオブジェクトや関数へのエイリアスです。特に、ポインタとは別物です。C++11 ではさらに rvalue reference という概念が追加されています。

  * OCaml において「参照」とは、[ref 型](http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#1_References)の値、つまり、ミュータブルな間接参照セルのことです。

このため「参照を値渡しする」と具体的にどのような挙動をするのか変わってきます。

別の理由として、 **「参照の値渡し」は「参照渡し」とは異なる**
のに字面が似ていてややこしい、というものもあります2。両者では、以下のプログラムの実行結果が異なります。

[code]

    # Python っぽい疑似コードです。
    def f(a):
        a = [42]
    
    l = [99]
    f(l)
    print(l)  # ここで何が出力されるでしょうか。
    
[/code]

### 結論：言葉の使い方

以上の理由から、 **個人的には** 以下のように考えています。

  * 「共有渡し」だと通じないことがあるので気を付ける。
  * 「参照の値渡し」という言い方は複数の理由から誤解されやすいので、注意して使う。
  * 個々のプログラミング言語に応じて、データの管理のされ方を整理した上で単に「値渡し」と言った方が分かりやすそう。

特に一番最後の点について、Java や Python
などの言語では関数適用についての仕様には値渡しとしか書かれておらず、オブジェクトなどのデータが値としてどのように扱われているのかを別に書いています。個人的にはこのように分けて考えて用語をつける方が分かりやすいと感じています。

* * *

註

  1. 「参照の値渡し」という言葉の初出を探したのですが、よく分かりませんでした。ご存じの方がいらっしゃればコメント頂きたいです。
  2. 「参照の値渡し」と「参照渡し」が共存していると更にややこしくなります。たとえば C# が良い例です。C# の型には値型と参照型が存在し、また渡し方として値渡しと参照渡しが選べます。したがって C# においては「値型の値渡し」「値型の参照渡し」「参照型の値渡し」「参照型の参照渡し」がありえます。「参照型」と「参照渡し」は異なる概念であることに注意してください。詳しくは[「参照渡し」](https://ufcpp.net/study/csharp/sp_ref.html)(++C++; // 未確認飛行 C) が参考になります。ちなみに、話が複雑になるので本文中には書きませんでしたが、C# には「参照」的な概念として「参照型」と「変数への参照 ([ref ローカル](https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/ref-returns))」が別々にあり、加えて参照渡しができるという言語設計になっています。


CC BY-SA 4.0
2019-05-02T17:51:28.557
54661
2019-05-03T02:11:14.477
2019-05-03T02:11:14.477
19110
19110
54644
answer


詳細な解説はnekketsuuuさんにお任せするとして「一般的か」という点で面白いので補足情報を  
Google
Trendでの比較するとこんな感じです。「一般的」かどうか「みんなが使っているのか」という尺度でならこういう見方もあります。他人を説得するときに割りと使えるので、参考まで  
[![画像の説明をここに入力](https://i.stack.imgur.com/vwxYu.png)](https://i.stack.imgur.com/vwxYu.png)


CC BY-SA 4.0
2019-05-03T06:58:41.583
54681
2019-05-03T06:58:41.583
10174
54644
answer