Call-by-Value i Call-by-Reference to techniki implementacji, które dawno temu były mylone z trybami przekazywania parametrów.
Na początku istniał FORTRAN. FORTRAN miał tylko call-by-referencję, ponieważ podprogramy musiały być w stanie modyfikować swoje parametry, a cykle obliczeniowe były zbyt drogie, aby umożliwić wiele trybów przekazywania parametrów, a ponadto nie było wystarczająco dużo informacji o programowaniu, gdy FORTRAN został zdefiniowany po raz pierwszy.
ALGOL wymyślił nazwę po nazwie i nazwę po wartości. Call-by-value dotyczyło rzeczy, których nie należy zmieniać (parametry wejściowe). Call-by-name było dla parametrów wyjściowych. Call-by-name okazało się poważnym crockiem, a ALGOL 68 go upuścił.
PASCAL dostarczył funkcję call-by-value i call-by-reference. Nie dało to programiście żadnego sposobu na poinformowanie kompilatora, że przekazuje duży obiekt (zwykle tablicę) przez odniesienie, aby uniknąć wysadzenia stosu parametrów, ale tego obiektu nie należy zmieniać.
PASCAL dodał wskaźniki do leksykonu projektowania języka.
C dostarczył call-by-value i symulował call-by-referencję poprzez zdefiniowanie operatora kludge w celu zwrócenia wskaźnika do dowolnego obiektu w pamięci.
Późniejsze języki kopiowały C, głównie dlatego, że projektanci nigdy nie widzieli nic innego. Prawdopodobnie dlatego tak popularna jest funkcja call-by-value.
C ++ dodał kludge na górze C kludge, aby zapewnić call-by-reference.
Teraz, jako bezpośredni rezultat call-by-value vs. call-by-reference vs. call-by-pointer-kludge, C i C ++ (programiści) mają straszne bóle głowy ze wskaźnikami const i wskaźnikami const (tylko do odczytu) przedmioty
Adzie udało się uniknąć tego koszmaru.
Ada nie ma wyraźnej funkcji call-by-value vs. call-by-reference. Ada ma raczej parametry wejściowe (które można odczytać, ale nie zapisane), parametry wyjściowe (które MUSZĄ zostać zapisane, zanim będą mogły zostać odczytane) oraz parametry wyjściowe, które można odczytać i zapisać w dowolnej kolejności. Kompilator decyduje, czy dany parametr jest przekazywany przez wartość, czy przez odniesienie: jest on przezroczysty dla programisty.
void acceptEntireProgrammingLanguageByValue(C++);