{"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\/fr\/wiki\/continuation-passing-style-cps\/","title":{"rendered":"Style de passe de continuation (CPS)"},"content":{"rendered":"<p>Le style de transmission de continuation (CPS) est une m\u00e9thode de gestion du flux de contr\u00f4le dans la programmation informatique qui implique de transmettre le contr\u00f4le explicitement via un param\u00e8tre de fonction.<\/p>\n<h2>L&#039;\u00e9volution du style de passe de continuation (CPS)<\/h2>\n<p>Les origines du style de transmission de continuation remontent au d\u00e9veloppement de l&#039;informatique th\u00e9orique, et le concept de continuation lui-m\u00eame a ses racines dans le calcul lambda. La premi\u00e8re mention explicite du \u00ab\u00a0style de transmission de continuation\u00a0\u00bb en tant qu&#039;expression et de son utilisation dans la pratique a \u00e9t\u00e9 introduite par l&#039;informaticien Christopher Strachey dans les ann\u00e9es 1960. C&#039;est durant cette p\u00e9riode que lui et ses coll\u00e8gues exploraient la s\u00e9mantique d\u00e9notationnelle, un cadre permettant de d\u00e9finir la signification des langages de programmation.<\/p>\n<h2>D\u00e9ploiement du style de continuation-passe (CPS)<\/h2>\n<p>Le style de transmission de continuation (CPS) est une forme d&#039;organisation de programme qui implique l&#039;utilisation explicite de continuations. Une continuation est une repr\u00e9sentation de l&#039;\u00e9tat d&#039;un programme informatique \u00e0 un moment donn\u00e9, y compris la pile d&#039;appels et les valeurs des variables.<\/p>\n<p>Dans CPS, chaque fonction re\u00e7oit un argument suppl\u00e9mentaire, g\u00e9n\u00e9ralement nomm\u00e9 \u00ab cont \u00bb ou \u00ab k \u00bb, qui repr\u00e9sente la suite du programme \u2013 ce qui devrait se passer une fois que la fonction a termin\u00e9 son calcul. Lorsque la fonction a calcul\u00e9 son r\u00e9sultat, elle \u00ab renvoie \u00bb ce r\u00e9sultat en le passant \u00e0 la suite, au lieu de le renvoyer de la mani\u00e8re habituelle.<\/p>\n<p>Le concept peut \u00eatre vu comme un moyen de rendre explicite le flux de contr\u00f4le\u00a0: au lieu de passer implicitement le contr\u00f4le \u00e0 l&#039;appelant lorsqu&#039;il termine, une fonction CPS passe le contr\u00f4le en appelant la continuation.<\/p>\n<h2>La structure du style de continuation-passe (CPS)<\/h2>\n<p>Dans la convention traditionnelle d&#039;appel de fonction, lorsqu&#039;une fonction est appel\u00e9e, elle s&#039;ex\u00e9cute et renvoie le contr\u00f4le \u00e0 l&#039;appelant avec une valeur de retour. Cependant, dans le style de transmission de continuation, le contr\u00f4le est pass\u00e9 explicitement via un param\u00e8tre de fonction, souvent appel\u00e9 \u00ab continuation \u00bb.<\/p>\n<p>La suite repr\u00e9sente le reste du calcul. Autrement dit, lorsqu&#039;une fonction re\u00e7oit une continuation, elle effectue certaines op\u00e9rations puis transmet le r\u00e9sultat \u00e0 la continuation re\u00e7ue. Ainsi, dans le style de transmission de continuation, le retour n&#039;est jamais effectu\u00e9 implicitement.<\/p>\n<p>Une fonction CPS typique dans un pseudo-langage pourrait ressembler \u00e0\u00a0:<\/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>Copier le code<\/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>Cette fonction \u00ab ajouter \u00bb effectue une op\u00e9ration d&#039;addition puis transmet le r\u00e9sultat \u00e0 la suite.<\/p>\n<h2>Principales caract\u00e9ristiques du style de passe de continuation (CPS)<\/h2>\n<ol>\n<li>\n<p><strong>Flux de contr\u00f4le explicite<\/strong>: Dans CPS, le flux de contr\u00f4le est explicite. Il n&#039;y a pas de trace de pile cach\u00e9e et vous pouvez voir clairement l&#039;ordre d&#039;ex\u00e9cution dans le code.<\/p>\n<\/li>\n<li>\n<p><strong>La flexibilit\u00e9<\/strong>: \u00c9tant donn\u00e9 que CPS dissocie le calcul du flux de contr\u00f4le, il offre plus de flexibilit\u00e9 pour manipuler le flux de contr\u00f4le.<\/p>\n<\/li>\n<li>\n<p><strong>Op\u00e9rations non bloquantes<\/strong>: CPS est tr\u00e8s utile pour g\u00e9rer les op\u00e9rations non bloquantes ou asynchrones. Il peut \u00eatre utilis\u00e9 pour \u00e9viter l\u2019enfer des rappels et g\u00e9rer des sc\u00e9narios de flux de contr\u00f4le complexes dans un code non bloquant.<\/p>\n<\/li>\n<li>\n<p><strong>Optimisation des appels de queue<\/strong>: Les langages qui prennent en charge l&#039;optimisation des appels de fin peuvent b\u00e9n\u00e9ficier du CPS car il transforme tous les appels en appels de fin, ce qui peut \u00eatre plus efficace en termes d&#039;utilisation de la m\u00e9moire.<\/p>\n<\/li>\n<\/ol>\n<h2>Types de style de passe de continuation (CPS)<\/h2>\n<p>Il existe principalement deux types de suites, <strong>style direct<\/strong> et <strong>style de passage de continuation<\/strong>. Ci-dessous une comparaison entre les deux\u00a0:<\/p>\n<table>\n<thead>\n<tr>\n<th>Style<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Style direct<\/td>\n<td>Dans le style direct, une fonction termine son ex\u00e9cution et rend le contr\u00f4le \u00e0 la fonction appelante. La valeur de retour est souvent un r\u00e9sultat de calcul.<\/td>\n<\/tr>\n<tr>\n<td>Style de passe de continuation<\/td>\n<td>En CPS, la fonction re\u00e7oit un argument suppl\u00e9mentaire, la suite, et passe le r\u00e9sultat \u00e0 cette suite. Le flux de contr\u00f4le est explicite.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Utilisation, probl\u00e8mes et solutions<\/h2>\n<p>CPS trouve son utilisation principalement dans les langages de programmation fonctionnels et dans la gestion des op\u00e9rations asynchrones.<\/p>\n<ol>\n<li>\n<p><strong>JavaScript asynchrone<\/strong>: JavaScript, notamment dans Node.js, utilise CPS pour g\u00e9rer les op\u00e9rations asynchrones non bloquantes. Les rappels en JavaScript sont des exemples de CPS.<\/p>\n<\/li>\n<li>\n<p><strong>Programmation fonctionnelle<\/strong>: Des langages comme Scheme et Haskell utilisent CPS pour g\u00e9rer les structures de contr\u00f4le telles que les boucles et la gestion des exceptions.<\/p>\n<\/li>\n<\/ol>\n<p>Cependant, le CPS peut entra\u00eener certains probl\u00e8mes\u00a0:<\/p>\n<ul>\n<li><strong>Lisibilit\u00e9<\/strong>: CPS peut parfois conduire \u00e0 un code difficile \u00e0 lire et \u00e0 comprendre en raison de l&#039;enfer des rappels, surtout s&#039;il y a beaucoup de rappels imbriqu\u00e9s.<\/li>\n<li><strong>Efficacit\u00e9<\/strong>: La transformation CPS peut potentiellement augmenter la taille du code en raison de param\u00e8tres suppl\u00e9mentaires et d&#039;appels de fonction.<\/li>\n<\/ul>\n<p>Les solutions \u00e0 ces probl\u00e8mes sont :<\/p>\n<ul>\n<li>Utiliser <strong>Promesses<\/strong> ou <strong>asynchrone\/attendre<\/strong> en JavaScript pour \u00e9viter l&#039;enfer des rappels et am\u00e9liorer la lisibilit\u00e9.<\/li>\n<li>L\u2019utilisation de langages de programmation prenant en charge l\u2019optimisation des appels finaux peut att\u00e9nuer les probl\u00e8mes d\u2019efficacit\u00e9.<\/li>\n<\/ul>\n<h2>Comparaisons<\/h2>\n<p>Voici une comparaison du CPS avec d\u2019autres paradigmes de programmation\u00a0:<\/p>\n<table>\n<thead>\n<tr>\n<th>Paradigme de programmation<\/th>\n<th>Flux de contr\u00f4le<\/th>\n<th>Cas d&#039;utilisation<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Style de passe de continuation (CPS)<\/td>\n<td>Explicite, avec suites.<\/td>\n<td>Op\u00e9rations non bloquantes\/asynchrones, optimisation des appels de queue.<\/td>\n<\/tr>\n<tr>\n<td>Style direct<\/td>\n<td>Implicite, la fonction retourne \u00e0 l&#039;appelant.<\/td>\n<td>Op\u00e9rations synchrones\/bloquantes.<\/td>\n<\/tr>\n<tr>\n<td>Coroutines<\/td>\n<td>Effectuez plusieurs t\u00e2ches de mani\u00e8re coop\u00e9rative en permettant aux fonctions de suspendre et de reprendre l&#039;ex\u00e9cution.<\/td>\n<td>Flux de contr\u00f4le complexe, multit\u00e2che coop\u00e9ratif.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Perspectives d&#039;avenir<\/h2>\n<p>CPS continue de jouer un r\u00f4le essentiel dans la structuration du code asynchrone, notamment en JavaScript. L&#039;introduction de async\/await, qui est un sucre syntaxique par rapport \u00e0 Promises, peut \u00eatre consid\u00e9r\u00e9e comme un d\u00e9veloppement par rapport au CPS traditionnel, offrant une meilleure syntaxe et \u00e9vitant l&#039;enfer des rappels.<\/p>\n<p>\u00c0 mesure que les applications Web et serveur deviennent plus complexes et que la concurrence devient plus importante, le CPS et d&#039;autres paradigmes de programmation asynchrone vont probablement devenir encore plus importants. Des recherches sont en cours pour am\u00e9liorer les langages de programmation et les syst\u00e8mes d&#039;ex\u00e9cution afin de mieux prendre en charge ces paradigmes.<\/p>\n<h2>Serveurs proxy et CPS<\/h2>\n<p>Les serveurs proxy servent d&#039;interm\u00e9diaire pour les demandes des clients recherchant des ressources aupr\u00e8s d&#039;autres serveurs. Lors du traitement des demandes client simultan\u00e9es, un serveur proxy peut utiliser CPS ou des paradigmes de programmation asynchrone similaires pour g\u00e9rer ces demandes sans blocage, am\u00e9liorant ainsi le d\u00e9bit et les performances.<\/p>\n<h2>Liens connexes<\/h2>\n<ol>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Continuation-passing_style\" target=\"_new\" rel=\"noopener nofollow\">Style de passage de continuation sur Wikip\u00e9dia<\/a><\/li>\n<li><a href=\"https:\/\/www.cs.utah.edu\/plt\/publications\/icfp07-fyff.pdf\" target=\"_new\" rel=\"noopener nofollow\">L&#039;art du continuateur<\/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\">Une histoire de Haskell\u00a0: \u00eatre paresseux avec la classe<\/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\/fr\/wp-json\/wp\/v2\/wiki\/476419","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/oneproxy.pro\/fr\/wp-json\/wp\/v2\/wiki"}],"about":[{"href":"https:\/\/oneproxy.pro\/fr\/wp-json\/wp\/v2\/types\/wiki"}],"version-history":[{"count":0,"href":"https:\/\/oneproxy.pro\/fr\/wp-json\/wp\/v2\/wiki\/476419\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oneproxy.pro\/fr\/wp-json\/wp\/v2\/media\/468006"}],"wp:attachment":[{"href":"https:\/\/oneproxy.pro\/fr\/wp-json\/wp\/v2\/media?parent=476419"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}