कॉल-बाय-वैल्यू और कॉल-बाय-रेफरेंस कार्यान्वयन तकनीकें हैं जो कि बहुत समय पहले पैरामीटर-पासिंग मोड के लिए गलत थीं।
शुरुआत में, फोरट्रान था। फोरट्रान में केवल कॉल-बाय-रेफरेंस था, क्योंकि सबरूटीन्स को अपने मापदंडों को संशोधित करने में सक्षम होना था, और कई मापदंडों से गुजरने वाले मोड की अनुमति देने के लिए कंप्यूटिंग साइकल बहुत महंगा था, साथ ही प्रोग्रामिंग के बारे में पर्याप्त नहीं था जब फोरट्रान को पहली बार परिभाषित किया गया था।
ALGOL कॉल-बाय-नेम और कॉल-बाय-वैल्यू के साथ आया। कॉल-बाय-वैल्यू उन चीजों के लिए था जिन्हें बदला नहीं जाना चाहिए था (इनपुट पैरामीटर्स)। कॉल-बाय-नाम आउटपुट पैरामीटर के लिए था। कॉल-बाय-नाम एक प्रमुख क्रॉक निकला, और ALGOL 68 ने इसे गिरा दिया।
PASCAL ने कॉल-बाय-वैल्यू और कॉल-बाय-रेफरेंस प्रदान किया। यह प्रोग्रामर के लिए संकलक को यह बताने के लिए कोई रास्ता नहीं प्रदान करता था कि वह पैरामीटर स्टैक को उड़ाने से बचने के लिए संदर्भ द्वारा एक बड़ी वस्तु (आमतौर पर एक सरणी) से गुजर रहा था, लेकिन यह कि वस्तु को बदला नहीं जाना चाहिए।
PASCAL ने भाषा डिजाइन lexicon के लिए संकेत जोड़े।
C ने कॉल-बाय-वैल्यू प्रदान की, और मेमोरी में एक मनमाना ऑब्जेक्ट को पॉइंटर वापस करने के लिए एक कीचड़ ऑपरेटर को परिभाषित करके कॉल-बाय-रेफरेंस को सिम्युलेटेड किया।
बाद में भाषाओं ने सी की नकल की, ज्यादातर क्योंकि डिजाइनरों ने कभी और कुछ नहीं देखा था। शायद यही कारण है कि कॉल-बाय-वैल्यू इतनी लोकप्रिय है।
C ++ ने कॉल-बाय-संदर्भ प्रदान करने के लिए C कीचड़ के ऊपर एक कीचड़ जोड़ा।
अब, कॉल-बाय-वैल्यू बनाम कॉल-बाय-रेफरेंस बनाम कॉल-बाय-पॉइंटर-कल्ज, सी और सी ++ (प्रोग्रामर) के प्रत्यक्ष परिणाम के रूप में कॉन्स्ट पॉइंटर्स और पॉइंटर्स टू कॉन्स्ट (केवल पढ़ने के लिए) के साथ भयानक सिरदर्द होते हैं वस्तुओं।
आद्या इस पूरे बुरे सपने से बचने में कामयाब रही।
Ada में स्पष्ट कॉल-बाय-वैल्यू बनाम कॉल-बाय-संदर्भ नहीं है। बल्कि, एडीए के मापदंडों में है (जो पढ़ा जा सकता है लेकिन लिखा नहीं जाता है), बाहर के पैरामीटर (जो पहले पढ़ा जा सकता है, उन्हें लिखा जाना चाहिए), और बाहर के मापदंडों में, जिन्हें किसी भी क्रम में पढ़ा और लिखा जा सकता है। कंपाइलर तय करता है कि क्या कोई विशेष पैरामीटर मान या संदर्भ द्वारा पारित किया गया है: यह प्रोग्रामर के लिए पारदर्शी है।
void acceptEntireProgrammingLanguageByValue(C++);