Кіріспе
Функционалдық бағдарламалауда жалғастыруды беру стилі (CPS) – басқаруды жалғастыру түрінде ашық түрде беруді қамтитын бағдарламалау стилі. Бұл бағдарламалаудың әдеттегі стилі болып табылатын тікелей стильмен қарама-қарсы. Джеральд Джей Суссман мен Гай Л. Стил, Дж. AI Memo 349 (1975) еңбегінде осы терминді қолданды, онда Схема бағдарламалау тілінің алғашқы нұсқасы жазылған. Джон К. Рейнольдс жалғастырулардың көптеген жаңалықтары туралы толыққанды мәлімет берді. Жалғастыру стилінде жазылған функция қосымша аргумент қабылдайды: нақты "жалғастыру", яғни бір аргументі бар функция. CPS функциясы нәтижелік мәнін есептегеннен кейін, оны осы мәнді аргумент ретінде жалғастыру функциясын шақыру арқылы "қайтарады". Яғни, CPS функциясын шақырғанда, шақырушы функция субпрограмманың "қайтару" мәнімен шақырылатын процедураны беруі керек. Кодты осы форматта жазу тікелей стильде жасырын болған бірқатар нәрсені анық көрсетеді. Оларға: процедура қайтарымдары, олар жалғастыруға шақыру ретінде көрінеді; аралық мәндер, олардың барлығына есімдер берілген; аргументтерді бағалау реті, ол нақты көрсетіледі; және құйрық шақырулары, олар шақырушыға берілген, өзгертілмеген бірдей жалғастырумен процедураны шақырады. Бағдарламаларды тікелей стильден CPS-ке автоматты түрде түрлендіруге болады. Функционалдық және логикалық компиляторлар көбінесе CPS-ті аралық өрнек ретінде пайдаланады, ал императивті немесе процедуралық бағдарламалау тілі үшін компилятор статикалық бір тапсырма (SSA) пішімін қолданады. SSA формальды түрде CPS-тің кіші жиынтығымен тең (жергілікті емес басқару ағынын қоспағанда, ол CPS аралық өрнек ретінде қолданылғанда пайда болмайды). Функционалдық компиляторлар CPS-те "төмендегі жазбалар" (төмендегі мысалдарда сипатталған) емес, A қалыпты пішімін (ANF) де пайдалана алады (бірақ тек міндетті бағалауды қажет ететін тілдер үшін). CPS-ті компиляторлар бағдарламалаушыларға қарағанда жергілікті немесе жаһандық стиль ретінде жиі қолданады.
In functional programming, continuation passing style (CPS) is a style of programming in which control is passed explicitly in the form of a continuation. This is contrasted with direct style, which is the usual style of programming. Gerald Jay Sussman and Guy L. Steele, Jr. coined the phrase in AI Memo 349 (1975), which sets out the first version of the Scheme programming language. John C. Reynolds gives a detailed account of the numerous discoveries of continuations. A function written in continuation passing style takes an extra argument: an explicit "continuation"; i. e., a function of one argument. When the CPS function has computed its result value, it "returns" it by calling the continuation function with this value as the argument. That means that when invoking a CPS function, the calling function is required to supply a procedure to be invoked with the subroutine's "return" value. Expressing code in this form makes a number of things explicit which are implicit in direct style. These include: procedure returns, which become apparent as calls to a continuation; intermediate values, which are all given names; order of argument evaluation, which is made explicit; and tail calls, which simply call a procedure with the same continuation, unmodified, that was passed to the caller. Programs can be automatically transformed from direct style to CPS. Functional and logic compilers often use CPS as an intermediate representation where a compiler for an imperative or procedural programming language would use static single assignment form (SSA). SSA is formally equivalent to a subset of CPS (excluding non local control flow, which does not occur when CPS is used as intermediate representation). Functional compilers can also use A normal form (ANF) (but only for languages requiring eager evaluation), rather than with 'thunks' (described in the examples below) in CPS. CPS is used more frequently by compilers than by programmers as a local or global style.
Кезек шақырулары
CPS-дегі әрбір шақыру – соңғы шақыру болып табылады, және жалғастыру тікелей беріледі. Қалқыма шақыруларды оңтайландырусыз (TCO) CPS қолдану, рекурсия кезінде құрастырылған жалғастырудың ғана емес, сонымен қатар шақыру стегінің де өсуіне себеп болады. Бұл көбінесе қажет емес, бірақ қызықты жағдайларда қолданылған – мысалы, Chicken Scheme компиляторында. CPS және TCO имплицитті функциядан қайтарылу түсінігін жойғандықтан, оларды бірге қолдану орындалу уақыты стегінің қажеттілігін жоюға мүмкіндік береді. Функционалдық бағдарламалау тілдеріне арналған бірнеше компиляторлар мен интерпретаторлар осы мүмкіндікті жаңа тәсілдермен пайдаланады.
Басқа салаларда қолдану
Компьютерлік ғылымнан тыс, CPS қарапайым өрнектерді күрделі өрнектерге біріктірудің дәстүрлі әдісіне альтернатива ретінде кеңінен қызығушылық тудырады. Мысалы, лингвистикалық семантикада Крис Баркер және оның әріптестері CPS-ті пайдалану арқылы сөйлемдердің мағынасын анықтау табиғи тілдегі кейбір құбылыстарды түсіндіруге көмектеседі деп ұсынды. Математикада компьютерлік бағдарламалар мен математикалық дәлелдемелер арасындағы Керри-Ховард изоморфизмі, жалғастыруды беру стиліндегі аударманы классикалық логиканың интуиционистік (конструктивті) логикаға екі рет теріскелеу енгізуінің өзгеруімен байланыстырады. Атомдық ұйғарымдарды p-ден ((p → ⊥) → ⊥) түріне көшіретін стандартты екі рет теріскелеу аудармасынан айырмашылығы, жалғастыруды беру стилі ⊥-ны соңғы өрнектің типімен алмастырады. Сәйкесінше, нәтиже жоғарыдағы мысалдағыдай, CPS өрнегіне сәйкестік функциясын жалғастыру ретінде жіберу арқылы алынады. Классикалық логиканың өзі бағдарламалардың жалғасын тікелей өңдеумен байланысты, мысалы, Scheme-дегі ағымдағы жалғастыру операторымен шақыру, бұл Тим Гриффин жасаған байқау (C басқару операторымен тығыз байланысты).