Call-by-value e call-by-reference sono tecniche di implementazione che sono state scambiate per modalità di passaggio dei parametri molto tempo fa.
All'inizio c'era FORTRAN. FORTRAN aveva solo una chiamata per riferimento, poiché le subroutine dovevano essere in grado di modificare i loro parametri, ei cicli di calcolo erano troppo costosi per consentire più modalità di passaggio dei parametri, in più non si sapeva abbastanza sulla programmazione quando FORTRAN veniva definito per la prima volta.
ALGOL ha trovato call-by-name e call-by-value. Call-by-value era per cose che non dovevano essere cambiate (parametri di input). Call-by-name era per i parametri di output. Call-by-name si è rivelato essere un grosso coccio e ALGOL 68 l'ha abbandonato.
PASCAL ha fornito call-by-value e call-by-reference. Non ha fornito alcun modo al programmatore di dire al compilatore che stava passando un oggetto di grandi dimensioni (di solito un array) per riferimento, per evitare di soffiare lo stack dei parametri, ma che l'oggetto non dovrebbe essere modificato.
PASCAL ha aggiunto dei puntatori al lessico del linguaggio design.
C ha fornito call-by-value e ha simulato call-by-reference definendo un operatore kludge per restituire un puntatore a un oggetto arbitrario in memoria.
Le lingue successive hanno copiato C, soprattutto perché i progettisti non avevano mai visto altro. Questo è probabilmente il motivo per cui call-by-value è così popolare.
C ++ ha aggiunto un kludge in cima al kludge C per fornire call-by-reference.
Ora, come risultato diretto di call-by-value vs call-by-reference vs. call-by-pointer-kludge, C e C ++ (programmatori) hanno orribili mal di testa con puntatori const e puntatori a const (leggi -only) oggetti.
Ada è riuscita a evitare tutto questo incubo.
Ada non ha call-by-value esplicito rispetto a call-by-reference. Piuttosto, Ada ha parametri (che possono essere letti ma non scritti), parametri out (che DEVONO essere scritti prima che possano essere letti), e parametri out, che possono essere letti e scritti in qualsiasi ordine. Il compilatore decide se un particolare parametro viene passato per valore o per riferimento: è trasparente per il programmatore.