Call-by-value dan call-by-reference adalah teknik implementasi yang keliru untuk mode parameter-passing sejak lama.
Awalnya, ada FORTRAN. FORTRAN hanya memiliki call-by-reference, karena subrutin harus dapat memodifikasi parameter mereka, dan siklus komputasi terlalu mahal untuk memungkinkan beberapa mode parameter-passing, ditambah tidak cukup diketahui tentang pemrograman ketika FORTRAN pertama kali didefinisikan.
ALGOL datang dengan nama panggilan dan nilai panggilan. Nilai panggilan-adalah untuk hal-hal yang tidak seharusnya diubah (parameter input). Call-by-name adalah untuk parameter output. Panggilan-dengan-nama ternyata menjadi tempayan besar, dan ALGOL 68 menjatuhkannya.
PASCAL menyediakan call-by-value dan call-by-reference. Itu tidak menyediakan cara bagi programmer untuk memberitahu kompiler bahwa ia melewati objek besar (biasanya array) dengan referensi, untuk menghindari meniup tumpukan parameter, tetapi objek tidak boleh diubah.
PASCAL menambahkan pointer ke leksikon desain bahasa.
C memberikan call-by-value, dan simulasi call-by-reference dengan mendefinisikan operator kludge untuk mengembalikan pointer ke objek yang berubah-ubah dalam memori.
Kemudian bahasa-bahasa disalin C, terutama karena para perancang tidak pernah melihat yang lain. Ini mungkin mengapa panggilan-oleh-nilai sangat populer.
C ++ menambahkan kludge di atas kludge C untuk memberikan panggilan-oleh-referensi.
Sekarang, sebagai akibat langsung dari call-by-value vs call-by-reference vs call-by-pointer-kludge, C dan C ++ (programmer) mengalami sakit kepala yang mengerikan dengan pointer pointer dan pointer ke const (read-only) benda.
Ada yang berhasil menghindari seluruh mimpi buruk ini.
Ada tidak memiliki call-by-value secara eksplisit vs call-by-reference. Alih-alih, Ada memiliki parameter (yang dapat dibaca tetapi tidak ditulis), parameter keluar (yang HARUS ditulis sebelum dapat dibaca), dan parameter keluar, yang dapat dibaca dan ditulis dalam urutan apa pun. Compiler memutuskan apakah parameter tertentu dilewatkan oleh nilai atau dengan referensi: itu transparan untuk programmer.
void acceptEntireProgrammingLanguageByValue(C++);