कॉलबैक (कंप्यूटर प्रोग्रामिंग)
This article needs additional citations for verification. (September 2015) (Learn how and when to remove this template message) |
कंप्यूटर प्रोग्रामिंग में, कॉलबैक या कॉलबैक फ़ंक्शन निष्पाद्य कोड का कोई संदर्भ होता है जिसे तर्क (कंप्यूटर विज्ञान) के रूप में कोड के दूसरे भाग में पारित किया जाता है; उस कोड से अपने काम के भाग के रूप में कॉलबैक फ़ंक्शन को कॉल बैक (निष्पादित) करने की आशा होती हैं। यह निष्पादन एक तुल्यकालिक कॉलबैक के रूप में अति-शीघ्र हो सकता है, अथवा यह बाद के समय में अतुल्यकालिक कॉलबैक के रूप में हो सकता है। प्रोग्रामिंग भाषा विभिन्न प्रकारो से कॉलबैक का प्रमाणित करती हैं, प्रायः उन्हें सबरूटीन्स, लैम्ब्डा (प्रोग्रामिंग), एक्सप्रेशंस, ब्लॉक (प्रोग्रामिंग), याफ़ंक्शन पॉइंटर्स के साथ क्रियान्वित करती हैं।
डिजाइन
कॉलबैक दो प्रकार के होते हैं, वे रनटाइम पर डेटा प्रवाह को नियंत्रित करने के प्रकारो से भिन्न होते हैं: ब्लॉकिंग कॉलबैक (जिसे सिंक्रोनस कॉलबैक या केवल कॉलबैक के रूप में भी जाना जाता है) और स्थगित कॉलबैक (जिसे एसिंक्रोनस कॉलबैक भी कहा जाता है)। फ़ंक्शन रिटर्न (जैसा कि नीचे 'सी' उदाहरण में) से पहले कॉलबैक को अवरुद्ध किया जाता है, फ़ंक्शन रिटर्न के बाद स्थगित कॉलबैक क्रियान्वित किए जा सकते हैं। स्थगित कॉलबैक का उपयोग प्रायः I/O संचालन या ईवेंट हैंडलिंग के संदर्भ में किया जाता है, और कई थ्रेड्स की स्थिति में इंटरप्ट्स याअलग थ्रेड द्वारा कॉल किया जाता है। उनकी प्रकृति के कारण, ब्लॉकिंग कॉलबैक बिना अवरोध या कई थ्रेड्स के काम कर सकते हैं, जिसका अर्थ है कि ब्लॉकिंग कॉलबैक का उपयोग साधारणतया सिंक्रोनाइज़ेशन के लिए या किसी अन्य थ्रेड को काम देने के लिए नहीं किया जाता है।
कॉलबैक का उपयोग विंडिंग सिस्टम में एप्लिकेशन को प्रोग्राम करने के लिए किया जाता है। इस स्थिति में, एप्लिकेशन ऑपरेटिंग सिस्टम को कॉल करने के लिए एक विशिष्ट कस्टम कॉलबैक फ़ंक्शन प्रदान करता है, जो माउस क्लिक या कुंजी प्रेस जैसी घटनाओं के उत्तर में इस विशिस्ट-एप्लीकेशन फ़ंक्शन को कॉल करता है। यहां एक प्रमुख कार्य विशेषाधिकार और सुरक्षा का प्रबंधन है: जबकि फ़ंक्शन को ऑपरेटिंग सिस्टम से कहा जाता है, इसे सिस्टम के समान पर्यवेक्षक मोड के साथ नहीं कार्य करना चाहिए। इस समस्या का समाधान सुरक्षा के रिंग (कंप्यूटर सुरक्षा) का उपयोग करना होता हैं।
कार्यान्वयन
कॉलबैक का रूप प्रोग्रामिंग भाषाओं में भिन्न होता है:
- सभा की भाषा में, C (प्रोग्रामिंग लैंग्वेज), C++, पास्कल (प्रोग्रामिंग भाषा) , Modula2 और इसी तरह की लैंग्वेज, एक मशीन-लेवल समारोह सूचक टू फंक्शन को दूसरे (इंटरनल या एक्सटर्नल) फंक्शन के तर्क के रूप में पास किया जा सकता है। यह अधिकांश कंपाइलरों द्वारा समर्थित है और विशेष आवरण पुस्तकालयों या कक्षाओं के बिना विभिन्न भाषाओं का एक साथ उपयोग करने का लाभ प्रदान करता है। एक उदाहरण विंडोज एपीआई हो सकता है जो कई अलग-अलग भाषाओं, कंपाइलरों और असेंबलरों द्वारा सीधे (अधिक या कम) पहुंच योग्य है।
- सी ++ ऑब्जेक्ट्स को फ़ंक्शन कॉल ऑपरेशन के अपने कार्यान्वयन को प्रदान करने की अनुमति देता है। मानक टेम्पलेट लाइब्रेरी इन ऑब्जेक्ट्स (समारोह वस्तु कहा जाता है), साथ ही साथ फ़ंक्शन पॉइंटर्स, विभिन्न पॉलिमॉर्फिक एल्गोरिदम के पैरामीटर के रूप में स्वीकार करती है।
- कई गतिशील प्रोग्रामिंग भाषा, जैसे कि जावास्क्रिप्ट, लुआ (प्रोग्रामिंग भाषा) , पायथन (प्रोग्रामिंग लैंग्वेज), पर्ल[1][2] और PHP, बस एक फ़ंक्शन ऑब्जेक्ट को पारित करने की अनुमति दें।
- सीएलआई भाषाओं की सूची जैसे सी शार्प (प्रोग्रामिंग लैंग्वेज) | सी # और वीबी.नेट एक प्रकार की सुरक्षा प्रदान करते हैं | टाइप-सेफ इनकैप्सुलेटिंग रेफरेंस, एक डेलिगेट (सीएलआई), अच्छी तरह से टाइप किए गए फ़ंक्शन पॉइंटर्स को परिभाषित करने के लिए। इन्हें कॉलबैक के रूप में इस्तेमाल किया जा सकता है।
- ईवेंट और घटना संचालकों, जैसा कि .NET भाषाओं में उपयोग किया जाता है, कॉलबैक के लिए सामान्यीकृत सिंटैक्स प्रदान करते हैं।
- कार्यात्मक भाषाएं आम तौर पर प्रथम श्रेणी के कार्यों का समर्थन करती हैं, जिन्हें अन्य कार्यों के लिए कॉलबैक के रूप में पारित किया जा सकता है, डेटा के रूप में संग्रहीत या कार्यों से लौटाया जा सकता है।
- कुछ भाषाएँ, जैसे अल्गोल 68, पर्ल, पायथन, रूबी (प्रोग्रामिंग भाषा), स्मॉलटॉक, C++11 और बाद में, C# और VB.NET के नए संस्करण और साथ ही अधिकांश कार्यात्मक भाषाएँ, कोड के अनाम ब्लॉक (लैम्ब्डा) की अनुमति देती हैं (प्रोग्रामिंग)) कहीं और परिभाषित कार्यों के संदर्भ के बजाय आपूर्ति की जानी है।
- कुछ भाषाओं में, उदा. योजना (प्रोग्रामिंग भाषा), एमएल (प्रोग्रामिंग भाषा), जावास्क्रिप्ट, पर्ल, पायथन, स्मॉलटॉक, पीएचपी (5.3.0 से),[3] C++11 और बाद में, Java (8 से),[4] और कई अन्य, ऐसे कार्य क्लोजर (कंप्यूटर विज्ञान) हो सकते हैं, अर्थात वे उस संदर्भ में स्थानीय रूप से परिभाषित चर को एक्सेस और संशोधित कर सकते हैं जिसमें फ़ंक्शन परिभाषित किया गया था। ध्यान दें कि जावा, हालांकि, स्थानीय चर को संलग्न दायरे में संशोधित नहीं कर सकता है।
- ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग लैंग्वेज में फंक्शन-वैल्यू तर्कों के बिना, जैसे जावा (प्रोग्रामिंग भाषा) में इसके 8 संस्करण से पहले, कॉलबैक को एक अमूर्त वर्ग या इंटरफ़ेस का एक उदाहरण पास करके सिम्युलेटेड किया जा सकता है, जिसमें से रिसीवर एक या अधिक कॉल करेगा विधियाँ, जबकि कॉलिंग एंड एक ठोस कार्यान्वयन प्रदान करता है। ऐसी वस्तुएं प्रभावी रूप से कॉलबैक का एक बंडल होती हैं, साथ ही डेटा में हेरफेर करने की आवश्यकता होती है[clarification needed]. वे विभिन्न डिज़ाइन पैटर्न (कंप्यूटर विज्ञान) जैसे आगंतुक पैटर्न, पर्यवेक्षक पैटर्न और रणनीति पैटर्न को लागू करने में उपयोगी होते हैं।
प्रयोग करें
सी
कॉलबैक के उपयोग की एक विस्तृत विविधता है, उदाहरण के लिए त्रुटि संकेतन में: एक यूनिक्स प्रोग्राम SIGTERM प्राप्त होने पर तुरंत समाप्त नहीं करना चाहेगा, इसलिए यह सुनिश्चित करने के लिए कि इसकी समाप्ति को ठीक से संभाला जाता है, यह क्लीनअप फ़ंक्शन को कॉलबैक के रूप में पंजीकृत करेगा। कॉलबैक का उपयोग यह नियंत्रित करने के लिए भी किया जा सकता है कि कोई फ़ंक्शन कार्य करता है या नहीं: Xlib कस्टम विधेय को यह निर्धारित करने के लिए निर्दिष्ट करने की अनुमति देता है कि कोई प्रोग्राम किसी ईवेंट को संभालना चाहता है या नहीं।
निम्नलिखित सी (प्रोग्रामिंग भाषा) कोड दो संख्याओं को प्रदर्शित करने के लिए कॉलबैक के उपयोग को प्रदर्शित करता है।
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/* The calling function takes a single callback as a parameter. */
void PrintTwoNumbers(int (*numberSource)(void)) {
int val1 = numberSource();
int val2 = numberSource();
printf("%d and %d\n", val1, val2);
}
/* A possible callback */
int overNineThousand(void) {
return (rand()%1000) + 9001;
}
/* Another possible callback. */
int meaningOfLife(void) {
return 42;
}
/* Here we call PrintTwoNumbers() with three different callbacks. */
int main(void) {
time_t t;
srand((unsigned)time(&t)); // Init seed for random function
PrintTwoNumbers(&rand);
PrintTwoNumbers(&overNineThousand);
PrintTwoNumbers(&meaningOfLife);
return 0;
}
उदाहरण आउटपुट:
5893 और 7240 9094 और 9057
42 और 42
ध्यान दें कि यह कॉलबैक फ़ंक्शन के आउटपुट को कॉलिंग फ़ंक्शन, PrintTwoNumbers () में पास करने से अलग कैसे है - समान मान को दो बार प्रिंट करने के बजाय, PrintTwoNumbers कॉलबैक को जितनी बार आवश्यकता हो उतनी बार कॉल करता है। यह कॉलबैक के दो मुख्य लाभों में से एक है।
अन्य लाभ यह है कि कॉलिंग फ़ंक्शन कॉल किए गए फ़ंक्शंस के लिए जो भी पैरामीटर चाहता है उसे पास कर सकता है (उपर्युक्त उदाहरण में नहीं दिखाया गया है)। यह जानकारी को छिपाने की सही अनुमति देता है: कॉलिंग फ़ंक्शन को कॉलबैक पास करने वाले कोड को फ़ंक्शन को पास किए जाने वाले पैरामीटर मानों को जानने की आवश्यकता नहीं होती है। अगर यह केवल रिटर्न वैल्यू पास करता है, तो पैरामीटर को सार्वजनिक रूप से उजागर करने की आवश्यकता होगी।[example needed]
एक और उदाहरण:
/*
* This is a simple C program to demonstrate the usage of callbacks
* The callback function is in the same file as the calling code.
* The callback function can later be put into external library like
* e.g. a shared object to increase flexibility.
*
*/
#include <stdio.h>
#include <string.h>
typedef struct _MyMsg {
int appId;
char msgbody[32];
} MyMsg;
void myfunc(MyMsg *msg)
{
if (strlen(msg->msgbody) > 0 )
printf("App Id = %d \nMsg = %s \n",msg->appId, msg->msgbody);
else
printf("App Id = %d \nMsg = No Msg\n",msg->appId);
}
/*
* Prototype declaration
*/
void (*callback)(MyMsg *);
int main(void)
{
MyMsg msg1;
msg1.appId = 100;
strcpy(msg1.msgbody, "This is a test\n");
/*
* Assign the address of the function "myfunc" to the function
* pointer "callback" (may be also written as "callback = &myfunc;")
*/
callback = myfunc;
/*
* Call the function (may be also written as "(*callback)(&msg1);")
*/
callback(&msg1);
return 0;
}
संकलन के बाद आउटपुट:
$ gcc cbtest.c
$ ./a.out
App Id = 100
Msg = This is a test
इस जानकारी को छिपाने का अर्थ है कि कॉलबैक का उपयोग प्रक्रियाओं या थ्रेड्स के बीच या क्रमबद्ध संचार और सारणीबद्ध डेटा के माध्यम से संचार करते समय किया जा सकता है।[clarification needed]
सी ++ में, सी में फ़ंक्शन पॉइंटर के उपयोग के साथ फ़ंक्शन ऑब्जेक्ट का भी आमतौर पर उपयोग किया जाता है।
सी #
सी शार्प (प्रोग्रामिंग लैंग्वेज) में एक साधारण कॉलबैक|सी#: <वाक्यविन्यास प्रकाश लैंग = सी #> सार्वजनिक वर्ग Class1 {
स्थैतिक शून्य मुख्य (स्ट्रिंग [] तर्क)
{
कक्षा 2 सी 2 = नई कक्षा 2 ();
/*
* पैरामीटर के रूप में कॉलबैक विधि के साथ क्लास 2 पर कॉलिंग विधि
*/
c2.Method (CallBackMethod);
}
/*
* कॉलबैक विधि। यह विधि कॉलबैक में भेजी गई स्ट्रिंग को प्रिंट करती है
*/
स्थैतिक शून्य कॉलबैक विधि (स्ट्रिंग स्ट्र)
{
कंसोल.राइटलाइन ($ कॉलबैक था: {str});
}
}
सार्वजनिक वर्ग Class2 {
/*
* वह विधि जो कॉल करने वाले को वापस बुलाती है। पैरामीटर के रूप में एक क्रिया (विधि) लेता है
*/
सार्वजनिक शून्य विधि (कार्रवाई <स्ट्रिंग> कॉलबैक)
{
/*
* निर्दिष्ट संदेश के साथ Class1 में विधि CallBackMet पर वापस कॉल करता है
*/
कॉलबैक (वापस भेजने के लिए संदेश);
}
} </वाक्यविन्यास हाइलाइट>
कोटलिन
कोटलिन (प्रोग्रामिंग भाषा) में एक साधारण कॉलबैक:
fun main(){
print("Enter text: ")
val question = readLine()
answer(question, ::meaningOfLife)
}
fun meaningOfLife(): Int{
return 42
}
fun answer(question: String?, answer: () -> Int) {
println("Your question: $question")
println("Answer: ${answer()}")
}
जावास्क्रिप्ट
कॉलबैक का उपयोग जावास्क्रिप्ट जैसी भाषाओं के कार्यान्वयन में किया जाता है, जिसमें js-ctypes के माध्यम से कॉलबैक के रूप में जावास्क्रिप्ट फ़ंक्शंस का समर्थन शामिल है।[5] और जैसे घटकों में addEventListener.[6] हालाँकि, कॉलबैक का मूल उदाहरण बिना किसी जटिल कोड के लिखा जा सकता है:
function calculate(num1, num2, callbackFunction) {
return callbackFunction(num1, num2);
}
function calcProduct(num1, num2) {
return num1 * num2;
}
function calcSum(num1, num2) {
return num1 + num2;
}
// alerts 75, the product of 5 and 15
alert(calculate(5, 15, calcProduct));
// alerts 20, the sum of 5 and 15
alert(calculate(5, 15, calcSum));
पहले एक समारोह calculate को कॉलबैक के लिए लक्षित पैरामीटर के साथ परिभाषित किया गया है: callbackFunction. फिर एक फ़ंक्शन जिसे कॉलबैक के रूप में उपयोग किया जा सकता है calculate परिभाषित किया गया, calcProduct. अन्य कार्यों के लिए इस्तेमाल किया जा सकता है callbackFunction, पसंद calcSum. इस उदाहरण में, calculate() को एक बार, दो बार लागू किया जाता है calcProduct कॉलबैक के रूप में और एक बार with calcSum. फ़ंक्शन क्रमशः उत्पाद और योग लौटाते हैं, और फिर अलर्ट उन्हें स्क्रीन पर प्रदर्शित करेगा।
इस आदिम उदाहरण में, कॉलबैक का उपयोग प्राथमिक रूप से सिद्धांत का प्रदर्शन है। कोई कॉलबैक को नियमित कार्यों के रूप में कॉल कर सकता है, calcProduct(num1, num2). कॉलबैक का उपयोग आम तौर पर तब किया जाता है जब फ़ंक्शन को कॉलबैक निष्पादित होने से पहले घटनाओं को निष्पादित करने की आवश्यकता होती है, या जब फ़ंक्शन में कार्य करने के लिए अर्थपूर्ण वापसी मान नहीं होते (या नहीं हो सकते), जैसा कि अजाक्स (प्रोग्रामिंग) (टाइमर पर आधारित) या XMLHttpRequest अनुरोध। उपयोगी उदाहरण जावास्क्रिप्ट पुस्तकालयों जैसे कि jQuery में पाए जा सकते हैं जहां .each() विधि एक सरणी जैसी वस्तु पर पुनरावृति करती है, पहला तर्क कॉलबैक होता है जो प्रत्येक पुनरावृत्ति पर किया जाता है।
लाल और REBOL
उपरोक्त जावास्क्रिप्ट से, यहां बताया गया है कि आरईबीओएल या रेड (प्रोग्रामिंग भाषा) में इसे कैसे लागू किया जाएगा। कोड के रूप में डेटा की स्वच्छ प्रस्तुति पर ध्यान दें।
- वापसी निहित है क्योंकि प्रत्येक फ़ंक्शन में कोड ब्लॉक की अंतिम पंक्ति है
- जैसा कि अलर्ट के लिए एक स्ट्रिंग की आवश्यकता होती है, फ़ॉर्म गणना के परिणाम से एक स्ट्रिंग उत्पन्न करता है
- प्राप्त शब्द! मान (यानी: कैल्क-उत्पाद और: कैल्क-सम) फ़ंक्शन के मूल्यांकन के बजाय फ़ंक्शन के कोड को वापस करने के लिए दुभाषिया को ट्रिगर करते हैं।
- डेटा प्रकार! एक ब्लॉक में संदर्भ! [तैरना! पूर्णांक!] तर्कों के रूप में दिए गए मानों के प्रकार को प्रतिबंधित करें।
Red [Title: "Callback example"]
calculate: func [
num1 [number!]
num2 [number!]
callback-function [function!]
][
callback-function num1 num2
]
calc-product: func [
num1 [number!]
num2 [number!]
][
num1 * num2
]
calc-sum: func [
num1 [number!]
num2 [number!]
][
num1 + num2
]
; alerts 75, the product of 5 and 15
alert form calculate 5 15 :calc-product
; alerts 20, the sum of 5 and 15
alert form calculate 5 15 :calc-sum
लुआ
Roblox इंजन का उपयोग करते हुए एक कलर ट्वीनिंग उदाहरण जो एक वैकल्पिक लेता है .done वापस कॉल करें:
wait(1)
local DT = wait()
function tween_color(object, finish_color, fade_time)
local step_r = finish_color.r - object.BackgroundColor3.r
local step_g = finish_color.g - object.BackgroundColor3.g
local step_b = finish_color.b - object.BackgroundColor3.b
local total_steps = 1/(DT*(1/fade_time))
local completed;
coroutine.wrap(function()
for i = 0, 1, DT*(1 / fade_time) do
object.BackgroundColor3 = Color3.new (
object.BackgroundColor3.r + (step_r/total_steps),
object.BackgroundColor3.g + (step_g/total_steps),
object.BackgroundColor3.b + (step_b/total_steps)
)
wait()
end
if completed then
completed()
end
end)()
return {
done = function(callback)
completed = callback
end
}
end
tween_color(some_object, Color3.new(1, 0, 0), 1).done(function()
print "Color tweening finished!"
end)
पायथन
पायथन (और अन्य भाषाओं) में कॉलबैक का एक विशिष्ट उपयोग यूआई तत्वों को ईवेंट असाइन करना है।
यहाँ पायथन में कॉलबैक के उपयोग का एक बहुत ही तुच्छ उदाहरण है। पहले दो कार्यों, कॉलबैक और कॉलिंग कोड को परिभाषित करें, फिर कॉलबैक फ़ंक्शन को कॉलिंग कोड में पास करें।
>>> def get_square(val):
... """The callback."""
... return val ** 2
...
>>> def caller(func, val):
... return func(val)
...
>>> caller(get_square, 5)
25
जूलिया
जूलिया में कार्य प्रथम श्रेणी के नागरिक हैं, इसलिए उन्हें उस कार्य के शरीर के भीतर उपयोग किए जाने वाले (बुलाए जाने वाले) उच्च-स्तरीय कार्यों में आसानी से पारित किया जा सकता है।
यहाँ ऊपर जूलिया में एक ही उदाहरण:
julia> get_square(val) = val^2 # The callback
get_square (generic function with 1 method)
julia> caller(func,val) = func(val)
caller (generic function with 1 method)
julia> caller(get_square,5)
25
यह भी देखें
- कमांड पैटर्न
- निरंतरता-गुजरने की शैली
- इवेंट लूप
- घटना-संचालित प्रोग्रामिंग
- निहित आह्वान
- नियंत्रण का उलटा
- libsigc++, C++ के लिए एक कॉलबैक लाइब्रेरी
- सिग्नल और स्लॉट
- उपयोगकर्ता बाहर निकलें
संदर्भ
- ↑ "Perl Cookbook - 11.4. Taking References to Functions". 2 July 1999. Retrieved 2008-03-03.
- ↑ "Advanced Perl Programming - 4.2 Using Subroutine References". 2 July 1999. Retrieved 2008-03-03.
- ↑ "PHP भाषा संदर्भ - अनाम कार्य". Retrieved 2011-06-08.
- ↑ "What's New in JDK 8". oracle.com.
- ↑ Holley, Bobby; Shepherd, Eric (eds.). "कॉलबैक की घोषणा और उपयोग करना". Docs. Mozilla Developer Network (Documentation page) (in English). Archived from the original on 2019-01-17. Retrieved 2021-12-16.
- ↑ "घटकों में जावास्क्रिप्ट कॉलबैक बनाना". Archive. UDN Web Docs (Documentation page) (in English). sec. JavaScript functions as callbacks. Archived from the original on 2021-12-16. Retrieved 2021-12-16.