Кіріспе

Функционалдық бағдарламалауда жалғастыруды беру стилі (CPS) – басқаруды жалғастыру түрінде ашық түрде беруді қамтитын бағдарламалау стилі. Бұл бағдарламалаудың әдеттегі стилі болып табылатын тікелей стильмен қарама-қарсы. Джеральд Джей Суссман мен Гай Л. Стил, Дж. AI Memo 349 (1975) еңбегінде осы терминді қолданды, онда Схема бағдарламалау тілінің алғашқы нұсқасы жазылған. Джон К. Рейнольдс жалғастырулардың көптеген жаңалықтары туралы толыққанды мәлімет берді. Жалғастыру стилінде жазылған функция қосымша аргумент қабылдайды: нақты "жалғастыру", яғни бір аргументі бар функция. CPS функциясы нәтижелік мәнін есептегеннен кейін, оны осы мәнді аргумент ретінде жалғастыру функциясын шақыру арқылы "қайтарады". Яғни, CPS функциясын шақырғанда, шақырушы функция субпрограмманың "қайтару" мәнімен шақырылатын процедураны беруі керек. Кодты осы форматта жазу тікелей стильде жасырын болған бірқатар нәрсені анық көрсетеді. Оларға: процедура қайтарымдары, олар жалғастыруға шақыру ретінде көрінеді; аралық мәндер, олардың барлығына есімдер берілген; аргументтерді бағалау реті, ол нақты көрсетіледі; және құйрық шақырулары, олар шақырушыға берілген, өзгертілмеген бірдей жалғастырумен процедураны шақырады. Бағдарламаларды тікелей стильден CPS-ке автоматты түрде түрлендіруге болады. Функционалдық және логикалық компиляторлар көбінесе CPS-ті аралық өрнек ретінде пайдаланады, ал императивті немесе процедуралық бағдарламалау тілі үшін компилятор статикалық бір тапсырма (SSA) пішімін қолданады. SSA формальды түрде CPS-тің кіші жиынтығымен тең (жергілікті емес басқару ағынын қоспағанда, ол CPS аралық өрнек ретінде қолданылғанда пайда болмайды). Функционалдық компиляторлар CPS-те "төмендегі жазбалар" (төмендегі мысалдарда сипатталған) емес, A қалыпты пішімін (ANF) де пайдалана алады (бірақ тек міндетті бағалауды қажет ететін тілдер үшін). CPS-ті компиляторлар бағдарламалаушыларға қарағанда жергілікті немесе жаһандық стиль ретінде жиі қолданады.

Кезек шақырулары

CPS-дегі әрбір шақыру – соңғы шақыру болып табылады, және жалғастыру тікелей беріледі. Қалқыма шақыруларды оңтайландырусыз (TCO) CPS қолдану, рекурсия кезінде құрастырылған жалғастырудың ғана емес, сонымен қатар шақыру стегінің де өсуіне себеп болады. Бұл көбінесе қажет емес, бірақ қызықты жағдайларда қолданылған – мысалы, Chicken Scheme компиляторында. CPS және TCO имплицитті функциядан қайтарылу түсінігін жойғандықтан, оларды бірге қолдану орындалу уақыты стегінің қажеттілігін жоюға мүмкіндік береді. Функционалдық бағдарламалау тілдеріне арналған бірнеше компиляторлар мен интерпретаторлар осы мүмкіндікті жаңа тәсілдермен пайдаланады.

Басқа салаларда қолдану

Компьютерлік ғылымнан тыс, CPS қарапайым өрнектерді күрделі өрнектерге біріктірудің дәстүрлі әдісіне альтернатива ретінде кеңінен қызығушылық тудырады. Мысалы, лингвистикалық семантикада Крис Баркер және оның әріптестері CPS-ті пайдалану арқылы сөйлемдердің мағынасын анықтау табиғи тілдегі кейбір құбылыстарды түсіндіруге көмектеседі деп ұсынды. Математикада компьютерлік бағдарламалар мен математикалық дәлелдемелер арасындағы Керри-Ховард изоморфизмі, жалғастыруды беру стиліндегі аударманы классикалық логиканың интуиционистік (конструктивті) логикаға екі рет теріскелеу енгізуінің өзгеруімен байланыстырады. Атомдық ұйғарымдарды p-ден ((p → ⊥) → ⊥) түріне көшіретін стандартты екі рет теріскелеу аудармасынан айырмашылығы, жалғастыруды беру стилі ⊥-ны соңғы өрнектің типімен алмастырады. Сәйкесінше, нәтиже жоғарыдағы мысалдағыдай, CPS өрнегіне сәйкестік функциясын жалғастыру ретінде жіберу арқылы алынады. Классикалық логиканың өзі бағдарламалардың жалғасын тікелей өңдеумен байланысты, мысалы, Scheme-дегі ағымдағы жалғастыру операторымен шақыру, бұл Тим Гриффин жасаған байқау (C басқару операторымен тығыз байланысты).