Кіріспе
Дерек ретінде беріліп, басқа функциямен шақырылатын функция. Компьютерлік модемдермен кері шақыру тақырыбы. Компьютерлік бағдарламалауда кері шақыру – дерек түрінде (анықтама) сақталатын және басқа функциямен шақырылатын функция, көбінесе бастапқы абстракция деңгейіне. Кері шақыру параметрін қабылдайтын функция, шақырушысына қайтып оралғанға дейін кері шақыру үшін жасалуы мүмкін, мұндай жағдай синхронды немесе тоқтатушы деп аталады. Кері шақыруды қабылдайтын функция, оны қайтарғаннан кейін шақыру үшін сақтауға мүмкіндік беретіндей етіп жасалуы мүмкін, бұл асинхронды, тоқтатушы емес немесе кейінге шегерілген деп аталады. Бағдарламалау тілдері кері шақыруды әртүрлі тәсілдермен қолдайды, мысалы, функциялық көрсеткіштер, лямбда өрнектері және блоктар арқылы.
a discussion of callback with computer modems
In computer programming, a callback is a function that is stored as data (a reference) and designed to be called by another function often back to the original abstraction layer. A function that accepts a callback parameter may be designed to call back before returning to its caller which is known as synchronous or blocking. The function that accepts a callback may be designed to store the callback so that it can be called back after returning which is known as asynchronous, non blocking or deferred. Programming languages support callbacks in different ways such as function pointers, lambda expressions and blocks.
Салыстырмалылық
Бұл ұғымды түсінуге көмектесу үшін, өмірден алынған мысал келтірейік. Бір клиент дүкенге тапсырыс беру үшін келеді. Бұл – бірінші шақыру сияқты. Клиент сатушыға тауарлар тізімін, олардың құнына төлем жасау үшін чек пен жеткізу туралы нұсқауларды береді. Бұл бірінші шақырудың параметрлері, соның ішінде кері шақыру, яғни жеткізу нұсқаулары. Чек ақшаға айналдырылады және нұсқаулар орындалады деп түсініледі. Қызметкерлер мүмкіндігі болғанда, тапсырыс бойынша тауарларды жеткізеді, бұл кері шақыруды іске қосу сияқты. Маңыздысы, тапсырысты қабылдаған сатушы міндетті түрде жеткізуді жүзеге асырмауы мүмкін. Кері шақыруды параметр ретінде қабылдаған функция оны шақыруға міндетті емес. Сондай-ақ, жеткізу клиентке тікелей жасалуы міндетті емес. Кері шақыру шақырушы функцияға жасалуы да міндетті емес. Шындығында, функция әдетте өзін кері шақыру ретінде жібермейді. Кейбір адамдар кері шақыруды қолдануды шатастыратындықтан, кері шақыру телефон қоңырауындағыдай бастапқы шалушыға қайтарылмайды, деп санайды.
Қолдану
Бұғатталған кері шақыру, кері шақыруды жіберген функцияның орындалу контекстінде іске асады. Ал кейінге қалдырылған кері шақыру, үзіліс кезінде немесе басқа жіптен (thread) сияқты, бөлек контекстте іске қосылуы мүмкін. Сондықтан, кейінге қалдырылған кері шақыруды синхрондау үшін және жұмысты басқа жіпке жүктеу үшін қолдануға болады.
Оқиғаларды басқару
Қайта шақыруды оқиғаларды өңдеу үшін пайдалануға болады. Көбінесе, кодты пайдаланатын бөлік белгілі бір оқиға түрі үшін қайта шақыруды тіркейді. Оқиға орын алғанда, қайта шақыру іске қосылады. Қайта шақырулар жиі терезелік жүйеде жұмыс істейтін бағдарламаның графикалық пайдаланушы интерфейсін (GUI) бағдарламалау үшін қолданылады. Бағдарлама терезелік жүйенің шақыруы үшін арнайы қайта шақыру функциясына сілтеме береді. Терезелік жүйе бұл функцияны тышқанның басуы және пернелерді басу сияқты оқиғалар туралы бағдарламаны хабардар ету үшін шақырады.
Асинхронды әрекет
Асинхронды өңдеуді іске асыру үшін кері шақыру қолданылуы мүмкін. Шақырушы бір әрекетті сұрайды және сол әрекет аяқталғанда шақырылатын кері шақыруды береді, бұл сұраныс жасалғаннан кейін көп уақыт өткен соң болуы мүмкін.
Іске асыру
Қайта шақыру технологиясы бағдарламалау тіліне қарай әртүрлі жүзеге асырылады. Ассемблер, C, C++, Паскаль, Modula2 және басқа тілдерде кері шақыру функциясы функцияның нұсқауы ретінде ішкі жадта сақталады. Ортақ жадты пайдалану арқасында әртүрлі тілдер жобалау немесе орындау кезінде өзара әрекеттесу қабатынсыз кері шақыруларды тікелей бөлісе алады. Мысалы, Windows API бірнеше тіл, компилятор және ассемблер арқылы қолжетімді. C++ нысандарға функцияны шақыру операциясын жүзеге асыру мүмкіндігін де береді. Стандартты үлгілер кітапханасы осы нысандарды (функторлар деп аталады) параметрлер ретінде қабылдайды. JavaScript, Lua, Python, Perl және PHP сияқты көптеген динамикалық тілдер функция объектісін беруге мүмкіндік береді. C# және VB.NET сияқты CLI тілдері типтік қауіпсіздікті қамтамасыз ететін функция нұсқауын қамтиды, ол делегат деп аталады. NET тілдерінде қолданылатын оқиғалар мен оқиғаларды өңдеушілер кері шақыруды қамтамасыз етеді. Функционалдық тілдер әдетте бірінші дәрежелі функцияларды қолдайды, оларды басқа функцияларға кері шақыру ретінде беруге, дерек ретінде сақтауға немесе функциялардан қайтаруға болады. Perl, Python, Ruby, Smalltalk, C++ (11+), C# және VB.NET (жаңа нұсқалары) және көптеген функционалдық тілдер сияқты көптеген тілдер, ламбда өрнектерін, атаусыз функцияларды, тікелей синтаксиспен жазылатын және көбінесе кері шақыру ретінде әрекет ететін функцияларды қолдайды. Схема, ML, JavaScript, Perl, Python, Smalltalk, PHP (5.3.0 нұсқасынан бастап), C++ (11+), Java (8 нұсқасынан бастап) және тағы да басқа тілдерде ламбда жабылу болып табылуы мүмкін, яғни ламбда анықталған контексттегі жергілікті анықталған айнымалыларға қол жеткізе алады. Java сияқты объектіге бағытталған бағдарламалау тілінде, функциялық аргументтерге дейінгі нұсқаларда кері шақыру мінез-құлқы интерфейсті жүзеге асыратын объектіні беру арқылы қамтамасыз етіледі. Бұл объектінің әдістері кері шақырулар болып табылады. PL/I және ALGOL 60 тілдерінде кері шақыру процедурасы оны қамтитын блоктардағы жергілікті айнымалыларға қол жеткізуі қажет болуы мүмкін, сондықтан ол кіру нүктесі мен контексттік ақпаратты қамтитын кіру айнымалысы арқылы шақырылады.
In some languages, including Scheme, ML, JavaScript, Perl, Python, Smalltalk, PHP (since 5.3.0), C++ (11+), Java (since 8), and many others, a lambda can be a closure, i. e. can access variables locally defined in the context in which the lambda is defined. In an object oriented programming language such as Java versions before function valued arguments, the behavior of a callback can be achieved by passing an object that implements an interface. The methods of this object are callbacks. In PL/I and ALGOL 60 a callback procedure may need to be able to access local variables in containing blocks, so it is called through an entry variable containing both the entry point and context information.
C++ тілінде
C++ тілінде функциялық көрсеткіштермен қатар функторларды да қолдануға болады.