कॉलबैक (कंप्यूटर प्रोग्रामिंग)

कंप्यूटर प्रोग्रामिंग में, कॉलबैक या कॉलबैक फ़ंक्शन निष्पाद्य कोड का कोई संदर्भ होता है जिसे तर्क (कंप्यूटर विज्ञान) के रूप में कोड के दूसरे भाग में पारित किया जाता है; उस कोड से अपने काम के भाग के रूप में कॉलबैक फ़ंक्शन को कॉल बैक (निष्पादित) करने की आशा होती हैं। यह निष्पादन एक तुल्यकालिक कॉलबैक के रूप में अति-शीघ्र हो सकता है, अथवा यह बाद के समय में अतुल्यकालिक कॉलबैक के रूप में हो सकता है। प्रोग्रामिंग भाषा विभिन्न प्रकारो से कॉलबैक का प्रमाणित करती हैं, प्रायः उन्हें सबरूटीन्स, लैम्ब्डा (प्रोग्रामिंग), एक्सप्रेशंस, ब्लॉक (प्रोग्रामिंग), या फ़ंक्शन पॉइंटर्स  के साथ क्रियान्वित करती हैं।

डिजाइन
कॉलबैक दो प्रकार के होते हैं, वे रनटाइम पर डेटा प्रवाह को नियंत्रित करने के प्रकारो से भिन्न होते हैं: ब्लॉकिंग कॉलबैक (जिसे सिंक्रोनस कॉलबैक या केवल कॉलबैक के रूप में भी जाना जाता है) और स्थगित कॉलबैक (जिसे एसिंक्रोनस कॉलबैक भी कहा जाता है)। फ़ंक्शन रिटर्न (जैसा कि नीचे 'सी' उदाहरण में) से पहले कॉलबैक को अवरुद्ध किया जाता है, फ़ंक्शन रिटर्न के बाद स्थगित कॉलबैक क्रियान्वित किए जा सकते हैं। स्थगित कॉलबैक का उपयोग प्रायः I/O संचालन या ईवेंट हैंडलिंग के संदर्भ में किया जाता है, और कई थ्रेड्स की स्थिति में इंटरप्ट्स याअलग थ्रेड द्वारा कॉल किया जाता है। उनकी प्रकृति के कारण, ब्लॉकिंग कॉलबैक बिना अवरोध या कई थ्रेड्स के काम कर सकते हैं, जिसका अर्थ है कि ब्लॉकिंग कॉलबैक का उपयोग साधारणतया सिंक्रोनाइज़ेशन के लिए या किसी अन्य थ्रेड को काम देने के लिए नहीं किया जाता है।

कॉलबैक का उपयोग विंडिंग सिस्टम में एप्लिकेशन को प्रोग्राम करने के लिए किया जाता है। इस स्थिति में, एप्लिकेशन ऑपरेटिंग सिस्टम को कॉल करने के लिए एक विशिष्ट कस्टम कॉलबैक फ़ंक्शन प्रदान करता है, जो माउस क्लिक या कुंजी प्रेस जैसी घटनाओं के उत्तर में इस विशिस्ट-एप्लीकेशन फ़ंक्शन को कॉल करता है। यहां एक प्रमुख कार्य विशेषाधिकार और सुरक्षा का प्रबंधन है: जबकि फ़ंक्शन को ऑपरेटिंग सिस्टम से कहा जाता है, इसे सिस्टम के समान पर्यवेक्षक मोड के साथ नहीं कार्य करना चाहिए। इस समस्या का समाधान सुरक्षा के रिंग (कंप्यूटर सुरक्षा) का उपयोग करना होता हैं।

