Кіріспе
Компьютерлік бағдарламаның басқару күйін бейнелеу. Компьютерлік ғылымда жалғастыру – компьютерлік бағдарламаның басқару күйінің абстрактілі бейнесі. Жалғастыру бағдарламаның басқару жағдайын іске асырады (көрсетіп береді), яғни жалғастыру – процестің орындалуының белгілі бір кезеңіндегі есептеу процесін көрсететін дерек құрылымы; осы құрылған дерек құрылымына бағдарламалау тілі арқылы қол жеткізуге болады, орындалу ортасында жасырылудың орнына. Жалғастырулар ерекше жағдайлар, генераторлар, корутиналар және т.б. сияқты бағдарламалау тілдеріндегі басқа басқару механизмдерін кодтау үшін пайдалы. "Ағымдағы жалғастыру" немесе "есептеу қадамының жалғасы" – код орындалып жатқан кезде бағдарламаның орындалуының ағымдағы нүктесінен туындайтын жалғастыру. "Жалғастыру" термині сондай-ақ бірінші сыныпты жалғастыруларға қатысты қолданылуы мүмкін, олар бағдарламалау тіліне кез келген сәтте орындалу күйін сақтауға және бағдарламаның кейінірек, мүмкін бірнеше рет, сол күйге оралуға мүмкіндік береді.
In computer science, a continuation is an abstract representation of the control state of a computer program. A continuation implements (reifies) the program control state, i. e. the continuation is a data structure that represents the computational process at a given point in the process's execution; the created data structure can be accessed by the programming language, instead of being hidden in the runtime environment. Continuations are useful for encoding other control mechanisms in programming languages such as exceptions, generators, coroutines, and so on. The "current continuation" or "continuation of the computation step" is the continuation that, from the perspective of running code, would be derived from the current point in a program's execution. The term continuations can also be used to refer to first class continuations, which are constructs that give a programming language the ability to save the execution state at any point and return to that point at a later point in the program, possibly multiple times.
Тарих
Жалғастыру туралы ең алғашқы сипаттаманы 1964 жылдың қыркүйегінде Адриаан ван Вийнгаарден жасаған. Вийнгаарден Австрияның Баден-би-Вьен қаласында өткен IFIP-тің формалды тілдерді сипаттау тілдері жөніндегі жұмыс конференциясында сөз сөйледі. Алголь 60 препроцессорының құрастыру бөлігі ретінде ол дұрыс процедураларды жалғастыру стиліне түрлендіруді ұсынды, бірақ ол бұл атауды қолданбады, ал оның мақсаты бағдарламаны жеңілдету және осылайша оның нәтижесін түсінікті ету болды. Кристофер Стречи, Кристофер П. Уодсворт және Джон К. Рейнольдс өздерінің денотациялық семантика саласындағы жұмыстарында жалғастыру терминін кеңінен пайдаланып, реттік бағдарламаларды функционалдық бағдарламалау семантикасы тұрғысынан талдауға мүмкіндік берді. Ол IBM 704 үшін екінші Lisp нұсқасын жасағанда жалғастыруды ойлап тапты, бірақ оған есім қоймады. жалғастырулардың ашылу тарихын толыққанды баяндайды.
Іске асыру
Бағдарлама өз функциялары қолданатын айнымалылар үшін жадта орын бөлуі керек. Көптеген бағдарламалау тілдері қажетті айнымалыларды сақтау үшін шақыру стегін (call stack) пайдаланады, себебі ол жадты жылдам және оңай бөлуге, сондай-ақ автоматты түрде босатуға мүмкіндік береді. Басқа бағдарламалау тілдері үшін үйінді (heap) қолданылады, ол жадты бөлу және босату кезінде икемділікті қамтамасыз етеді, бірақ бұл операцияларға көбірек шығын талап етеді. Екі жағдайдың да жалғастырулар (continuations) тұрғысынан өз артықшылықтары мен кемшіліктері бар.
Веб-құрылыста
Продолжениелардың практикалық қолданылуы байқалатын салалардың бірі – веб-бағдарламалау. Продолжениеларды қолдану бағдарламашыны HTTP протоколының күйсіз табиғатынан қорғайды. Веб-бағдарламалаудың дәстүрлі моделінде күйдің болмауы бағдарламаның құрылымында көрініс табады, бұл есептеу мәселелерін тиімді бейнелеуге нашар мүмкіндік беретін модельге негіделген кодты тудырады. Осылайша, продолжениелар басқаруды кері жүргізуге байланысты пайдалы қасиеттері бар кодты іске асыруға мүмкіндік береді, сонымен бірге оның тудыратын қиындықтардан сақтайды. "Басқаруды кері жүргізуді кері қайтару немесе продолжениелар мен бетке бағытталған бағдарламалау" атты мақала веб-бағдарламалауда қолданылатын продолжениеларға тамаша кіріспе болып табылады.
Түрлері
Ұзаққа созылуды қолдау өте кең түрлі. Бағдарламалау тілі қайта шақырылатын жалғастыруларды қолдайды, егер жалғастыру бірнеше рет шақырылуы мүмкін болса (ол бұрыннан қайтып келгеннен кейін де). Қайта шақырылатын жалғастыруларды Питер Дж. Ландин өзінің J (секіру үшін) операторы арқылы енгізді, ол бақылау ағынын процедура шақырудың ортасына қайта бағыттай алады. Қайта шақырылатын жалғастырулар "қайта кіретін" деп те аталады. Дегенмен, "қайта кіретін" терминінің қолданылуы көп тілділік талқылаудағы қолданылуымен шатасуы мүмкін. Сонымен қатар, қашып шығуға арналған жалғастырулар да бар, олар ағымдағы контекстен сыртқы контекстке қашу үшін пайдаланылуы мүмкін. Көптеген тілдер жалғастыруларды тікелей қолдамаса да, ерекшеліктерді өңдеуді қолдайды, бұл қашып шығуға арналған жалғастырулармен тең және сол мақсаттар үшін пайдаланылуы мүмкін. C тіліндегі setjmp/longjmp да солай: оларды тек стектерді кері итеру үшін ғана пайдалануға болады. Қашып шығуға арналған жалғастыруларды құйрық шақыруларды жою үшін де пайдалануға болады. Жалғастырулардың бір жалпылау түрі – шектелген жалғастырулар. call/cc сияқты жалғастыру операторлары бағдарламаның белгілі бір нүктесіндегі қалған барлық есептеулерді қамтиды және осы түсіруді шектеуге мүмкіндік бермейді. Шектелген жалғастыру операторлары бұл мәселені екі бөлек басқару механизмін ұсыну арқылы шешеді: жалғастыру операциясын шектейтін шақыру және ауысу немесе басқару сияқты реификация операторы. Осылайша, шектелген операторларды пайдаланып түсірілген жалғастырулар бағдарлама контекстінің тек бір бөлігін ғана көрсетеді.
Кемшіліктер
Ұдайы GOTO операторының функционалдық түрі болып табылады және сол ескертулер сақталады. Кейбір арнайы жағдайларда, мысалы веб-бағдарламалауда, Ұдайылықтарды қолдану түсінігі қиын кодқа алып келуі мүмкін. Шындығында, эзотерикалық бағдарламалау тілі Unlambda, оның мүмкіндіктерінің бірі ретінде ағымдағы Ұдайылықпен шақыруды қамтиды, себебі оны қолданатын өрнектер "табуы өте қиын" болып келеді. Төмендегі сыртқы сілтемелер осы ұғымды толығырақ түсіндіреді.