Function (computer programming)
कंप्यूटर प्रोग्रामिंग में, एक फ़ंक्शन या सबरूटीन प्रोग्राम निर्देशों का एक क्रम है जो एक विशिष्ट कार्य करता है, जिसे एक इकाई के रूप में पैक किया जाता है। इस इकाई का उपयोग तब कार्यक्रमों में किया जा सकता है जहां उस विशेष कार्य को किया जाना चाहिए। कार्यों को कार्यक्रमों के भीतर या पुस्तकालयों में अलग से परिभाषित किया जा सकता है जिनका उपयोग कई कार्यक्रमों द्वारा किया जा सकता है। विभिन्न प्रोग्रामिंग भाषाओं में, एक फ़ंक्शन को रूटीन, सबप्रोग्राम, सबरूटीन या प्रक्रिया कहा जा सकता है; ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग (ओ. ओ. पी.) में, इसे एक विधि कहा जा सकता है। तकनीकी रूप से, इन सभी शब्दों की अलग-अलग परिभाषाएँ हैं, और नामकरण भाषा से भाषा में भिन्न होता है। जेनेरिक अम्ब्रेला शब्द कॉल करने योग्य इकाई का कभी-कभी उपयोग किया जाता है। एक फ़ंक्शन को अक्सर कोड किया जाता है ताकि इसे प्रोग्राम के एक निष्पादन के दौरान कई बार और कई स्थानों से शुरू किया जा सके, जिसमें अन्य फ़ंक्शन भी शामिल हैं, और फिर फ़ंक्शन का कार्य पूरा होने के बाद कॉल के बाद अगले निर्देश पर वापस शाखा (वापसी) की जा सके। सबरूटीन के विचार की कल्पना शुरू में जॉन मौचली और कैथलीन एंटोनेली ने ईएनआईएसी पर अपने काम के दौरान की थी, और जनवरी 1947 में हार्वर्ड संगोष्ठी में "ईडीवीएसी-प्रकार की मशीनों के लिए समस्याओं की तैयारी" पर रिकॉर्ड किया गया था। मौरिस विल्क्स, डेविड व्हीलर और स्टेनली गिल को आम तौर पर इस अवधारणा के औपचारिक आविष्कार का श्रेय दिया जाता है, जिसे उन्होंने एक बंद उप-दिनचर्या कहा, जो एक खुली उप-दिनचर्या या मैक्रो के विपरीत है। हालाँकि, एलन ट्यूरिंग ने एन. पी. एल. ए. सी. ई. के लिए डिजाइन प्रस्तावों पर 1945 के एक पेपर में सबरूटीन पर चर्चा की थी, जहाँ तक कि रिटर्न एड्रेस स्टैक की अवधारणा का आविष्कार किया गया था। कार्य एक शक्तिशाली प्रोग्रामिंग उपकरण है, और कई प्रोग्रामिंग भाषाओं के वाक्यविन्यास में सबरूटीन लिखने और उपयोग करने के लिए समर्थन शामिल है। कार्यों का विवेकपूर्ण उपयोग (उदाहरण के लिए, संरचित प्रोग्रामिंग दृष्टिकोण के माध्यम से) अक्सर एक बड़े कार्यक्रम को विकसित करने और बनाए रखने की लागत को काफी कम कर देगा, जबकि इसकी गुणवत्ता और विश्वसनीयता में वृद्धि होगी। कार्य, जो अक्सर पुस्तकालयों में एकत्र किए जाते हैं, सॉफ्टवेयर साझा करने और व्यापार करने के लिए एक महत्वपूर्ण तंत्र हैं। ओ. ओ. पी. का अनुशासन वस्तुओं और विधियों पर आधारित है (जो इन वस्तुओं या वस्तु वर्गों से जुड़े कार्य हैं)। मुख्य अवधारणाएँ किसी फ़ंक्शन की सामग्री उसका मुख्य भाग होती है, जो प्रोग्राम कोड का वह टुकड़ा होता है जिसे फ़ंक्शन को बुलाने या लागू करने पर निष्पादित किया जाता है। एक फ़ंक्शन लिखा जा सकता है ताकि वह कॉलिंग प्रोग्राम से एक या अधिक डेटा मान प्राप्त करने की उम्मीद करे (अपने मापदंडों या औपचारिक मापदंडों को बदलने के लिए)। कॉलिंग प्रोग्राम इन मापदंडों के लिए वास्तविक मूल्य प्रदान करता है, जिन्हें तर्क कहा जाता है। अलग-अलग प्रोग्रामिंग भाषाएँ तर्क पारित करने के लिए अलग-अलग परंपराओं का उपयोग कर सकती हैंः एक फ़ंक्शन कॉल के दुष्प्रभाव भी हो सकते हैं जैसे कि कंप्यूटर मेमोरी में डेटा संरचनाओं को संशोधित करना, एक परिधीय उपकरण से पढ़ना या लिखना, एक फ़ाइल बनाना, प्रोग्राम या मशीन को रोकना, या यहां तक कि एक निर्दिष्ट समय के लिए प्रोग्राम के निष्पादन में देरी करना। दुष्प्रभाव वाला एक उप-कार्यक्रम हर बार कॉल करने पर अलग-अलग परिणाम दे सकता है, भले ही इसे एक ही तर्क के साथ कॉल किया गया हो। एक उदाहरण एक यादृच्छिक संख्या फलन है, जो कई भाषाओं में उपलब्ध है, जो हर बार कॉल करने पर एक अलग छद्म-यादृच्छिक संख्या देता है। दुष्प्रभाव वाले कार्यों का व्यापक उपयोग अनिवार्य प्रोग्रामिंग भाषाओं की एक विशेषता है। एक फलन को कूटबद्ध किया जा सकता है ताकि वह अपने कार्य को करने के लिए एक या अधिक स्थानों पर खुद को पुनरावर्ती रूप से बुला सके। यह विधि गणितीय प्रेरण और पुनरावर्ती विभाजन और विजय एल्गोरिदम द्वारा परिभाषित कार्यों के प्रत्यक्ष कार्यान्वयन की अनुमति देती है। एक फलन जिसका उद्देश्य एक बूलियन-मूल्य वाले फलन (अर्थात, हाँ/नहीं प्रश्न का उत्तर देना) की गणना करना है, उसे कभी-कभी विधेय कहा जाता है। तर्क प्रोग्रामिंग भाषाओं में, अक्सर सभी कार्यों को विधेय कहा जाता है, क्योंकि वे मुख्य रूप से सफलता या विफलता का निर्धारण करते हैं। एक फलन जो कोई मूल्य नहीं देता है या शून्य मूल्य देता है, उसे कभी-कभी प्रक्रिया कहा जाता है। प्रक्रियाएं आमतौर पर अपने तर्कों को संशोधित करती हैं और प्रक्रियात्मक प्रोग्रामिंग का एक मुख्य हिस्सा होती हैं। शब्दावली एक सबरूटीन एक ऐसा फलन है जो कोई मान नहीं देता है। कार्यों का प्राथमिक उद्देश्य जटिल गणनाओं को सार्थक भागों में विभाजित करना और उन्हें नाम देना है। फ़ंक्शन अपने कॉलर (इसके वापसी मूल्य) को एक संगणित मूल्य वापस कर सकता है, या विभिन्न परिणाम मूल्य या आउटपुट पैरामीटर प्रदान कर सकता है। वास्तव में, कार्यों का एक सामान्य उपयोग गणितीय कार्यों को लागू करना है, जिसमें कार्य का उद्देश्य विशुद्ध रूप से एक या अधिक परिणामों की गणना करना है जिनके मूल्य पूरी तरह से कार्य को पारित तर्कों द्वारा निर्धारित किए जाते हैं। (उदाहरणों में किसी संख्या के लघुगणक या मैट्रिक्स के निर्धारक की गणना शामिल हो सकती है।) कुछ भाषाओं में एक प्रक्रिया के लिए वाक्यविन्यास जो एक मूल्य देता है, अनिवार्य रूप से एक प्रक्रिया के लिए वाक्यविन्यास के समान होता है जो एक मूल्य नहीं देता है, सिवाय इसके कि, उदाहरण के लिए, वापसी खंड की अनुपस्थिति। कुछ भाषाओं में एक प्रक्रिया अपने तर्कों के आधार पर गतिशील रूप से एक मूल्य के साथ या उसके बिना लौटने का विकल्प चुन सकती है। भाषा समर्थन उच्च-स्तरीय प्रोग्रामिंग भाषाओं में आमतौर पर विशिष्ट निर्माण शामिल होते हैंः कार्यक्रम (निकाय) के हिस्से को सीमित करें जो कार्य को बनाता है एक पहचानकर्ता (नाम) को कार्य को निर्दिष्ट करें इसके मापदंडों और वापसी मूल्यों के नाम और डेटा प्रकार निर्दिष्ट करें इसके अस्थायी चर के लिए एक निजी नामकरण गुंजाइश प्रदान करें कार्य के बाहर चर की पहचान करें जो इसके भीतर सुलभ हैं कार्य को मूल्य प्रदान करें इसके मापदंडों को मूल्य प्रदान करें मुख्य कार्यक्रम में उप-कार्यक्रम का पता होता है मुख्य कार्यक्रम में कार्य कॉल के अगले निर्देश का पता होता है अपने शरीर के भीतर से वापसी मूल्य निर्दिष्ट करें कॉलिंग कार्यक्रम पर लौटें कॉल द्वारा वापस किए गए मूल्यों का निपटान एक मॉड्यूल, पुस्तकालय, वस्तु में कॉल पैकेज कार्यों के दौरान आने वाली किसी भी असाधारण शर्तों को संभालें। उन भाषाओं में, फ़ंक्शन कॉल आम तौर पर अभिव्यक्तियों में अंतर्निहित होते हैं (उदाहरण के लिए, एक एसक्यूआरटी फ़ंक्शन को वाई = जेड + एसक्यूआरटी (एक्स) कहा जा सकता है)। प्रक्रिया कॉल या तो वाक्य रचना के रूप में व्यवहार करते हैं (उदाहरण के लिए, एक प्रिंट प्रक्रिया को x> 0 कहा जा सकता है फिर प्रिंट (x) या स्पष्ट रूप से कॉल या जी. ओ. एस. यू. बी. (उदाहरण के लिए, कॉल प्रिंट (x)) जैसे कथन द्वारा लागू किया जाता है। अन्य भाषाएँ, जैसे कि सी और लिस्प, कार्यों और सबरूटीन के बीच अंतर नहीं करती हैं। हैस्केल जैसी सख्ती से कार्यात्मक प्रोग्रामिंग भाषाओं में, उप-कार्यक्रमों का कोई दुष्प्रभाव नहीं हो सकता है, जिसका अर्थ है कि कार्यक्रम की विभिन्न आंतरिक अवस्थाएँ नहीं बदलेंगी। यदि एक ही तर्क के साथ बार-बार कॉल किया जाए तो कार्य हमेशा एक ही परिणाम देंगे। ऐसी भाषाएँ आम तौर पर केवल उन कार्यों का समर्थन करती हैं जो एक मूल्य लौटाते हैं, क्योंकि जो कार्य एक मूल्य नहीं लौटाते हैं उनका कोई उपयोग नहीं होता है जब तक कि वे एक दुष्प्रभाव पैदा नहीं कर सकते। सी, सी + + और सी #जैसी प्रोग्रामिंग भाषाओं में, जो कार्य एक मूल्य लौटाते हैं और जो कार्य कोई मूल्य नहीं लौटाते हैं, दोनों को "कार्य" कहा जाता है (गणितीय कार्य या कार्यात्मक प्रोग्रामिंग के साथ भ्रमित नहीं होना चाहिए, जो अलग-अलग अवधारणाएं हैं)। एक भाषा का संकलक आमतौर पर प्रक्रिया कॉल का अनुवाद करता है और एक अच्छी तरह से परिभाषित कॉलिंग परंपरा के अनुसार मशीन निर्देशों में लौटता है, ताकि कार्यों को उन कार्यक्रमों से अलग से संकलित किया जा सके जो उन्हें कॉल करते हैं। कॉल और रिटर्न स्टेटमेंट के अनुरूप निर्देश अनुक्रमों को प्रक्रिया का प्रस्तावना और उपसंहार कहा जाता है। एक प्रोग्राम को कार्यों में विभाजित करने के लाभों में शामिल हैंः एक जटिल प्रोग्रामिंग कार्य को सरल चरणों में विघटित करनाः यह डेटा संरचनाओं के साथ संरचित प्रोग्रामिंग के दो मुख्य उपकरणों में से एक है, एक प्रोग्राम के भीतर डुप्लिकेट कोड को कम करना कई कार्यक्रमों में कोड के पुनः उपयोग को सक्षम करना विभिन्न प्रोग्रामरों या परियोजना के विभिन्न चरणों के बीच एक बड़े प्रोग्रामिंग कार्य को विभाजित करना कार्य के उपयोगकर्ताओं से कार्यान्वयन विवरण को छिपाना एक कार्य कॉल के साथ कोड के एक ब्लॉक को बदलकर कोड की पठनीयता में सुधार करना जहां एक वर्णनात्मक कार्य नाम कोड के ब्लॉक का वर्णन करने का काम करता है। यह कॉलिंग कोड को संक्षिप्त और पठनीय बनाता है, भले ही कार्य का पुनः उपयोग नहीं किया जाना हो। पता लगाने की क्षमता में सुधार (अर्थात। अधिकांश भाषाएँ कॉल ट्रेस प्राप्त करने के तरीके प्रदान करती हैं जिसमें शामिल कार्यों के नाम और शायद और भी अधिक जानकारी शामिल होती है जैसे कि फ़ाइल नाम और पंक्ति संख्याएँ); कोड को कार्यों में विघटित नहीं करने से, डिबगिंग गंभीर रूप से बिगड़ेगी नुकसान इन-लाइन कोड का उपयोग करने की तुलना में, एक फ़ंक्शन का आह्वान कॉल तंत्र में कुछ कम्प्यूटेशनल ओवरहेड लगाता है। एक कार्य के लिए आम तौर पर मानक हाउसकीपिंग कोड की आवश्यकता होती है-कार्य के प्रवेश और निकास दोनों पर (कार्य प्रस्तावना और उपसंहार-आमतौर पर सामान्य उद्देश्य रजिस्टर और वापसी पते को न्यूनतम के रूप में सहेजना)। एक सबरूटीन का विचार कुछ समय के लिए कंप्यूटिंग मशीनों के अस्तित्व में होने के बाद तैयार किया गया था। अंकगणितीय और सशर्त कूद निर्देश समय से पहले योजनाबद्ध किए गए थे और अपेक्षाकृत कम बदल गए हैं, लेकिन प्रक्रिया कॉल के लिए उपयोग किए जाने वाले विशेष निर्देश पिछले कुछ वर्षों में बहुत बदल गए हैं। शुरुआती कंप्यूटर और माइक्रोप्रोसेसर, जैसे कि मैनचेस्टर बेबी और आरसीए 1802 में एक भी सबरूटीन कॉल निर्देश नहीं था। सबरूटीन को लागू किया जा सकता था, लेकिन उन्हें प्रोग्रामरों को प्रत्येक कॉल साइट पर कॉल अनुक्रम-निर्देशों की एक श्रृंखला-का उपयोग करने की आवश्यकता थी। सबरूटीन को 1945 में कोनराड ज़ूज़ के जेड4 में लागू किया गया था। 1945 में, एलन एम. ट्यूरिंग ने सबरूटीन से कॉल करने और लौटने के साधन के रूप में "दफन" और "अनबरी" शब्दों का उपयोग किया। जनवरी 1947 में जॉन मौचली ने हार्वर्ड विश्वविद्यालय और संयुक्त राज्य अमेरिका की नौसेना के आयुध ब्यूरो के संयुक्त प्रायोजन के तहत 'ए सिम्पोजियम ऑफ लार्ज स्केल डिजिटल कैल्कुलेटिंग मशीनरी' में सामान्य टिप्पणियाँ प्रस्तुत कीं। यहाँ उन्होंने धारावाहिक और समानांतर संचालन पर चर्चा की जिसमें सुझाव दिया गया कि के मैकनल्टी ने ईएनआईएसी टीम में जॉन मौचली के साथ मिलकर काम किया था और ईएनआईएसी कंप्यूटर के लिए सबरूटीन के लिए एक विचार विकसित किया था जो वह द्वितीय विश्व युद्ध के दौरान प्रोग्रामिंग कर रही थी। उन्होंने और अन्य ई. एन. आई. ए. सी. प्रोग्रामरों ने मिसाइल प्रक्षेपवक्र की गणना करने में मदद करने के लिए सबरूटीन का उपयोग किया। गोल्डस्टीन और वॉन न्यूमैन ने 16 अगस्त 1948 को एक पेपर लिखा जिसमें सबरूटीन के उपयोग पर चर्चा की गई। कुछ बहुत शुरुआती कंप्यूटर और माइक्रोप्रोसेसर, जैसे कि आईबीएम 1620, इंटेल 4004 और इंटेल 8008, और पी. आई. सी. माइक्रोकंट्रोलर में एक एकल-निर्देश सबरूटीन कॉल होता है जो वापसी पते को संग्रहीत करने के लिए एक समर्पित हार्डवेयर स्टैक का उपयोग करता है-इस तरह के हार्डवेयर केवल कुछ स्तरों के सबरूटीन नेस्टिंग का समर्थन करते हैं, लेकिन पुनरावर्ती सबरूटीन का समर्थन कर सकते हैं। 1960 के दशक के मध्य से पहले की मशीनें-जैसे कि UNIVAC I, PDP-1 और IBM 1130-आम तौर पर एक कॉलिंग कन्वेंशन का उपयोग करती हैं जो सबरूटीन नामक पहले मेमोरी स्थान में निर्देश काउंटर को सेव करती हैं। यह मनमाने ढंग से सबरूटीन घोंसले के गहरे स्तर की अनुमति देता है लेकिन पुनरावर्ती सबरूटीन का समर्थन नहीं करता है। आईबीएम सिस्टम/360 में एक सबरूटीन कॉल निर्देश था जो सहेजे गए निर्देश काउंटर मूल्य को एक सामान्य-उद्देश्य रजिस्टर में रखता था; इसका उपयोग मनमाने ढंग से गहरे सबरूटीन घोंसले और पुनरावर्ती सबरूटीन का समर्थन करने के लिए किया जा सकता है। पी. डी. पी.-11 (1970) स्टैक-पुशिंग सबरूटीन कॉल निर्देश के साथ पहले कंप्यूटरों में से एक है; यह सुविधा मनमाने ढंग से डीप सबरूटीन नेस्टिंग और रिकर्सिव सबरूटीन दोनों का समर्थन करती है। भाषा समर्थन बहुत शुरुआती असेंबलर में, सबरूटीन समर्थन सीमित था। सबरूटीन स्पष्ट रूप से एक दूसरे से या मुख्य कार्यक्रम से अलग नहीं थे, और वास्तव में एक सबरूटीन के स्रोत कोड को अन्य उप-कार्यक्रमों के साथ विभाजित किया जा सकता था। कुछ असेंबलर कॉल और रिटर्न अनुक्रम उत्पन्न करने के लिए पूर्वनिर्धारित मैक्रो की पेशकश करेंगे। 1960 के दशक तक, असेंबलरों के पास आम तौर पर इनलाइन और अलग से असेंबल किए गए सबरूटीन दोनों के लिए बहुत अधिक परिष्कृत समर्थन था जिन्हें एक साथ जोड़ा जा सकता था। उपयोगकर्ता-लिखित सबरूटीन और कार्यों का समर्थन करने वाली पहली प्रोग्रामिंग भाषाओं में से एक FORTRAN II थी। IBM FORTRAN II संकलक 1958 में जारी किया गया था। एएलजीओएल 58 और अन्य प्रारंभिक प्रोग्रामिंग भाषाओं ने भी प्रक्रियात्मक प्रोग्रामिंग का समर्थन किया। पुस्तकालय इस बोझिल दृष्टिकोण के बावजूद, सबरूटीन बहुत उपयोगी साबित हुए। उन्होंने कई अलग-अलग कार्यक्रमों में एक ही कोड के उपयोग की अनुमति दी। प्रारंभिक कंप्यूटरों पर स्मृति एक बहुत ही दुर्लभ संसाधन था, और सबरूटीन ने कार्यक्रमों के आकार में महत्वपूर्ण बचत की अनुमति दी। कई प्रारंभिक कंप्यूटरों ने कार्यक्रम के निर्देशों को एक छिद्रित पेपर टेप से स्मृति में लोड किया। प्रत्येक सबरूटीन को फिर टेप के एक अलग टुकड़े द्वारा प्रदान किया जा सकता है, मुख्य कार्यक्रम (या "मेनलाइन") से पहले या बाद में लोड या स्प्लाइस किया जा सकता है; और उसी सबरूटीन टेप का उपयोग कई अलग-अलग कार्यक्रमों द्वारा किया जा सकता है। एक समान दृष्टिकोण का उपयोग कंप्यूटरों में किया गया था जो पंच्ड कार्ड से प्रोग्राम निर्देशों को लोड करते थे। सबरूटीन लाइब्रेरी नाम का मूल अर्थ एक पुस्तकालय था, शाब्दिक अर्थ में, जो सामूहिक उपयोग के लिए टेप या कार्ड के डेक के अनुक्रमित संग्रह रखता था। स्व-संशोधित कोड की आवश्यकता को दूर करने के लिए, कंप्यूटर डिजाइनरों ने अंततः एक अप्रत्यक्ष कूद निर्देश प्रदान किया, जिसका संचालन, स्वयं वापसी पता होने के बजाय, एक चर या प्रोसेसर रजिस्टर का स्थान था जिसमें वापसी पता था। उन कंप्यूटरों पर, फ़ंक्शन के रिटर्न जंप को संशोधित करने के बजाय, कॉलिंग प्रोग्राम वापसी पते को एक चर में संग्रहीत करेगा ताकि जब फ़ंक्शन पूरा हो जाए, तो यह एक अप्रत्यक्ष कूद निष्पादित करेगा जो पूर्वनिर्धारित चर द्वारा दिए गए स्थान पर निष्पादन को निर्देशित करेगा। सबरूटीन पर कूदो एक और अग्रिम सबरूटीन निर्देश पर कूदो था, जो कॉलिंग जंप के साथ वापसी पते की बचत को जोड़ता था, जिससे ओवरहेड काफी कम हो जाता था। उदाहरण के लिए, आई. बी. एम. सिस्टम/360 में, प्रक्रिया कॉलिंग के लिए डिज़ाइन किए गए शाखा निर्देश बी. ए. एल. या बी. ए. एल. आर., कन्वेंशन रजिस्टर 14 द्वारा निर्देश में निर्दिष्ट प्रोसेसर रजिस्टर में वापसी पते को सहेजेगा। लौटने के लिए, सबरूटीन को केवल उस रजिस्टर के माध्यम से एक अप्रत्यक्ष शाखा निर्देश (बी. आर.) निष्पादित करना था। यदि सबरूटीन को किसी अन्य उद्देश्य के लिए उस रजिस्टर की आवश्यकता होती है (जैसे कि किसी अन्य सबरूटीन को कॉल करना), तो यह रजिस्टर की सामग्री को एक निजी मेमोरी स्थान या एक रजिस्टर स्टैक में सहेजेगा। एच. पी. 2100 जैसी प्रणालियों में, जे. एस. बी. निर्देश एक समान कार्य करेगा, सिवाय इसके कि वापसी पता स्मृति स्थान में संग्रहीत किया गया था जो शाखा का लक्ष्य था। प्रक्रिया का निष्पादन वास्तव में अगले स्मृति स्थान पर शुरू होगा। एच. पी. 2100 असेंबली भाषा में, उदाहरण के लिए लिखा जा सकता है. जे. एस. बी. एम. वाई. एस. यू. बी. (कॉल सबरूटीन एम. वाई. एस. यू. बी.)। बी. बी. (एम. वाई. एस. यू. बी. पूरा होने के बाद यहाँ लौटूंगा।) मुख्य कार्यक्रम से एम. वाई. एस. यू. बी. नामक सबरूटीन को कॉल करने के लिए। सबरूटीन को एम. वाई. एस. यू. बी. एन. ओ. पी. (एम. वाई. एस. यू. बी. के वापसी पते के लिए भंडारण) के रूप में कोड किया जाएगा। ए. ए. (एम. वाई. एस. यू. बी. की शुरुआत।) . जे. एम. पी. एम. वाई. एस. यू. बी., आई. (कॉलिंग प्रोग्राम पर लौटता है।) जे. एस. बी. निर्देश ने अगले निर्देश (अर्थात्, बी. बी.) के पते को उसके संचालन (अर्थात्, एम. वाई. एस. यू. बी.) के रूप में निर्दिष्ट स्थान पर रखा, और फिर उसके बाद अगले स्थान (अर्थात्, ए. ए. = एम. वाई. एस. यू. बी. + 1) पर शाखा बनाई। सबरूटीन तब अप्रत्यक्ष कूद जे. एम. पी. एम. वाई. एस. यू. बी. को निष्पादित करके मुख्य कार्यक्रम में लौट सकता है, जो स्थान एम. वाई. एस. यू. बी. पर संग्रहीत स्थान पर शाखा करता है। फोरट्रान और अन्य भाषाओं के लिए संकलक उपलब्ध होने पर आसानी से इन निर्देशों का उपयोग कर सकते हैं। यह दृष्टिकोण कॉल के कई स्तरों का समर्थन करता था; हालाँकि, चूंकि एक सबरूटीन के वापसी पते, मापदंडों और वापसी मूल्यों को निश्चित स्मृति स्थान दिए गए थे, इसलिए यह पुनरावर्ती कॉल की अनुमति नहीं देता था। संयोग से, 1980 के दशक की शुरुआत में लोटस 1-2-3 द्वारा एक स्प्रेडशीट में पुनः गणना निर्भरताओं की खोज के लिए इसी तरह की विधि का उपयोग किया गया था। अर्थात्, वापसी पते को संग्रहीत करने के लिए प्रत्येक कक्ष में एक स्थान आरक्षित किया गया था। चूँकि प्राकृतिक पुनर्कण क्रम के लिए वृत्ताकार संदर्भों की अनुमति नहीं है, यह स्मृति में ढेर के लिए जगह आरक्षित किए बिना एक ट्री वॉक की अनुमति देता है, जो आईबीएम पीसी जैसे छोटे कंप्यूटरों पर बहुत सीमित था। कॉल स्टैक एक फ़ंक्शन कॉल के अधिकांश आधुनिक कार्यान्वयन एक कॉल स्टैक का उपयोग करते हैं, जो फ़ंक्शन कॉल और रिटर्न को लागू करने के लिए स्टैक डेटा संरचना का एक विशेष मामला है। प्रत्येक प्रक्रिया कॉल स्टैक के शीर्ष पर एक नई प्रविष्टि बनाता है, जिसे स्टैक फ्रेम कहा जाता है; जब प्रक्रिया वापस आती है, तो इसका स्टैक फ्रेम स्टैक से हटा दिया जाता है, और इसके स्थान का उपयोग अन्य प्रक्रिया कॉल के लिए किया जा सकता है। प्रत्येक स्टैक फ्रेम में संबंधित कॉल का निजी डेटा होता है, जिसमें आम तौर पर प्रक्रिया के मापदंड और आंतरिक चर और वापसी का पता शामिल होता है। कॉल अनुक्रम को सामान्य निर्देशों के एक क्रम द्वारा लागू किया जा सकता है (एक दृष्टिकोण जो अभी भी रिड्यूस्ड इंस्ट्रक्शन सेट कंप्यूटिंग (आरआईएससी) और बहुत लंबे इंस्ट्रक्शन वर्ड (वीएलआईडब्ल्यू) आर्किटेक्चर में उपयोग किया जाता है), लेकिन 1960 के दशक के अंत से डिज़ाइन की गई कई पारंपरिक मशीनों में उस उद्देश्य के लिए विशेष निर्देश शामिल हैं। कॉल स्टैक को आमतौर पर स्मृति के एक सन्निहित क्षेत्र के रूप में लागू किया जाता है। यह एक मनमाना डिजाइन विकल्प है कि क्या स्टैक का निचला हिस्सा इस क्षेत्र के भीतर सबसे निचला या उच्चतम पता है, ताकि स्टैक मेमोरी में आगे या पीछे की ओर बढ़ सके; हालाँकि, कई वास्तुकलाओं ने बाद वाले को चुना। कुछ डिजाइन, विशेष रूप से कुछ फोर्थ कार्यान्वयन, दो अलग-अलग ढेर का उपयोग करते थे, एक मुख्य रूप से नियंत्रण जानकारी (जैसे वापसी पते और लूप काउंटर) के लिए और दूसरा डेटा के लिए। पहला एक कॉल स्टैक की तरह काम करता था और केवल अप्रत्यक्ष रूप से अन्य भाषा निर्माण के माध्यम से प्रोग्रामर के लिए सुलभ था, जबकि बाद वाला अधिक सीधे सुलभ था। जब स्टैक-आधारित प्रक्रिया कॉल पहली बार पेश किए गए थे, तो एक महत्वपूर्ण प्रेरणा बहुमूल्य स्मृति को बचाना था। इस योजना के साथ, संकलक को प्रत्येक प्रक्रिया के निजी डेटा (मापदंड, वापसी पता और स्थानीय चर) के लिए स्मृति में अलग स्थान आरक्षित करने की आवश्यकता नहीं है। किसी भी समय, स्टैक में केवल उन कॉल का निजी डेटा होता है जो वर्तमान में सक्रिय हैं (अर्थात्, जिन्हें कॉल किया गया है लेकिन अभी तक वापस नहीं आया है)। जिस तरह से कार्यक्रमों को आमतौर पर पुस्तकालयों से इकट्ठा किया जाता था, उसके कारण ऐसे कार्यक्रम मिलना (और अभी भी है) असामान्य नहीं था जिसमें हजारों कार्य शामिल हों, जिनमें से केवल मुट्ठी भर ही किसी भी समय सक्रिय होते हैं। ऐसे कार्यक्रमों के लिए, कॉल स्टैक तंत्र महत्वपूर्ण मात्रा में स्मृति की बचत कर सकता है। वास्तव में, कॉल स्टैक तंत्र को स्वचालित स्मृति प्रबंधन के लिए सबसे शुरुआती और सरल विधि के रूप में देखा जा सकता है। हालांकि, कॉल स्टैक विधि का एक और लाभ यह है कि यह पुनरावर्ती कार्य कॉल की अनुमति देता है, क्योंकि एक ही प्रक्रिया के लिए प्रत्येक नेस्टेड कॉल को अपने निजी डेटा का एक अलग उदाहरण मिलता है। बहु-थ्रेडेड वातावरण में, आम तौर पर एक से अधिक ढेर होते हैं। एक ऐसा वातावरण जो पूरी तरह से कोरोटीन या आलसी मूल्यांकन का समर्थन करता है, अपने सक्रियण रिकॉर्ड को संग्रहीत करने के लिए ढेर के अलावा अन्य डेटा संरचनाओं का उपयोग कर सकता है। देरी से जमा करना कॉल स्टैक तंत्र का एक नुकसान प्रक्रिया कॉल की बढ़ी हुई लागत और इसकी मिलान वापसी है। अतिरिक्त लागत में स्टैक पॉइंटर को बढ़ाना और घटाना (और, कुछ आर्किटेक्चर में, स्टैक ओवरफ्लो की जाँच करना), और पूर्ण पतों के बजाय फ्रेम-रिलेटिव पतों द्वारा स्थानीय चर और मापदंडों तक पहुँचना शामिल है। लागत का एहसास निष्पादन समय में वृद्धि, या प्रोसेसर की जटिलता में वृद्धि, या दोनों में किया जा सकता है। यह ओवरहेड पत्ती की प्रक्रियाओं या पत्ती के कार्यों में सबसे स्पष्ट और आपत्तिजनक है, जो बिना कोई प्रक्रिया किए खुद को बुलाते हुए लौटते हैं। उस ओवरहेड को कम करने के लिए, कई आधुनिक संकलक कॉल स्टैक के उपयोग में तब तक देरी करने की कोशिश करते हैं जब तक कि इसकी वास्तव में आवश्यकता न हो। उदाहरण के लिए, एक प्रक्रिया पी की कॉल कुछ प्रोसेसर रजिस्टरों में कॉल की गई प्रक्रिया के वापसी पते और मापदंडों को संग्रहीत कर सकती है, और एक साधारण छलांग द्वारा प्रक्रिया के मुख्य भाग में नियंत्रण स्थानांतरित कर सकती है। यदि प्रक्रिया पी बिना कोई अन्य कॉल किए लौटती है, तो कॉल स्टैक का बिल्कुल भी उपयोग नहीं किया जाता है। यदि पी को किसी अन्य प्रक्रिया क्यू को कॉल करने की आवश्यकता है, तो यह कॉल स्टैक का उपयोग किसी भी रजिस्टर (जैसे वापसी पता) की सामग्री को सहेजने के लिए करेगा जिसकी आवश्यकता क्यू के लौटने के बाद होगी। उदाहरण सी और सी + + सी और सी + + प्रोग्रामिंग भाषाओं में, उप-कार्यक्रमों को कार्य कहा जाता है (आगे किसी वर्ग से जुड़े होने पर सदस्य कार्य के रूप में वर्गीकृत किया जाता है, या नहीं होने पर मुक्त कार्य)। ये भाषाएँ विशेष मुख्य शब्द शून्य का उपयोग यह इंगित करने के लिए करती हैं कि कोई फ़ंक्शन कोई मूल्य नहीं देता है। ध्यान दें कि सी/सी + + कार्यों के दुष्प्रभाव हो सकते हैं, जिसमें किसी भी चर को संशोधित करना शामिल है जिसके पते मापदंडों के रूप में पारित किए जाते हैं। उदाहरण के लिएः शून्य फ़ंक्शन 1 () {/* कुछ कोड */} फ़ंक्शन एक मान नहीं लौटाता है और इसे एक स्टैंड-अलोन फ़ंक्शन के रूप में बुलाया जाना चाहिए, उदाहरण के लिए, फ़ंक्शन 1 (); इंट फ़ंक्शन 2 () {रिटर्न 5;} यह फ़ंक्शन एक परिणाम देता है (संख्या 5), और कॉल एक अभिव्यक्ति का हिस्सा हो सकता है, उदाहरण के लिए, x + फ़ंक्शन 2 () चार फ़ंक्शन 3 (इंट संख्या) {चार चयन [] = {'S', 'M', 'T', 'W', 'T', 'F', 'S', 'रिटर्न चयन [संख्या];} यह फ़ंक्शन 0 और 6 के बीच की संख्या को प्रारंभिक अक्षर में परिवर्तित करता है। इसे कॉल करने का परिणाम एक चर को सौंपा जा सकता है, उदाहरण के लिए, num _ दिन = फ़ंक्शन 3 (संख्या);। शून्य फ़ंक्शन 4 (int * pointer _ to _ ver) {(* pointer _ to _ ver) + +;} यह फ़ंक्शन एक मान नहीं देता है, लेकिन उस चर को संशोधित करता है जिसका पता पैरामीटर के रूप में पारित किया जाता है; इसे फ़ंक्शन 4 (& चर _ से _ वृद्धि) के साथ बुलाया जाएगा। बेसिक बोलियाँ माइक्रोसॉफ्ट स्मॉल बेसिक एक्साम्पल () 'सबरूटीन सब एक्साम्पल को कॉल करता है' सबरूटीन TextWindow.WriteLine से शुरू होता है ("यह माइक्रोसॉफ्ट स्मॉल बेसिक में सबरूटीन का एक उदाहरण है।") 'सबरूटीन एंडसब क्या करता है' सबरूटीन को समाप्त करता है उपरोक्त उदाहरण में, उदाहरण () सबरूटीन को कॉल करता है। वास्तविक सबरूटीन को परिभाषित करने के लिए, सब का उपयोग किया जाना चाहिए, सब के बाद सबरूटीन नाम के साथ। सामग्री का पालन करने के बाद, एंडसब टाइप किया जाना चाहिए। विजुअल बेसिक (क्लासिक) विजुअल बेसिक (क्लासिक) भाषा में, उप-कार्यक्रमों को कार्य या उप (या एक वर्ग के साथ जुड़े होने पर तरीके) कहा जाता है। विजुअल बेसिक 6 विभिन्न शब्दों का उपयोग करता है जिन्हें प्रकार कहा जाता है यह परिभाषित करने के लिए कि एक पैरामीटर के रूप में क्या पारित किया जा रहा है। डिफ़ॉल्ट रूप से, एक अनिर्दिष्ट चर एक प्रकार के रूप में पंजीकृत होता है और इसे बायरेफ़ (डिफ़ॉल्ट) या बायवाल के रूप में पारित किया जा सकता है। इसके अलावा, जब कोई कार्य या उप घोषित किया जाता है, तो उसे एक सार्वजनिक, निजी या मित्र पदनाम दिया जाता है, जो यह निर्धारित करता है कि क्या इसे उस मॉड्यूल या परियोजना के बाहर एक्सेस किया जा सकता है जिसमें इसे घोषित किया गया था। मूल्य द्वारा [बायवल]-पते को पारित करने के बजाय, मूल्य की एक प्रति पारित करके एक प्रक्रिया के लिए एक तर्क के मूल्य को पारित करने का एक तरीका। नतीजतन, चर के वास्तविक मूल्य को उस प्रक्रिया से नहीं बदला जा सकता है जिस पर इसे पारित किया जाता है। संदर्भ द्वारा [बायरेफ]-एक तर्क के मूल्य को उसके मूल्य की एक प्रति को पारित करने के बजाय, चर के पते को पारित करके एक प्रक्रिया को पारित करने का एक तरीका। यह प्रक्रिया को वास्तविक चर तक पहुँचने की अनुमति देता है। नतीजतन, चर का वास्तविक मूल्य उस प्रक्रिया द्वारा बदला जा सकता है जिस पर इसे पारित किया जाता है। जब तक कि अन्यथा निर्दिष्ट नहीं किया जाता है, तर्क संदर्भ द्वारा पारित किए जाते हैं। सार्वजनिक (वैकल्पिक)-इंगित करता है कि कार्य प्रक्रिया सभी मॉड्यूल में अन्य सभी प्रक्रियाओं के लिए सुलभ है। यदि एक मॉड्यूल में उपयोग किया जाता है जिसमें एक विकल्प निजी होता है, तो प्रक्रिया परियोजना के बाहर उपलब्ध नहीं है। निजी (वैकल्पिक)-इंगित करता है कि कार्य प्रक्रिया केवल उस मॉड्यूल में अन्य प्रक्रियाओं के लिए सुलभ है जहां इसे घोषित किया गया है। मित्र (वैकल्पिक)-केवल एक वर्ग मॉड्यूल में उपयोग किया जाता है। यह इंगित करता है कि कार्य प्रक्रिया पूरी परियोजना में दिखाई देती है, लेकिन किसी वस्तु के उदाहरण के नियंत्रक को दिखाई नहीं देती है। प्राइवेट फंक्शन फंक्शन 1 () 'कुछ कोड यहाँ एंड फंक्शन फ़ंक्शन एक मान नहीं लौटाता है और इसे एक स्टैंड-अलोन फ़ंक्शन के रूप में बुलाया जाना चाहिए, उदाहरण के लिए, फ़ंक्शन 1 प्राइवेट फ़ंक्शन फ़ंक्शन 2 () पूर्णांक फ़ंक्शन 2 = 5 एंड फ़ंक्शन के रूप में यह फ़ंक्शन एक परिणाम (संख्या 5) देता है, और कॉल एक अभिव्यक्ति का हिस्सा हो सकता है, उदाहरण के लिए, x + फ़ंक्शन 2 () प्राइवेट फ़ंक्शन फ़ंक्शन 3 (पूर्णांक के रूप में byVal intValue) के रूप में स्ट्रिंग डिम स्ट्रैएरे (6) के रूप में स्ट्रिंग स्ट्रैएरे = ऐरे ("M", "T", "W", "T", "F", "S")। इसे कॉल करने का परिणाम एक चर को सौंपा जा सकता है, उदाहरण के लिए, num _ दिन = फ़ंक्शन 3 (संख्या)। निजी फ़ंक्शन फ़ंक्शन 4 (पूर्णांक के रूप में बायरेफ़ इंटवैल्यू) इंटवैल्यू = इंटवैल्यू + 1 एंड फ़ंक्शन यह फ़ंक्शन एक मान नहीं देता है, लेकिन उस चर को संशोधित करता है जिसका पता पैरामीटर के रूप में पारित किया जाता है; इसे "फ़ंक्शन 4 (चर से वृद्धि)" के साथ बुलाया जाएगा। पी. एल./आई. पी. एल./आई. में एक तथाकथित प्रक्रिया को तर्क के बारे में जानकारी प्रदान करने वाले डिस्क्रिप्टर को पारित किया जा सकता है, जैसे कि स्ट्रिंग की लंबाई और सरणी सीमा। यह प्रक्रिया को अधिक सामान्य बनाने की अनुमति देता है और प्रोग्रामर को ऐसी जानकारी देने की आवश्यकता को समाप्त करता है। डिफ़ॉल्ट रूप से पी. एल./आई. संदर्भ द्वारा तर्क पारित करता है। द्वि-आयामी सरणी के प्रत्येक तत्व के संकेत को बदलने के लिए एक (तुच्छ) फ़ंक्शन इस तरह दिख सकता हैः चेंज _ साइनः प्रक्रिया (सरणी); डिक्लेयर सरणी (*, *) फ्लोट; सरणी =-सरणी; एंड चेंज _ साइन; इसे विभिन्न सरणी के साथ इस प्रकार कहा जा सकता हैः/* पहली सरणी सीमा-5 से + 10 और 3 से 9 */डिक्लेयर सरणी 1 (-5:10,3:9) फ्लोट;/* दूसरी सरणी सीमा 1 से 16 और 1 से 16 */डिक्लेयर सरणी 2 (16,16) फ्लोट कॉल चेंज _ साइन (सरणी 1); कॉल चेंज _ साइन (सरणी 2); पायथन में पायथन, मुख्य शब्द डिफ का उपयोग एक फ़ंक्शन को परिभाषित करने के लिए किया जाता है। फलन के मुख्य भाग को बनाने वाले कथनों को या तो उसी रेखा पर जारी रहना चाहिए या अगली पंक्ति से शुरू होना चाहिए और इंडेंट किया जाना चाहिए। निम्नलिखित उदाहरण प्रोग्राम "हैलो वर्ल्ड!" प्रिंट करता है। "विकिपीडिया" के बाद अगले line.def सिंपल _ फंक्शन (): प्रिंट ('हैलो वर्ल्ड!') प्रिंट ('विकिपीडिया') सिंपल _ फंक्शन () #आउटपुट होगाः हैलो वर्ल्ड! विकिपीडिया डेफ फंक (नाम) प्रिंट ("स्वागत" + नाम) प्रिंट (फंक ("मार्टिन"))) #output होगाः वेलकम मार्टिन स्थानीय चर, पुनरावृत्ति और पुनः प्रवेश एक उप-कार्यक्रम को एक निश्चित मात्रा में खरोंच स्थान का उपयोग करने के लिए उपयोगी लग सकता है; यानी, मध्यवर्ती परिणामों को रखने के लिए उस उप-कार्यक्रम के निष्पादन के दौरान उपयोग की जाने वाली स्मृति। इस खरोंच स्थान में संग्रहीत चर को स्थानीय चर कहा जाता है, और खरोंच स्थान को सक्रियण रिकॉर्ड कहा जाता है। एक सक्रियण अभिलेख में आम तौर पर एक वापसी पता होता है जो यह बताता है कि उप-कार्यक्रम समाप्त होने पर नियंत्रण को वापस कहाँ भेजना है। एक उप-कार्यक्रम में कॉल साइटों की कोई भी संख्या और प्रकृति हो सकती है। यदि पुनरावृत्ति समर्थित है, तो एक उप-कार्यक्रम खुद को कॉल भी कर सकता है, जिससे इसका निष्पादन निलंबित हो जाता है, जबकि उसी उप-कार्यक्रम का एक और नेस्टेड निष्पादन होता है। कुछ जटिल एल्गोरिदम को सरल बनाने और जटिल समस्याओं को तोड़ने के लिए पुनरावृत्ति एक उपयोगी साधन है। आवर्ती भाषाएँ आम तौर पर प्रत्येक कॉल पर स्थानीय चर की एक नई प्रति प्रदान करती हैं। यदि प्रोग्रामर चाहता है कि कॉल के बीच स्थानीय चर का मूल्य समान रहे, तो उन्हें कुछ भाषाओं में स्थिर घोषित किया जा सकता है, या वैश्विक मूल्यों या सामान्य क्षेत्रों का उपयोग किया जा सकता है। यहाँ फिबोनाची संख्याओं को खोजने के लिए सी/सी + + में एक पुनरावर्ती फलन का एक उदाहरण दिया गया हैः इंट फाइब (इंट एन) {यदि (एन <= 1) {रिटर्न एन;} रिटर्न फाइब (एन-1) + फाइब (एन-2);} फोरट्रान जैसी प्रारंभिक भाषाओं ने शुरू में पुनरावृत्ति का समर्थन नहीं किया क्योंकि चर को स्थिर रूप से आवंटित किया गया था, साथ ही साथ वापसी पते के लिए स्थान भी। प्रारंभिक कंप्यूटर निर्देश सेट ने एक ढेर पर वापसी पते और चर को संग्रहीत करना मुश्किल बना दिया। सूचकांक रजिस्टर या सामान्य-उद्देश्य रजिस्टर वाली मशीनें, जैसे सी. डी. सी. 6000 श्रृंखला, पी. डी. पी.-6, जी. ई. 635, सिस्टम/360, यू. एन. आई. वी. ए. सी. 1100 श्रृंखला, उन रजिस्टरों में से एक का उपयोग ढेर सूचक के रूप में कर सकती हैं। एएलजीओएल के बाद की आधुनिक भाषाएँ जैसे पीएल/आई और सी लगभग हमेशा एक ढेर का उपयोग करती हैं, जो आमतौर पर अधिकांश आधुनिक कंप्यूटर निर्देश सेटों द्वारा समर्थित होती हैं ताकि एक उप-कार्यक्रम के प्रत्येक निष्पादन के लिए एक नया सक्रियण रिकॉर्ड प्रदान किया जा सके। इस तरह, नेस्टेड निष्पादन प्रगति पर अन्य निलंबित निष्पादन पर प्रभाव की चिंता किए बिना अपने स्थानीय चर को संशोधित करने के लिए स्वतंत्र है। जैसे-जैसे नेस्टेड कॉल जमा होते हैं, एक कॉल स्टैक संरचना बनती है, जिसमें प्रत्येक निलंबित उप-कार्यक्रम के लिए एक सक्रियण रिकॉर्ड होता है। वास्तव में, यह स्टैक संरचना लगभग सर्वव्यापी है, और इसलिए सक्रियण रिकॉर्ड को आमतौर पर स्टैक फ्रेम कहा जाता है। कुछ भाषाएँ जैसे पास्कल, पी. एल./आई. और ए. डी. ए. भी नेस्टेड फ़ंक्शंस का समर्थन करती हैं, जो केवल बाहरी (मूल) फ़ंक्शंस के दायरे में कॉल करने योग्य फ़ंक्शंस हैं। आंतरिक कार्यों में बाहरी कार्य के स्थानीय चर तक पहुंच होती है जो उन्हें कहते हैं। यह सक्रियण रिकॉर्ड के भीतर अतिरिक्त संदर्भ जानकारी को संग्रहीत करके पूरा किया जाता है, जिसे प्रदर्शन भी कहा जाता है। यदि किसी उप-कार्यक्रम को ठीक से निष्पादित किया जा सकता है, तब भी जब उसी उप-कार्यक्रम का दूसरा निष्पादन पहले से ही प्रगति पर है, तो उस उप-कार्यक्रम को पुनःप्रवेशक कहा जाता है। एक पुनरावर्ती उप-कार्यक्रम पुनः प्रवेशक होना चाहिए। पुनः प्रवेशक उप-कार्यक्रम बहु-थ्रेडेड स्थितियों में भी उपयोगी होते हैं क्योंकि कई धागे एक दूसरे के साथ हस्तक्षेप करने के डर के बिना एक ही उप-कार्यक्रम को कॉल कर सकते हैं। आई. बी. एम. सी. आई. सी. एस. लेनदेन प्रसंस्करण प्रणाली में, अर्ध-प्रवेशक थोड़ा कम प्रतिबंधात्मक था, लेकिन कई धागे द्वारा साझा किए गए अनुप्रयोग कार्यक्रमों के लिए समान आवश्यकता थी। प्रबल रूप से टाइप की गई भाषाओं में, कभी-कभी एक ही नाम के साथ कई कार्य होना वांछनीय होता है, लेकिन विभिन्न प्रकार के डेटा पर या विभिन्न पैरामीटर प्रोफाइल के साथ काम करना। उदाहरण के लिए, एक वर्गमूल फलन को वास्तविक, जटिल मूल्यों या मैट्रिक्स पर काम करने के लिए परिभाषित किया जा सकता है। प्रत्येक मामले में उपयोग किया जाने वाला एल्गोरिदम अलग-अलग होता है, और वापसी का परिणाम अलग-अलग हो सकता है। एक ही नाम के साथ तीन अलग-अलग कार्य लिखने से, प्रोग्रामर को प्रत्येक प्रकार के डेटा के लिए अलग-अलग नाम याद रखने की सुविधा नहीं होती है। इसके अलावा, यदि एक उपप्रकार को वास्तविक के लिए परिभाषित किया जा सकता है, सकारात्मक और नकारात्मक वास्तविक को अलग करने के लिए, वास्तविक के लिए दो कार्य लिखे जा सकते हैं, एक वास्तविक को वापस करने के लिए जब पैरामीटर सकारात्मक हो, और दूसरा एक जटिल मूल्य को वापस करने के लिए जब पैरामीटर नकारात्मक हो। ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में, जब एक ही नाम के साथ कार्यों की एक श्रृंखला विभिन्न प्रकार के विभिन्न पैरामीटर प्रोफाइल या मापदंडों को स्वीकार कर सकती है, तो प्रत्येक कार्य को अधिभारित कहा जाता है। यहाँ सी + + में फ़ंक्शन ओवरलोडिंग का एक उदाहरण है, जो एक ही नाम (क्षेत्र) के साथ दो कार्यों के कार्यान्वयन को प्रदर्शित करता है, लेकिन अलग-अलग मापदंडः #include <आईओस्ट्रीम> डबल क्षेत्र (डबल एच, डबल डब्ल्यू) {रिटर्न एच * डब्ल्यू;}/* पहला क्षेत्र कार्य एक आयत के क्षेत्र को खोजने के लिए है, * इसलिए यह ऊंचाई और चौड़ाई के लिए दो संख्याओं को मापदंडों के रूप में स्वीकार करता है। */डबल एरिया (डबल आर) {रिटर्न आर * आर * 3.14;}/* दूसरा एरिया फ़ंक्शन एक वृत्त के क्षेत्र को खोजने के लिए है, इसलिए यह त्रिज्या के लिए केवल एक संख्या को एक पैरामीटर के रूप में स्वीकार करता है। */इंट मेन () {डबल रेक्टैंगल _ एरिया = एरिया (3,4);// यह पहले एरिया फंक्शन को कॉल करता है, क्योंकि दो पैरामीटर प्रदान किए गए हैं। डबल सर्कल _ एरिया = एरिया (5);// यह दूसरा एरिया फंक्शन कहता है, क्योंकि केवल एक पैरामीटर प्रदान किया गया है। std:: cout <<"एक आयत का क्षेत्रफल है" <<रेक्टैंगल _ एरिया <<std:: एंडल; std:: cout <<"एक वृत्त का क्षेत्रफल है" <<सर्कल _ एरिया <<std:: एंडल;} एक अन्य उदाहरण के रूप में, एक फ़ंक्शन एक ऐसी वस्तु का निर्माण कर सकता है जो दिशाओं को स्वीकार करेगा, और स्क्रीन पर इन बिंदुओं के लिए अपने मार्ग का पता लगाएगा। ऐसे कई मापदंड हैं जिन्हें निर्माणकर्ता (निशान का रंग, x और y निर्देशांक शुरू करना, निशान गति) में पारित किया जा सकता है। यदि प्रोग्रामर चाहता था कि कंस्ट्रक्टर केवल रंग पैरामीटर को स्वीकार करने में सक्षम हो, तो वह एक अन्य कंस्ट्रक्टर को कॉल कर सकता था जो केवल रंग को स्वीकार करता है, जो बदले में सभी अन्य मापदंडों के लिए डिफ़ॉल्ट मानों के एक सेट में गुजरने वाले सभी मापदंडों के साथ कंस्ट्रक्टर को कॉल करता है (X और Y आम तौर पर स्क्रीन पर केंद्रित होते हैं या मूल पर रखे जाते हैं, और गति कोडर के चयन के दूसरे मूल्य पर सेट किया जाता है)। पी. एल./आई. में विभिन्न प्रकार के तर्कों के साथ बुलाए जाने वाले प्रविष्टि संदर्भों के एक समूह के लिए एक सामान्य नाम को परिभाषित करने के लिए सामान्य विशेषता है। उदाहरण-डिक्लेयर जेन _ नेम जेनरिक (नाम व्हेन (फिक्स्ड बाइनेरी), फ्लेम व्हेन (फ्लोट), पथनाम अन्य); प्रत्येक प्रविष्टि के लिए कई तर्क परिभाषाएँ निर्दिष्ट की जा सकती हैं। "जीन _ नेम" पर कॉल के परिणामस्वरूप "नाम" पर कॉल होगा जब तर्क तय किया जाएगा, "फ्लेम" जब फ्लोट ", आदि। यदि तर्क किसी भी विकल्प से मेल नहीं खाता है तो "पथनाम" नहीं कहा जाएगा। एक समापन एक उप-कार्यक्रम है जिसमें इसके कुछ चरों के मूल्यों को उस वातावरण से लिया जाता है जिसमें इसे बनाया गया था। बंद करना लिस्प प्रोग्रामिंग भाषा की एक उल्लेखनीय विशेषता थी, जिसे जॉन मैकार्थी द्वारा पेश किया गया था। कार्यान्वयन के आधार पर, बंद करना दुष्प्रभावों के लिए एक तंत्र के रूप में काम कर सकता है। कन्वेंशन फंक्शन कोडिंग के लिए कई कन्वेंशन विकसित किए गए हैं। उनके नामकरण से संबंधित, कई डेवलपर्स ने इस दृष्टिकोण को अपनाया है कि एक फ़ंक्शन का नाम एक निश्चित कार्य करने पर एक क्रिया होना चाहिए, एक विशेषण जब यह कुछ पूछताछ करता है, और एक संज्ञा जब इसका उपयोग चर को प्रतिस्थापित करने के लिए किया जाता है। कुछ प्रोग्रामरों का सुझाव है कि एक फ़ंक्शन को केवल एक कार्य करना चाहिए, और यदि एक फ़ंक्शन एक से अधिक कार्य करता है, तो इसे अधिक कार्यों में विभाजित किया जाना चाहिए। उनका तर्क है कि कार्य कोड रखरखाव में प्रमुख घटक हैं, और कार्यक्रम में उनकी भूमिकाएं अलग-अलग होनी चाहिए। मॉड्यूलर प्रोग्रामिंग (मॉड्यूलराइजिंग कोड) के समर्थक इस बात की वकालत करते हैं कि प्रत्येक कार्य में कोड के अन्य हिस्सों पर न्यूनतम निर्भरता होनी चाहिए। उदाहरण के लिए, वैश्विक चर का उपयोग आम तौर पर इस परिप्रेक्ष्य के लिए अधिवक्ताओं द्वारा मूर्खतापूर्ण माना जाता है, क्योंकि यह कार्य और इन वैश्विक चर के बीच तंग युग्मन जोड़ता है। यदि इस तरह का युग्मन आवश्यक नहीं है, तो उनकी सलाह है कि इसके बजाय पारित मापदंडों को स्वीकार करने के लिए रिफैक्टर कार्य करें। हालांकि, कार्यों को पारित मापदंडों की संख्या में वृद्धि कोड पठनीयता को प्रभावित कर सकती है। अपने मुख्य या सामान्य प्रभाव के अलावा, एक सबरूटीन को कॉलिंग प्रोग्राम को असाधारण स्थितियों के बारे में सूचित करने की आवश्यकता हो सकती है जो इसके निष्पादन के दौरान हुई हो सकती हैं। कुछ भाषाओं और प्रोग्रामिंग मानकों में, यह अक्सर एक वापसी कोड के माध्यम से किया जाता है, जो कुछ मानक स्थान पर उप-प्रोग्राम द्वारा रखा गया एक पूर्णांक मान है, जो सामान्य और असाधारण स्थितियों को कूटबद्ध करता है। आई. बी. एम. सिस्टम/360 में, जहां सबरूटीन से वापसी कोड की उम्मीद की जाती थी, वापसी मूल्य को अक्सर 4 के गुणक के रूप में डिज़ाइन किया गया था-ताकि इसका उपयोग शाखा तालिका में सीधे शाखा तालिका सूचकांक के रूप में किया जा सके जो अक्सर कॉल निर्देश के तुरंत बाद स्थित होता है ताकि अतिरिक्त सशर्त परीक्षणों से बचा जा सके, जिससे दक्षता में और सुधार हो सके। सिस्टम/360 असेंबली लैंग्वेज में, कोई लिख सकता है, उदाहरण के लिएः BAL 14, SUBRTN01 एक सबरूटीन पर जाएं, R14 B टेबल में वापसी पते को संग्रहीत करें (15) शाखा तालिका को अनुक्रमित करने के लिए विनियमन 15 में वापस किए गए मूल्य का उपयोग करें, * उपयुक्त शाखा अनुभाग में शाखा करें। टेबल बी ओके रिटर्न कोड = 00 गुड} बी बैड रिटर्न कोड = 04 अमान्य इनपुट} ब्रांच टेबल बी एरर रिटर्न कोड = 08 अप्रत्याशित स्थिति} फंक्शन कॉल का अनुकूलन किसी फंक्शन को कॉल करने में एक महत्वपूर्ण रनटाइम ओवरहेड होता है, जिसमें आर्ग्यूमेंट्स को पास करना, सबप्रोग्राम पर ब्रांच करना और कॉलर को वापस ब्रांच करना शामिल है। ओवरहेड में अक्सर कुछ प्रोसेसर रजिस्टरों को सहेजना और पुनर्स्थापित करना, कॉल फ्रेम भंडारण को आवंटित करना और पुनः प्राप्त करना आदि शामिल होते हैं। कुछ भाषाओं में, प्रत्येक फ़ंक्शन कॉल का अर्थ फ़ंक्शन के रिटर्न कोड का स्वचालित परीक्षण या अपवादों को संभालना भी है जो यह उठा सकता है। ऑब्जेक्ट-ओरिएंटेड भाषाओं में ओवरहेड का एक महत्वपूर्ण स्रोत मेथड कॉल के लिए गहन रूप से उपयोग किया जाने वाला डायनेमिक डिस्पैच है। प्रक्रिया कॉल के कुछ स्पष्ट रूप से स्पष्ट अनुकूलन हैं जिन्हें लागू नहीं किया जा सकता है यदि प्रक्रियाओं के दुष्प्रभाव हो सकते हैं। उदाहरण के लिए, अभिव्यक्ति (f (x)-1)/(f (x) + 1) में, फलन f को दो बार कॉल किया जाना चाहिए, क्योंकि दोनों कॉल अलग-अलग परिणाम दे सकते हैं। इसके अलावा, कुछ भाषाओं में जो विभाजन प्रचालक के संचालन के मूल्यांकन के क्रम को परिभाषित करती हैं, x का मान दूसरी कॉल से पहले फिर से प्राप्त किया जाना चाहिए, क्योंकि पहली कॉल ने इसे बदल दिया होगा। यह निर्धारित करना कि क्या एक उप-कार्यक्रम का कोई दुष्प्रभाव हो सकता है, बहुत कठिन है (वास्तव में, राइस के प्रमेय के आधार पर अनिश्चित)। इसलिए, जबकि वे अनुकूलन विशुद्ध रूप से कार्यात्मक प्रोग्रामिंग भाषाओं में सुरक्षित हैं, विशिष्ट अनिवार्य प्रोग्रामिंग के संकलकों को आमतौर पर सबसे खराब मान लेना पड़ता है। इनलाइनिंग इस ओवरहेड को समाप्त करने के लिए उपयोग की जाने वाली एक विधि प्रत्येक कॉल साइट पर उप-कार्यक्रम के मुख्य भाग का इनलाइन विस्तार या इनलाइनिंग है (बनाम कार्य और पीछे की ओर शाखा बनाना)। यह न केवल कॉल ओवरहेड से बचाता है, बल्कि यह संकलक को उस कॉल के संदर्भ और तर्कों को ध्यान में रखते हुए प्रक्रिया के मुख्य भाग को अधिक प्रभावी ढंग से अनुकूलित करने की भी अनुमति देता है। अंतःस्थापित शरीर को संकलक द्वारा अनुकूलित किया जा सकता है। हालाँकि, इनलाइनिंग आमतौर पर कोड के आकार को बढ़ा देगी, जब तक कि प्रोग्राम में फ़ंक्शन के लिए केवल एक कॉल न हो। एसिंक्रोनस प्रोसीजर कॉल, एक उप-प्रोग्राम जिसे इसके मापदंडों के बाद बुलाया जाता है, अन्य गतिविधियों द्वारा सेट किया जाता है बिल्ट-इन फ़ंक्शन कमांड-क्वेरी सेपरेशन (सीक्यूएस) कम्पाउंड ऑपरेशन कोरोटिन्स, उप-प्रोग्राम जो एक-दूसरे को कॉल करते हैं जैसे कि दोनों मुख्य प्रोग्राम थे मूल्यांकन रणनीति इवेंट हैंडलर, एक उप-प्रोग्राम जिसे एक इनपुट घटना या इंटरप्ट फ़ंक्शन के जवाब में बुलाया जाता है (गणित) कार्यात्मक प्रोग्रामिंग फ्यूज्ड ऑपरेशन लैम्ब्डा फ़ंक्शन (कंप्यूटर प्रोग्रामिंग), एक फ़ंक्शन जो एक पहचानकर्ता विधि (कंप्यूटर प्रोग्रामिंग) मॉड्यूलर प्रोग्रामिंग ऑपरेटर ओवरलोडिंग संरक्षित प्रक्रिया ट्रांसक्लूजन संदर्भ स्रोत कोड लेख उदाहरण के साथ सी कोड होलिस्म प्रोग्रामिंग निर्माण