कार्यान्वयन
कॉलबैक का रूप प्रोग्रामिंग भाषाओं में भिन्न होता है:


 * असेंबली में, C (प्रोग्रामिंग लैंग्वेज), C++, पास्कल (प्रोग्रामिंग भाषा), मॉड्युला 2 और इसी प्रकार की लैंग्वेज, एक मशीन-स्तर पॉइंटर से फंक्शन को दूसरे (इंटरनल या एक्सटर्नल) फंक्शन के तर्क के रूप में पारित किया जा सकता है। यह अधिकांश कंपाइलरों द्वारा समर्थित है और विशेष रैपर लाइब्रेरी अथवा कक्षाओं के बिना विभिन्न भाषाओं का एक साथ उपयोग करने का लाभ प्रदान करता है। इसका उदाहरण विंडोज एपीआई हो सकता है जो कई अलग-अलग भाषाओं, कंपाइलरों और असेंबलरों द्वारा सीधे (अधिक या कम) पहुंच योग्य है।
 * C++ ऑब्जेक्ट्स को फ़ंक्शन कॉल ऑपरेशन के अपने कार्यान्वयन को प्रदान करने की अनुमति देता है। मानक टेम्पलेट लाइब्रेरी इन ऑब्जेक्ट्स ( जिन्हे फँक्टर्स कहा जाता है), साथ ही साथ फ़ंक्शन पॉइंटर्स, विभिन्न पॉलिमॉर्फिक एल्गोरिदम के पैरामीटर के रूप में स्वीकार करती है।


 * कई डाइनेमिक भाषाएँ, जैसे कि जावास्क्रिप्ट, लुआ (प्रोग्रामिंग भाषा), पायथन (प्रोग्रामिंग लैंग्वेज), पर्ल और पीएचपी, साधारणतया फ़ंक्शन ऑब्जेक्ट को पारित करने की अनुमति दें।
 * सीएलआई भाषाओं की सूची सी # और वीबी.नेट टाइप-सेफ प्रदान करते हैं | टाइप-सेफ इनकैप्सुलेटिंग रेफरेंस, डेलिगेट (सीएलआई), अच्छी प्रकार से टाइप किए गए फ़ंक्शन पॉइंटर्स को परिभाषित करने के लिए प्रयुक्त होता हैं। इन्हें कॉलबैक के रूप में उपयोग किया जा सकता है।
 * ईवेंट और इवेंट संचालकों, जैसा कि .नेट भाषाओं में उपयोग किया जाता है, कॉलबैक के लिए सामान्यीकृत सिंटैक्स प्रदान करते हैं।
 * फंक्शनल भाषाएं साधारणतया प्रथम श्रेणी के फंक्शन का कार्य करती हैं, जिन्हें अन्य फंक्शन के लिए कॉलबैक के रूप में पारित किया जा सकता है, डेटा के रूप में संग्रहीत या फंक्शन से वापस किया जा सकता है।
 * कुछ भाषाएँ, जैसे अल्गोल 68, पर्ल, पायथन, रूबी (प्रोग्रामिंग भाषा), स्मॉलटॉक, C++11 और बाद में, C# और विबी. नेट के नए संस्करण और साथ ही अधिकांश कार्यात्मक भाषाएँ, कोड के अनाम ब्लॉक (लैम्ब्डा) की अनुमति देती हैं (प्रोग्रामिंग) कहीं और परिभाषित फंक्शन के संदर्भ के अतिरिक्त आपूर्ति की जाती हैं।
 * कुछ भाषाओं में, उदा. योजना (प्रोग्रामिंग भाषा), एमएल (प्रोग्रामिंग भाषा), जावास्क्रिप्ट, पर्ल, पायथन, स्मॉलटॉक, पीएचपी (5.3.0 से), C++11 और बाद में, Java (8 से), और कई अन्य, ऐसे फंक्शन क्लोजर (कंप्यूटर विज्ञान) हो सकते हैं, अर्थात वे उस संदर्भ में स्थानीय रूप से परिभाषित चर को एक्सेस और संशोधित कर सकते हैं जिसमें फ़ंक्शन परिभाषित किया गया था। ध्यान दें कि जावा, चुकी, स्थानीय चर को संलग्न घेरे में संशोधित नहीं कर सकता है।
 * ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग भाषा में फंक्शन-वैल्यू कथनो के बिना, जैसे जावा (प्रोग्रामिंग भाषा) में इसके 8 संस्करण से पहले, कॉलबैक को अमूर्त वर्ग या इंटरफ़ेस का एक उदाहरण पारित करके सिम्युलेटेड किया जा सकता है, जिसमें से रिसीवर एक या अधिक कॉल करेगा, जबकि कॉलिंग एंड एक ठोस कार्यान्वयन प्रदान करता है। ऐसी वस्तुएं प्रभावी रूप से कॉलबैक का गठा होती हैं, साथ ही डेटा में परिवर्तन करने की आवश्यकता होती है। वे विभिन्न डिज़ाइन पैटर्न (कंप्यूटर विज्ञान) जैसे विजिटर पैटर्न, पर्यवेक्षक पैटर्न और रणनीति पैटर्न को क्रियान्वित करने में उपयोगी होते हैं।

