値渡しと参照渡しは、かなり前にパラメータ受け渡しモードと間違われた実装手法です。
最初は、FORTRANがありました。サブルーチンはパラメーターを変更する必要があり、複数のパラメーター渡しモードを許可するには計算サイクルが高すぎたため、FORTRANには参照による呼び出ししかありませんでした。さらに、FORTRANが最初に定義されたときのプログラミングについては十分ではありませんでした。
ALGOLは、名前による呼び出しと値による呼び出しを考案しました。値渡しは、変更されるはずのないもの(入力パラメーター)のためのものでした。名前による呼び出しは出力パラメーター用でした。名前による呼び出しは大きな障害であることが判明し、ALGOL 68はそれを落としました。
PASCALは、値による呼び出しと参照による呼び出しを提供しました。プログラマーがコンパイラーに、参照によって大きなオブジェクト(通常は配列)を渡していること、パラメータースタックを吹き飛ばすことをコンパイラーに伝える方法を提供しませんでしたが、オブジェクトは変更すべきではありません。
PASCALは、言語設計用語集へのポインターを追加しました。
Cは、メモリ内の任意のオブジェクトへのポインタを返すkludge演算子を定義することにより、値による呼び出しとシミュレーションによる参照による呼び出しを提供しました。
後の言語がCをコピーしたのは、主にデザイナーが他に何も見たことがないからです。これがおそらく、値渡しが非常に人気がある理由です。
C ++は、参照による呼び出しを提供するために、Cクラッジの上にクラッジを追加しました。
現在、値による呼び出し対参照による呼び出し対ポインターによる処理の直接的な結果として、CおよびC ++(プログラマー)はconstポインターとconstへのポインター(読み取り専用)でひどい頭痛を抱えています。オブジェクト。
エイダはこの悪夢全体をどうにかして避けました。
Adaには、明示的な値による呼び出しと参照による呼び出しがありません。むしろ、Adaにはinパラメーター(読み取りは可能ですが、書き込みはできません)、outパラメーター(読み取り前に書き込みが必要)、in outパラメーターは任意の順序で読み取りと書き込みが可能です。コンパイラーは、特定のパラメーターを値で渡すか参照で渡すかを決定します。これはプログラマーに対して透過的です。
void acceptEntireProgrammingLanguageByValue(C++);