Call-by-value та call-by-reference - це методи реалізації, які давно помилялися в режимах передачі параметрів.
На початку був FORTRAN. FORTRAN мав лише виклик за посиланням, оскільки підпрограми повинні були мати змогу змінювати свої параметри, а обчислювальні цикли були надто дорогими для дозволу декількох режимів передачі параметрів, плюс мало що було відомо про програмування, коли FORTRAN був вперше визначений.
ALGOL придумав дзвінки по імені та за закликом за значенням. Значення дзвінка для речей, які не мали бути змінені (вхідні параметри). Call-by-name було для вихідних параметрів. Виклик за назвою виявився головним кроком, і ALGOL 68 скинув його.
PASCAL надав дзвінки за вартістю та за посиланням. Це не дало жодного способу програмісту сказати компілятору, що він передає великий об'єкт (як правило, масив) за посиланням, щоб уникнути зриву стека параметрів, але що об'єкт не слід змінювати.
PASCAL додав покажчики до лексикону дизайну мови.
C надає заклик за значенням і моделює виклик за посиланням, визначаючи оператора kludge для повернення покажчика на довільний об'єкт у пам'яті.
Пізніші мови скопіювали C, головним чином тому, що дизайнери ніколи не бачили нічого іншого. Це, мабуть, тому вартість дзвінків настільки популярна.
C ++ додав кляж зверху на C Cludge, щоб забезпечити виклик за посиланням.
Тепер, як прямий результат виклику за значенням проти виклику за посиланням проти заклику за вказівником, програма C і C ++ (програмісти) мають жахливі головні болі з покажчиками const та покажчиками на const (лише для читання) об’єкти.
Ада вдалося уникнути цього цілого кошмару.
Ада не має явного виклику за значенням проти виклику за посиланням. Швидше за все, у Ada є параметри (які можуть бути прочитані, але не записані), параметри (які ОБОВ'ЯЗКОВО записати, перш ніж їх можна прочитати), а також параметри, які можна прочитати та записати в будь-якому порядку. Компілятор вирішує, чи передається певний параметр за значенням або посиланням: він прозорий для програміста.
void acceptEntireProgrammingLanguageByValue(C++);