सी
कॉलबैक के उपयोग की एक विस्तृत विविधता है, उदाहरण के लिए त्रुटि संकेतन में: एक यूनिक्स प्रोग्राम SIGTERM प्राप्त होने पर तुरंत समाप्त नहीं करना चाहेगा, इसलिए यह सुनिश्चित करने के लिए कि इसकी समाप्ति को ठीक से संभाला जाता है, यह क्लीनअप फ़ंक्शन को कॉलबैक के रूप में पंजीकृत करेगा। कॉलबैक का उपयोग यह नियंत्रित करने के लिए भी किया जा सकता है कि कोई फ़ंक्शन कार्य करता है या नहीं: Xlib कस्टम विधेय को यह निर्धारित करने के लिए निर्दिष्ट करने की अनुमति देता है कि कोई प्रोग्राम किसी ईवेंट को संभालना चाहता है या नहीं।

निम्नलिखित सी (प्रोग्रामिंग भाषा) कोड दो संख्याओं को प्रदर्शित करने के लिए कॉलबैक के उपयोग को प्रदर्शित करता है।

उदाहरण आउटपुट:

और और 42 और 42

ध्यान दें कि यह कॉलबैक फ़ंक्शन के आउटपुट को कॉलिंग फ़ंक्शन, PrintTwoNumbers में पास करने से अलग कैसे है - समान मान को दो बार प्रिंट करने के बजाय, PrintTwoNumbers कॉलबैक को जितनी बार आवश्यकता हो उतनी बार कॉल करता है। यह कॉलबैक के दो मुख्य लाभों में से एक है।

अन्य लाभ यह है कि कॉलिंग फ़ंक्शन कॉल किए गए फ़ंक्शंस के लिए जो भी पैरामीटर चाहता है उसे पास कर सकता है (उपर्युक्त उदाहरण में नहीं दिखाया गया है)। यह जानकारी को छिपाने की सही अनुमति देता है: कॉलिंग फ़ंक्शन को कॉलबैक पास करने वाले कोड को फ़ंक्शन को पास किए जाने वाले पैरामीटर मानों को जानने की आवश्यकता नहीं होती है। अगर यह केवल रिटर्न वैल्यू पास करता है, तो पैरामीटर को सार्वजनिक रूप से उजागर करने की आवश्यकता होगी।

एक और उदाहरण:

संकलन के बाद आउटपुट:

इस जानकारी को छिपाने का अर्थ है कि कॉलबैक का उपयोग प्रक्रियाओं या थ्रेड्स के बीच या क्रमबद्ध संचार और सारणीबद्ध डेटा के माध्यम से संचार करते समय किया जा सकता है।

सी ++ में, सी में फ़ंक्शन पॉइंटर के उपयोग के साथ फ़ंक्शन ऑब्जेक्ट का भी आमतौर पर उपयोग किया जाता है।

सी #
सी शार्प (प्रोग्रामिंग लैंग्वेज) में एक साधारण कॉलबैक|सी#: <वाक्यविन्यास प्रकाश लैंग = सी #> सार्वजनिक वर्ग Class1 {   स्थैतिक शून्य मुख्य (स्ट्रिंग [] तर्क) {       कक्षा 2 सी 2 = नई कक्षा 2 ; /*       * पैरामीटर के रूप में कॉलबैक विधि के साथ क्लास 2 पर कॉलिंग विधि */       c2.Method (CallBackMethod); }

/*   * कॉलबैक विधि। यह विधि कॉलबैक में भेजी गई स्ट्रिंग को प्रिंट करती है */   स्थैतिक शून्य कॉलबैक विधि (स्ट्रिंग स्ट्र) {       कंसोल.राइटलाइन ($ कॉलबैक था: {str}); } }

सार्वजनिक वर्ग Class2 {   /*    * वह विधि जो कॉल करने वाले को वापस बुलाती है। पैरामीटर के रूप में एक क्रिया (विधि) लेता है */   सार्वजनिक शून्य विधि (कार्रवाई <स्ट्रिंग> कॉलबैक) {       /*        * निर्दिष्ट संदेश के साथ Class1 में विधि CallBackMet पर वापस कॉल करता है */       कॉलबैक (वापस भेजने के लिए संदेश); } } 

कोटलिन
कोटलिन (प्रोग्रामिंग भाषा) में एक साधारण कॉलबैक:

जावास्क्रिप्ट
कॉलबैक का उपयोग जावास्क्रिप्ट जैसी भाषाओं के कार्यान्वयन में किया जाता है, जिसमें js-ctypes के माध्यम से कॉलबैक के रूप में जावास्क्रिप्ट फ़ंक्शंस का समर्थन शामिल है। और जैसे घटकों में. हालाँकि, कॉलबैक का मूल उदाहरण बिना किसी जटिल कोड के लिखा जा सकता है:

