{"id":476419,"date":"2023-08-09T07:29:55","date_gmt":"2023-08-09T07:29:55","guid":{"rendered":""},"modified":"2023-09-05T11:12:43","modified_gmt":"2023-09-05T11:12:43","slug":"continuation-passing-style-cps","status":"publish","type":"wiki","link":"https:\/\/oneproxy.pro\/pl\/wiki\/continuation-passing-style-cps\/","title":{"rendered":"Styl kontynuacji-przej\u015bcia (CPS)"},"content":{"rendered":"<p>Styl przekazywania kontynuacji (CPS) to metoda obs\u0142ugi przep\u0142ywu sterowania w programowaniu komputerowym, kt\u00f3ra polega na jawnym przekazywaniu sterowania przez parametr funkcji.<\/p>\n<h2>Ewolucja stylu kontynuacji (CPS)<\/h2>\n<p>Pocz\u0105tk\u00f3w stylu kontynuacja-przej\u015bcie mo\u017cna doszukiwa\u0107 si\u0119 w rozwoju informatyki teoretycznej, a sama koncepcja kontynuacji ma swoje korzenie w rachunku lambda. Pierwsz\u0105 wyra\u017an\u0105 wzmiank\u0119 o \u201estylu przemijaj\u0105cym\u201d jako wyra\u017ceniu i jego zastosowaniu w praktyce wprowadzi\u0142 informatyk Christopher Strachey w latach sze\u015b\u0107dziesi\u0105tych XX wieku. To w\u0142a\u015bnie w tym okresie on i jego wsp\u00f3\u0142pracownicy badali semantyk\u0119 denotacyjn\u0105, czyli ramy definiowania znacze\u0144 j\u0119zyk\u00f3w programowania.<\/p>\n<h2>Styl rozwijania-kontynuacji (CPS)<\/h2>\n<p>Styl przechodz\u0105cy przez kontynuacj\u0119 (CPS) to forma organizacji programu, kt\u00f3ra obejmuje wyra\u017ane u\u017cycie kontynuacji. Kontynuacja to reprezentacja stanu programu komputerowego w okre\u015blonym momencie, \u0142\u0105cznie ze stosem wywo\u0142a\u0144 i warto\u015bciami zmiennych.<\/p>\n<p>W CPS ka\u017cda funkcja otrzymuje dodatkowy argument, zwykle nazywany \u201econt\u201d lub \u201ek\u201d, kt\u00f3ry reprezentuje kontynuacj\u0119 programu \u2013 czyli to, co powinno si\u0119 wydarzy\u0107, gdy funkcja zako\u0144czy obliczenia. Gdy funkcja obliczy sw\u00f3j wynik, \u201ezwraca\u201d ten wynik, przekazuj\u0105c go do kontynuacji, zamiast zwraca\u0107 go w zwyk\u0142y spos\u00f3b.<\/p>\n<p>T\u0119 koncepcj\u0119 mo\u017cna postrzega\u0107 jako spos\u00f3b na wyra\u017ane przedstawienie przep\u0142ywu sterowania: zamiast po\u015brednio przekazywa\u0107 kontrol\u0119 wywo\u0142uj\u0105cemu po jego zako\u0144czeniu, funkcja CPS przekazuje kontrol\u0119 poprzez wywo\u0142anie kontynuacji.<\/p>\n<h2>Struktura stylu kontynuacji (CPS)<\/h2>\n<p>W tradycyjnej konwencji wywo\u0142ywania funkcji, gdy funkcja jest wywo\u0142ywana, wykonuje si\u0119 i zwraca kontrol\u0119 wywo\u0142uj\u0105cemu wraz ze zwracan\u0105 warto\u015bci\u0105. Jednak\u017ce w stylu przekazywania kontynuacji kontrola jest przekazywana jawnie poprzez parametr funkcji, cz\u0119sto okre\u015blany jako \u201ekontynuacja\u201d.<\/p>\n<p>Kontynuacja reprezentuje reszt\u0119 oblicze\u0144. Oznacza to, \u017ce gdy funkcja otrzymuje kontynuacj\u0119, wykonuje pewne operacje, a nast\u0119pnie przekazuje wynik do otrzymanej kontynuacji. Zatem w stylu przekazywania kontynuacji powr\u00f3t nigdy nie jest wykonywany w spos\u00f3b dorozumiany.<\/p>\n<p>Typowa funkcja CPS w pseudoj\u0119zyku mo\u017ce wygl\u0105da\u0107 nast\u0119puj\u0105co:<\/p>\n<pre><div class=\"bg-black rounded-md mb-4\"><div class=\"flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans justify-between rounded-t-md\"><span>css<\/span><button class=\"flex ml-auto gap-2\"><svg stroke=\"currentColor\" fill=\"none\" stroke-width=\"2\" viewbox=\"0 0 24 24\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"h-4 w-4\" height=\"1em\" width=\"1em\" ><path d=\"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\"><\/path><rect x=\"8\" y=\"2\" width=\"8\" height=\"4\" rx=\"1\" ry=\"1\"><\/rect><\/svg>Skopiuj kod<\/button><\/div><div class=\"p-4 overflow-y-auto\"><code class=\"!whitespace-pre hljs language-css\" data-no-translation=\"\">function add(<span class=\"hljs-selector-tag\">a<\/span>, <span class=\"hljs-selector-tag\">b<\/span>, continuation) {\n    result = <span class=\"hljs-selector-tag\">a<\/span> + <span class=\"hljs-selector-tag\">b<\/span>;\n    continuation(result);\n}\n<\/code><\/div><\/div><\/pre>\n<p>Ta funkcja \u201edodaj\u201d wykonuje operacj\u0119 dodawania, a nast\u0119pnie przekazuje wynik do kontynuacji.<\/p>\n<h2>Kluczowe cechy stylu polegaj\u0105cego na kontynuacji (CPS)<\/h2>\n<ol>\n<li>\n<p><strong>Jawny przep\u0142yw sterowania<\/strong>: W CPS przep\u0142yw kontroli jest wyra\u017any. Nie ma ukrytego \u015bladu stosu, a kolejno\u015b\u0107 wykonywania jest wyra\u017anie widoczna w kodzie.<\/p>\n<\/li>\n<li>\n<p><strong>Elastyczno\u015b\u0107<\/strong>: Poniewa\u017c CPS oddziela obliczenia od przep\u0142ywu sterowania, zapewnia wi\u0119ksz\u0105 elastyczno\u015b\u0107 w manipulowaniu przep\u0142ywem sterowania.<\/p>\n<\/li>\n<li>\n<p><strong>Operacje nieblokuj\u0105ce<\/strong>: CPS jest bardzo przydatny w zarz\u0105dzaniu operacjami nieblokuj\u0105cymi lub asynchronicznymi. Mo\u017cna go u\u017cy\u0107, aby unikn\u0105\u0107 piek\u0142a wywo\u0142a\u0144 zwrotnych i zarz\u0105dza\u0107 z\u0142o\u017conymi scenariuszami przep\u0142ywu kontroli w kodzie nieblokuj\u0105cym.<\/p>\n<\/li>\n<li>\n<p><strong>Optymalizacja po\u0142\u0105cze\u0144 ogonowych<\/strong>: J\u0119zyki obs\u0142uguj\u0105ce optymalizacj\u0119 wywo\u0142a\u0144 ko\u0144cowych mog\u0105 skorzysta\u0107 na CPS, poniewa\u017c przekszta\u0142ca wszystkie wywo\u0142ania na wywo\u0142ania ko\u0144cowe, co mo\u017ce by\u0107 bardziej wydajne pod wzgl\u0119dem wykorzystania pami\u0119ci.<\/p>\n<\/li>\n<\/ol>\n<h2>Rodzaje stylu kontynuacji (CPS)<\/h2>\n<p>Istniej\u0105 g\u0142\u00f3wnie dwa rodzaje kontynuacji, <strong>styl bezpo\u015bredni<\/strong> I <strong>styl kontynuacji-przej\u015bcia<\/strong>. Poni\u017cej znajduje si\u0119 por\u00f3wnanie mi\u0119dzy nimi:<\/p>\n<table>\n<thead>\n<tr>\n<th>Styl<\/th>\n<th>Opis<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Styl bezpo\u015bredni<\/td>\n<td>W stylu bezpo\u015brednim funkcja ko\u0144czy wykonywanie i zwraca kontrol\u0119 do funkcji wywo\u0142uj\u0105cej. Warto\u015b\u0107 zwracana jest cz\u0119sto wynikiem oblicze\u0144.<\/td>\n<\/tr>\n<tr>\n<td>Styl kontynuacji-przemijania<\/td>\n<td>W CPS funkcja otrzymuje dodatkowy argument, kontynuacj\u0119 i przekazuje wynik do tej kontynuacji. Przep\u0142yw sterowania jest wyra\u017any.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>U\u017cycie, problemy i rozwi\u0105zania<\/h2>\n<p>CPS znajduje zastosowanie g\u0142\u00f3wnie w funkcjonalnych j\u0119zykach programowania oraz w zarz\u0105dzaniu operacjami asynchronicznymi.<\/p>\n<ol>\n<li>\n<p><strong>Asynchroniczny JavaScript<\/strong>: JavaScript, zw\u0142aszcza w Node.js, wykorzystuje CPS do zarz\u0105dzania asynchronicznymi, nieblokuj\u0105cymi operacjami. Wywo\u0142ania zwrotne w JavaScript s\u0105 przyk\u0142adami CPS.<\/p>\n<\/li>\n<li>\n<p><strong>Programowanie funkcjonalne<\/strong>: J\u0119zyki takie jak Scheme i Haskell u\u017cywaj\u0105 CPS do obs\u0142ugi struktur kontrolnych, takich jak p\u0119tle i obs\u0142uga wyj\u0105tk\u00f3w.<\/p>\n<\/li>\n<\/ol>\n<p>Jednak CPS mo\u017ce prowadzi\u0107 do pewnych problem\u00f3w:<\/p>\n<ul>\n<li><strong>Czytelno\u015b\u0107<\/strong>: CPS mo\u017ce czasami prowadzi\u0107 do powstania kodu, kt\u00f3ry jest trudny do odczytania i zrozumienia ze wzgl\u0119du na piek\u0142o wywo\u0142a\u0144 zwrotnych, zw\u0142aszcza je\u015bli istnieje wiele zagnie\u017cd\u017conych wywo\u0142a\u0144 zwrotnych.<\/li>\n<li><strong>Efektywno\u015b\u0107<\/strong>: Transformacja CPS mo\u017ce potencjalnie zwi\u0119kszy\u0107 rozmiar kodu ze wzgl\u0119du na dodatkowe parametry i wywo\u0142ania funkcji.<\/li>\n<\/ul>\n<p>Rozwi\u0105zania tych problem\u00f3w s\u0105 nast\u0119puj\u0105ce:<\/p>\n<ul>\n<li>U\u017cywa\u0107 <strong>Obietnice<\/strong> Lub <strong>asynchronicznie\/czekaj<\/strong> w JavaScript, aby unikn\u0105\u0107 piek\u0142a wywo\u0142a\u0144 zwrotnych i poprawi\u0107 czytelno\u015b\u0107.<\/li>\n<li>Korzystanie z j\u0119zyk\u00f3w programowania obs\u0142uguj\u0105cych optymalizacj\u0119 po\u0142\u0105cze\u0144 ko\u0144cowych mo\u017ce z\u0142agodzi\u0107 problemy zwi\u0105zane z wydajno\u015bci\u0105.<\/li>\n<\/ul>\n<h2>Por\u00f3wnania<\/h2>\n<p>Oto por\u00f3wnanie CPS z innymi paradygmatami programowania:<\/p>\n<table>\n<thead>\n<tr>\n<th>Paradygmat programowania<\/th>\n<th>Kontrola przep\u0142ywu<\/th>\n<th>Przypadek u\u017cycia<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Styl przechodz\u0105cy przez kontynuacj\u0119 (CPS)<\/td>\n<td>Wyra\u017ane, z kontynuacjami.<\/td>\n<td>Operacje nieblokuj\u0105ce\/asynchroniczne, optymalizacja wywo\u0142a\u0144 ko\u0144cowych.<\/td>\n<\/tr>\n<tr>\n<td>Styl bezpo\u015bredni<\/td>\n<td>Niejawnie, funkcja wraca do osoby wywo\u0142uj\u0105cej.<\/td>\n<td>Operacje synchroniczne\/blokuj\u0105ce.<\/td>\n<\/tr>\n<tr>\n<td>Wsp\u00f3\u0142programy<\/td>\n<td>Wsp\u00f3\u0142pracuj wielozadaniowo, umo\u017cliwiaj\u0105c funkcjom wstrzymywanie i wznawianie wykonywania.<\/td>\n<td>Z\u0142o\u017cony przep\u0142yw sterowania, wielozadaniowo\u015b\u0107 oparta na wsp\u00f3\u0142pracy.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Perspektywy na przysz\u0142o\u015b\u0107<\/h2>\n<p>CPS w dalszym ci\u0105gu odgrywa zasadnicz\u0105 rol\u0119 w konstruowaniu kodu asynchronicznego, szczeg\u00f3lnie w JavaScript. Wprowadzenie async\/await, czyli cukru syntaktycznego w stosunku do Promises, mo\u017cna postrzega\u0107 jako rozw\u00f3j w stosunku do tradycyjnego CPS, zapewniaj\u0105cy lepsz\u0105 sk\u0142adni\u0119 i pozwalaj\u0105cy unikn\u0105\u0107 piek\u0142a wywo\u0142a\u0144 zwrotnych.<\/p>\n<p>W miar\u0119 jak aplikacje internetowe i serwerowe staj\u0105 si\u0119 coraz bardziej z\u0142o\u017cone, a wsp\u00f3\u0142bie\u017cno\u015b\u0107 staje si\u0119 coraz wa\u017cniejsza, CPS i inne paradygmaty programowania asynchronicznego prawdopodobnie stan\u0105 si\u0119 jeszcze wa\u017cniejsze. Trwaj\u0105 badania nad ulepszeniem j\u0119zyk\u00f3w programowania i system\u00f3w wykonawczych, aby lepiej wspiera\u0107 te paradygmaty.<\/p>\n<h2>Serwery proxy i CPS<\/h2>\n<p>Serwery proxy dzia\u0142aj\u0105 jako po\u015brednicy dla \u017c\u0105da\u0144 klient\u00f3w poszukuj\u0105cych zasob\u00f3w z innych serwer\u00f3w. Podczas obs\u0142ugi wsp\u00f3\u0142bie\u017cnych \u017c\u0105da\u0144 klient\u00f3w serwer proxy mo\u017ce u\u017cywa\u0107 CPS lub podobnych paradygmat\u00f3w programowania asynchronicznego do zarz\u0105dzania tymi \u017c\u0105daniami bez blokowania, poprawiaj\u0105c w ten spos\u00f3b przepustowo\u015b\u0107 i wydajno\u015b\u0107.<\/p>\n<h2>powi\u0105zane linki<\/h2>\n<ol>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Continuation-passing_style\" target=\"_new\" rel=\"noopener nofollow\">Styl kontynuacji-przej\u015bcia na Wikipedii<\/a><\/li>\n<li><a href=\"https:\/\/www.cs.utah.edu\/plt\/publications\/icfp07-fyff.pdf\" target=\"_new\" rel=\"noopener nofollow\">Sztuka kontynuatora<\/a><\/li>\n<li><a href=\"https:\/\/www.microsoft.com\/en-us\/research\/publication\/a-history-of-haskell-being-lazy-with-class\/\" target=\"_new\" rel=\"noopener nofollow\">Historia Haskella: lenistwo z klas\u0105<\/a><\/li>\n<\/ol>","protected":false},"featured_media":468006,"menu_order":0,"template":"","meta":{"_acf_changed":false,"content-type":"","inline_featured_image":false,"footnotes":""},"class_list":["post-476419","wiki","type-wiki","status-publish","has-post-thumbnail","hentry"],"acf":{"faq_title":"Frequently Asked Questions about <mark>A Deep Dive into Continuation-passing Style (CPS)<\/mark>","faq_items":[{"question":"What is Continuation-passing Style (CPS)?","answer":"<p>Continuation-passing Style (CPS) is a method of managing control flow in computer programming. Instead of returning a value to the caller in the usual way, functions in CPS receive an extra argument (often termed as \"continuation\") representing what should happen after the function finishes its computation.<\/p>"},{"question":"When was Continuation-passing Style (CPS) first mentioned?","answer":"<p>The concept of Continuation-passing Style (CPS) was first introduced by computer scientist Christopher Strachey in the 1960s when exploring denotational semantics, a framework for defining the meanings of programming languages.<\/p>"},{"question":"How does a Continuation-passing Style (CPS) function work?","answer":"<p>In CPS, every function receives an extra argument, representing the continuation of the program. When the function has computed its result, it \"returns\" this result by passing it to the continuation, making control flow explicit.<\/p>"},{"question":"What are the key features of Continuation-passing Style (CPS)?","answer":"<p>The key features of CPS include explicit control flow, increased flexibility, improved handling of non-blocking or asynchronous operations, and enhanced tail call optimization.<\/p>"},{"question":"What types of Continuation-passing Style (CPS) exist?","answer":"<p>There are mainly two types of continuations: direct style and continuation-passing style. In direct style, a function completes its execution and returns control to the calling function. In continuation-passing style, the function passes the result to a received continuation, making the control flow explicit.<\/p>"},{"question":"What are the main uses and problems related to CPS?","answer":"<p>CPS is mostly used in functional programming languages and for managing asynchronous operations. It's useful in JavaScript, particularly in Node.js, and languages like Scheme and Haskell. However, it can lead to problems like reduced code readability (due to callback hell) and increased code size. These can be mitigated by using Promises or async\/await in JavaScript and tail-call optimization in other languages.<\/p>"},{"question":"What is the future perspective of Continuation-passing Style (CPS)?","answer":"<p>CPS continues to be essential in structuring asynchronous code, with developments like async\/await in JavaScript improving upon traditional CPS. As web and server applications become more complex and concurrent, CPS and other asynchronous programming paradigms are likely to become more important.<\/p>"},{"question":"How are proxy servers related to Continuation-passing Style (CPS)?","answer":"<p>Proxy servers, acting as intermediaries for requests from clients seeking resources from other servers, might use CPS or similar asynchronous programming paradigms to manage concurrent client requests without blocking, thereby improving throughput and performance.<\/p>"}]},"_links":{"self":[{"href":"https:\/\/oneproxy.pro\/pl\/wp-json\/wp\/v2\/wiki\/476419","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/oneproxy.pro\/pl\/wp-json\/wp\/v2\/wiki"}],"about":[{"href":"https:\/\/oneproxy.pro\/pl\/wp-json\/wp\/v2\/types\/wiki"}],"version-history":[{"count":0,"href":"https:\/\/oneproxy.pro\/pl\/wp-json\/wp\/v2\/wiki\/476419\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oneproxy.pro\/pl\/wp-json\/wp\/v2\/media\/468006"}],"wp:attachment":[{"href":"https:\/\/oneproxy.pro\/pl\/wp-json\/wp\/v2\/media?parent=476419"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}