Call-by-value e call-by-reference sono tecniche di implementazione che sono state confuse molto tempo fa con le modalità di passaggio dei parametri.
All'inizio c'era FORTRAN. FORTRAN aveva solo una chiamata per riferimento, poiché le subroutine dovevano essere in grado di modificare i loro parametri e i cicli di calcolo erano troppo costosi per consentire più modalità di passaggio dei parametri, inoltre non si sapeva abbastanza sulla programmazione quando FORTRAN fu definito per la prima volta.
ALGOL ha inventato il call-by-name e il call-by-value. La chiamata per valore era per cose che non dovevano essere modificate (parametri di input). La chiamata per nome era per i parametri di output. Il call-by-name si rivelò essere un grande idiota e ALGOL 68 lo lasciò cadere.
PASCAL ha fornito call-by-value e call-by-reference. Non ha fornito al programmatore alcun modo per dire al compilatore che stava passando un oggetto di grandi dimensioni (di solito un array) per riferimento, per evitare di far saltare lo stack dei parametri, ma che l'oggetto non doveva essere modificato.
PASCAL ha aggiunto degli indicatori al lessico del design linguistico.
C ha fornito una chiamata per valore e ha simulato una chiamata per riferimento definendo un operatore kludge per restituire un puntatore a un oggetto arbitrario in memoria.
Le lingue successive copiarono C, soprattutto perché i progettisti non avevano mai visto nient'altro. Questo è probabilmente il motivo per cui la chiamata per valore è così popolare.
C ++ ha aggiunto un kludge in cima a C kludge per fornire chiamate per riferimento.
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 (sola lettura) oggetti.
Ada è riuscita a evitare questo intero incubo.
Ada non ha esplicito call-by-value vs. call-by-reference. Piuttosto, Ada ha parametri (che possono essere letti ma non scritti), parametri out (che DEVONO essere scritti prima di poter essere letti) e parametri out, che possono essere letti e scritti in qualsiasi ordine. Il compilatore decide se un determinato parametro viene passato per valore o per riferimento: è trasparente per il programmatore.
void acceptEntireProgrammingLanguageByValue(C++);