पहले एक समारोह calculate को कॉलबैक के लिए लक्षित पैरामीटर के साथ परिभाषित किया गया है: callbackFunction. फिर एक फ़ंक्शन जिसे कॉलबैक के रूप में उपयोग किया जा सकता है calculate परिभाषित किया गया, calcProduct. अन्य कार्यों के लिए इस्तेमाल किया जा सकता है callbackFunction, पसंद calcSum. इस उदाहरण में, calculate को एक बार, दो बार लागू किया जाता है calcProduct कॉलबैक के रूप में और एक बार with calcSum. फ़ंक्शन क्रमशः उत्पाद और योग लौटाते हैं, और फिर अलर्ट उन्हें स्क्रीन पर प्रदर्शित करेगा।

इस आदिम उदाहरण में, कॉलबैक का उपयोग प्राथमिक रूप से सिद्धांत का प्रदर्शन है। कोई कॉलबैक को नियमित कार्यों के रूप में कॉल कर सकता है, calcProduct(num1, num2). कॉलबैक का उपयोग आम तौर पर तब किया जाता है जब फ़ंक्शन को कॉलबैक निष्पादित होने से पहले घटनाओं को निष्पादित करने की आवश्यकता होती है, या जब फ़ंक्शन में कार्य करने के लिए अर्थपूर्ण वापसी मान नहीं होते (या नहीं हो सकते), जैसा कि अजाक्स (प्रोग्रामिंग) (टाइमर पर आधारित) या XMLHttpRequest अनुरोध। उपयोगी उदाहरण जावास्क्रिप्ट पुस्तकालयों जैसे कि jQuery में पाए जा सकते हैं जहां विधि एक सरणी जैसी वस्तु पर पुनरावृति करती है, पहला तर्क कॉलबैक होता है जो प्रत्येक पुनरावृत्ति पर किया जाता है।

लाल और REBOL
उपरोक्त जावास्क्रिप्ट से, यहां बताया गया है कि आरईबीओएल या रेड (प्रोग्रामिंग भाषा) में इसे कैसे लागू किया जाएगा। कोड के रूप में डेटा की स्वच्छ प्रस्तुति पर ध्यान दें।


 * वापसी निहित है क्योंकि प्रत्येक फ़ंक्शन में कोड ब्लॉक की अंतिम पंक्ति है
 * जैसा कि अलर्ट के लिए एक स्ट्रिंग की आवश्यकता होती है, फ़ॉर्म गणना के परिणाम से एक स्ट्रिंग उत्पन्न करता है
 * प्राप्त शब्द! मान (यानी: कैल्क-उत्पाद और: कैल्क-सम) फ़ंक्शन के मूल्यांकन के बजाय फ़ंक्शन के कोड को वापस करने के लिए दुभाषिया को ट्रिगर करते हैं।
 * डेटा प्रकार! एक ब्लॉक में संदर्भ! [तैरना! पूर्णांक!] तर्कों के रूप में दिए गए मानों के प्रकार को प्रतिबंधित करें।

लुआ
Roblox इंजन का उपयोग करते हुए एक कलर ट्वीनिंग उदाहरण जो एक वैकल्पिक लेता है वापस कॉल करें:

पायथन
पायथन (और अन्य भाषाओं) में कॉलबैक का एक विशिष्ट उपयोग यूआई तत्वों को ईवेंट असाइन करना है।

यहाँ पायथन में कॉलबैक के उपयोग का एक बहुत ही तुच्छ उदाहरण है। पहले दो कार्यों, कॉलबैक और कॉलिंग कोड को परिभाषित करें, फिर कॉलबैक फ़ंक्शन को कॉलिंग कोड में पास करें।

जूलिया
जूलिया में कार्य प्रथम श्रेणी के नागरिक हैं, इसलिए उन्हें उस कार्य के शरीर के भीतर उपयोग किए जाने वाले (बुलाए जाने वाले) उच्च-स्तरीय कार्यों में आसानी से पारित किया जा सकता है।

यहाँ ऊपर जूलिया में एक ही उदाहरण:

यह भी देखें

 * कमांड पैटर्न
 * निरंतरता-गुजरने की शैली
 * इवेंट लूप
 * घटना-संचालित प्रोग्रामिंग
 * निहित आह्वान
 * नियंत्रण का उलटा
 * libsigc++, C++ के लिए एक कॉलबैक लाइब्रेरी
 * सिग्नल और स्लॉट
 * उपयोगकर्ता बाहर निकलें

बाहरी संबंध

 * Basic Instincts: Implementing Callback Notifications Using Delegates
 * Implement callback routines in Java
 * Implement Script Callback Framework in ASP.NET
 * Interfacing C++ member functions with C libraries (archived from the original on July 6, 2011)
 * Style Case Study #2: Generic Callbacks