Call-by-Value und Call-by-Reference sind Implementierungstechniken, die vor langer Zeit für Parameterübergabemodi gehalten wurden.
Am Anfang war FORTRAN. FORTRAN hatte nur Call-by-Reference, da Subroutinen in der Lage sein mussten, ihre Parameter zu ändern, und Rechenzyklen zu teuer waren, um mehrere Parameterübergabemodi zuzulassen. Außerdem war nicht genug über die Programmierung bekannt, als FORTRAN zum ersten Mal definiert wurde.
ALGOL hat Call-by-Name und Call-by-Value erfunden. Call-by-Value war für Dinge, die nicht geändert werden sollten (Eingabeparameter). Call-by-Name war für Ausgabeparameter. Call-by-Name stellte sich als großes Problem heraus, und ALGOL 68 ließ es fallen.
PASCAL lieferte Call-by-Value und Call-by-Reference. Es gab dem Programmierer keine Möglichkeit, dem Compiler per Referenz mitzuteilen, dass er ein großes Objekt (normalerweise ein Array) übergeben hat, um zu vermeiden, dass der Parameterstapel aufgeblasen wird, aber das Objekt sollte nicht geändert werden.
PASCAL fügte dem Sprachdesign-Lexikon Zeiger hinzu.
C lieferte Call-by-Value und simulierte Call-by-Reference, indem ein Kludge-Operator definiert wurde, der einen Zeiger auf ein beliebiges Objekt im Speicher zurückgibt.
Spätere Sprachen kopierten C, hauptsächlich, weil die Designer noch nie etwas anderes gesehen hatten. Dies ist wahrscheinlich der Grund, warum Call-by-Value so beliebt ist.
C ++ fügte einen Kludge über dem C-Kludge hinzu, um Call-by-Reference bereitzustellen.
Jetzt haben C und C ++ (Programmierer) als direkte Folge von call-by-value vs. call-by-reference vs. call-by-pointer-kludge schreckliche Kopfschmerzen mit const-Zeigern und Zeigern auf const (schreibgeschützt) Objekte.
Ada hat es geschafft, diesen ganzen Albtraum zu vermeiden.
Ada hat kein explizites Call-by-Value im Vergleich zu Call-by-Reference. Vielmehr hat Ada In-Parameter (die gelesen, aber nicht geschrieben werden können), Out-Parameter (die geschrieben werden MÜSSEN, bevor sie gelesen werden können) und In-Out-Parameter, die in beliebiger Reihenfolge gelesen und geschrieben werden können. Der Compiler entscheidet, ob ein bestimmter Parameter als Wert oder als Referenz übergeben wird: Er ist für den Programmierer transparent.
void acceptEntireProgrammingLanguageByValue(C++);