Call-by-value et call-by-reference sont des techniques de mise en œuvre qui avaient été confondues avec les modes de passage de paramètres il y a longtemps.
Au début, il y avait Fortran. FORTRAN ne disposait que d’appels par référence, car les sous-programmes devaient pouvoir modifier leurs paramètres et les cycles de calcul étaient trop coûteux pour permettre plusieurs modes de passage de paramètres.
ALGOL a proposé appel par nom et appel par valeur. Call-by-value était pour des choses qui n'étaient pas supposées être changées (paramètres d'entrée). Appel par nom était pour les paramètres de sortie. Call-by-name s'est avéré être une marmite majeure, et ALGOL 68 l'a abandonné.
PASCAL a fourni appel par valeur et appel par référence. Cela ne permettait pas au programmeur d'indiquer au compilateur qu'il transmettait un objet volumineux (généralement un tableau) par référence, afin d'éviter de détruire la pile de paramètres, mais que l'objet ne devait pas être modifié.
PASCAL a ajouté des pointeurs au lexique de conception de langage.
C a fourni appel par valeur et simulé appel par référence en définissant un opérateur kludge pour renvoyer un pointeur sur un objet arbitraire en mémoire.
Les langues suivantes ont copié le C, principalement parce que les concepteurs n’avaient jamais rien vu d’autre. C'est probablement pourquoi appel par valeur est si populaire.
C ++ a ajouté un kludge au-dessus du C kludge pour fournir un appel par référence.
Maintenant, en tant que résultat direct appel par valeur vs appel par référence vs appel par pointeur-kludge, C et C ++ (programmeurs) ont des maux de tête horribles avec les pointeurs const et les pointeurs vers const (lecture seule) objets.
Ada a réussi à éviter tout ce cauchemar.
Ada n'a pas explicitement appel par valeur vs appel par référence. Au lieu de cela, Ada a dans les paramètres (qui peuvent être lus mais non écrits), les paramètres out (qui DOIVENT être écrits avant de pouvoir être lus) et les paramètres out, qui peuvent être lus et écrits dans n'importe quel ordre. Le compilateur décide si un paramètre particulier est passé par valeur ou par référence: il est transparent pour le programmeur.
void acceptEntireProgrammingLanguageByValue(C++);