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

From Vigyanwiki
कॉलबैक प्रायः मूल कॉलर के स्तर पर वापस आ जाता है।

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

डिजाइन

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

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

कार्यान्वयन

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

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

प्रयोग

C

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

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

#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;
}

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

32467 और 3523

9644 और 9948

42 और 42

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

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

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

C#

C# (प्रोग्रामिंग लैंग्वेज) में एक साधारण कॉलबैक|

public class Class1 
{
    static void Main(string[] args)
    {
        Class2 c2 = new Class2();
        
        /*
        * Calling method on Class2 with callback method as parameter
        */
        c2.Method(CallBackMethod);
    }

    /*
    * The callback method. This method prints the string sent in the callback
    */
    static void CallBackMethod(string str)
    {
        Console.WriteLine($"Callback was: {str}");
    }
}

public class Class2
{
    /*
    * The method that calls back to the caller. Takes an action (method) as parameter
    */
    public void Method(Action<string> callback)
    {
        /*
        * Calls back to method CallBackMet in Class1 with the message specified
        */
        callback("The message to send back");
    }
}







कोटलिन

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

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()}")
}

जावास्क्रिप्ट

कॉलबैक का उपयोग जावास्क्रिप्ट जैसी भाषाओं के कार्यान्वयन में किया जाता है, जिसमें जेएस-सी टाइप्स  के माध्यम से कॉलबैक के रूप में जावास्क्रिप्ट फ़ंक्शंस और ऐड इवेंट लिस्नर जैसे घटकों में[5] क्रियान्वन सम्मलित होता हैं।[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() को एक बार, calcProduct को दो बार क्रियान्वित किया जाता हैं, कॉलबैक के रूप में और एक बार कैलकसम के साथ फ़ंक्शन क्रमशः उत्पाद और योग लौटाते हैं, और फिर अलर्ट उन्हें स्क्रीन पर प्रदर्शित करेगा।

इस पूर्व उदाहरण में, कॉलबैक का उपयोग प्राथमिक रूप से सिद्धांत का प्रदर्शन है। कोई कॉलबैक को नियमित कार्यों के calcProduct(num1, num2)के रूप में कॉल कर सकता है, कॉलबैक का उपयोग साधारणतया तब किया जाता है जब फ़ंक्शन को कॉलबैक निष्पादित होने से पहले घटनाओं को निष्पादित करने की आवश्यकता होती है, या जब फ़ंक्शन में कार्य करने के लिए अर्थपूर्ण वापसी मान्य नहीं होते (या नहीं हो सकते), जैसा कि अजाक्स (प्रोग्रामिंग) (टाइमर पर आधारित) या एक्सएम्एल एचटीटीपी रिक्वेस्ट रिक्वेस्ट होता हैं। उपयोगी उदाहरण जावास्क्रिप्ट लाइब्रेरी जैसे कि जे क्वेरी में पाए जा सकते हैं जहां .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

लुआ

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

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

यह भी देखें

संदर्भ

  1. "Perl Cookbook - 11.4. Taking References to Functions". 2 July 1999. Retrieved 2008-03-03.
  2. "Advanced Perl Programming - 4.2 Using Subroutine References". 2 July 1999. Retrieved 2008-03-03.
  3. "PHP भाषा संदर्भ - अनाम कार्य". Retrieved 2011-06-08.
  4. "What's New in JDK 8". oracle.com.
  5. "घटकों में जावास्क्रिप्ट कॉलबैक बनाना". 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.
  6. 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.

बाहरी संबंध