{"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\/es\/wiki\/continuation-passing-style-cps\/","title":{"rendered":"Estilo de pase de continuaci\u00f3n (CPS)"},"content":{"rendered":"<p>El estilo de paso de continuaci\u00f3n (CPS) es un m\u00e9todo para manejar el flujo de control en la programaci\u00f3n de computadoras que implica pasar el control expl\u00edcitamente a trav\u00e9s de un par\u00e1metro de funci\u00f3n.<\/p>\n<h2>La evoluci\u00f3n del estilo de paso continuo (CPS)<\/h2>\n<p>Los or\u00edgenes del estilo de paso de continuaci\u00f3n se remontan al desarrollo de la inform\u00e1tica te\u00f3rica, y el concepto de continuaciones en s\u00ed tiene sus ra\u00edces en el c\u00e1lculo lambda. La primera menci\u00f3n expl\u00edcita del \u201cestilo de paso de continuaci\u00f3n\u201d como frase y su uso en la pr\u00e1ctica fue introducida por el inform\u00e1tico Christopher Strachey en la d\u00e9cada de 1960. Fue durante este per\u00edodo que \u00e9l y sus colegas exploraban la sem\u00e1ntica denotacional, un marco para definir los significados de los lenguajes de programaci\u00f3n.<\/p>\n<h2>Estilo de paso de continuaci\u00f3n desplegado (CPS)<\/h2>\n<p>El estilo de paso de continuaci\u00f3n (CPS) es una forma de organizaci\u00f3n de programas que implica el uso expl\u00edcito de continuaciones. Una continuaci\u00f3n es una representaci\u00f3n del estado de un programa de computadora en un momento determinado, incluida la pila de llamadas y los valores de las variables.<\/p>\n<p>En CPS, cada funci\u00f3n recibe un argumento adicional, normalmente llamado &quot;cont&quot; o &quot;k&quot;, que representa la continuaci\u00f3n del programa: lo que deber\u00eda suceder despu\u00e9s de que la funci\u00f3n termine su c\u00e1lculo. Cuando la funci\u00f3n ha calculado su resultado, &quot;devuelve&quot; este resultado pas\u00e1ndolo a la continuaci\u00f3n, en lugar de devolverlo de la forma habitual.<\/p>\n<p>El concepto puede verse como una forma de hacer expl\u00edcito el flujo de control: en lugar de pasar el control impl\u00edcitamente a la persona que llama cuando finaliza, una funci\u00f3n CPS pasa el control llamando a la continuaci\u00f3n.<\/p>\n<h2>La estructura del estilo de paso de continuaci\u00f3n (CPS)<\/h2>\n<p>En la convenci\u00f3n tradicional de llamada a funciones, cuando se llama a una funci\u00f3n, se ejecuta y devuelve el control a la persona que llama con un valor de retorno. Sin embargo, en el estilo de paso de continuaci\u00f3n, el control se pasa expl\u00edcitamente a trav\u00e9s de un par\u00e1metro de funci\u00f3n, a menudo denominado &quot;continuaci\u00f3n&quot;.<\/p>\n<p>La continuaci\u00f3n representa el resto del c\u00e1lculo. Es decir, cuando una funci\u00f3n recibe una continuaci\u00f3n, realiza algunas operaciones y luego pasa el resultado a la continuaci\u00f3n recibida. Por lo tanto, en el estilo de paso de continuaci\u00f3n, el retorno nunca se realiza impl\u00edcitamente.<\/p>\n<p>Una funci\u00f3n CPS t\u00edpica en un pseudolenguaje podr\u00eda verse as\u00ed:<\/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>Copiar c\u00f3digo<\/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>Esta funci\u00f3n &quot;agregar&quot; realiza una operaci\u00f3n de suma y luego pasa el resultado a la continuaci\u00f3n.<\/p>\n<h2>Caracter\u00edsticas clave del estilo de paso de continuaci\u00f3n (CPS)<\/h2>\n<ol>\n<li>\n<p><strong>Flujo de control expl\u00edcito<\/strong>: En CPS, el flujo de control es expl\u00edcito. No hay ning\u00fan rastro de pila oculto y puede ver claramente el orden de ejecuci\u00f3n en el c\u00f3digo.<\/p>\n<\/li>\n<li>\n<p><strong>Flexibilidad<\/strong>: Dado que CPS desacopla el c\u00e1lculo del flujo de control, brinda m\u00e1s flexibilidad para manipular el flujo de control.<\/p>\n<\/li>\n<li>\n<p><strong>Operaciones sin bloqueo<\/strong>: CPS es muy \u00fatil para gestionar operaciones asincr\u00f3nicas o sin bloqueo. Se puede utilizar para evitar el infierno de las devoluciones de llamadas y gestionar escenarios complejos de flujo de control en c\u00f3digo sin bloqueo.<\/p>\n<\/li>\n<li>\n<p><strong>Optimizaci\u00f3n de llamadas de cola<\/strong>: Los lenguajes que admiten la optimizaci\u00f3n de llamadas finales pueden beneficiarse de CPS, ya que transforma todas las llamadas en llamadas finales, lo que puede ser m\u00e1s eficiente en t\u00e9rminos de uso de memoria.<\/p>\n<\/li>\n<\/ol>\n<h2>Tipos de estilo de paso de continuaci\u00f3n (CPS)<\/h2>\n<p>Existen principalmente dos tipos de continuaciones, <strong>estilo directo<\/strong> y <strong>estilo de paso de continuaci\u00f3n<\/strong>. A continuaci\u00f3n se muestra una comparaci\u00f3n entre los dos:<\/p>\n<table>\n<thead>\n<tr>\n<th>Estilo<\/th>\n<th>Descripci\u00f3n<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Estilo directo<\/td>\n<td>En el estilo directo, una funci\u00f3n completa su ejecuci\u00f3n y devuelve el control a la funci\u00f3n que la llama. El valor de retorno suele ser el resultado de un c\u00e1lculo.<\/td>\n<\/tr>\n<tr>\n<td>Estilo de paso de continuaci\u00f3n<\/td>\n<td>En CPS, la funci\u00f3n recibe un argumento adicional, la continuaci\u00f3n, y pasa el resultado a esta continuaci\u00f3n. El flujo de control es expl\u00edcito.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Uso, problemas y soluciones<\/h2>\n<p>CPS se utiliza principalmente en lenguajes de programaci\u00f3n funcionales y en la gesti\u00f3n de operaciones asincr\u00f3nicas.<\/p>\n<ol>\n<li>\n<p><strong>JavaScript asincr\u00f3nico<\/strong>: JavaScript, especialmente en Node.js, utiliza CPS para gestionar operaciones asincr\u00f3nicas sin bloqueo. Las devoluciones de llamada en JavaScript son ejemplos de CPS.<\/p>\n<\/li>\n<li>\n<p><strong>Programaci\u00f3n funcional<\/strong>: Lenguajes como Scheme y Haskell usan CPS para manejar estructuras de control como bucles y manejo de excepciones.<\/p>\n<\/li>\n<\/ol>\n<p>Sin embargo, el CPS puede provocar algunos problemas:<\/p>\n<ul>\n<li><strong>Legibilidad<\/strong>: CPS a veces puede generar c\u00f3digo dif\u00edcil de leer y comprender debido al infierno de las devoluciones de llamadas, especialmente si hay muchas devoluciones de llamadas anidadas.<\/li>\n<li><strong>Eficiencia<\/strong>: La transformaci\u00f3n CPS puede potencialmente aumentar el tama\u00f1o del c\u00f3digo debido a par\u00e1metros adicionales y llamadas a funciones.<\/li>\n<\/ul>\n<p>Las soluciones a estos problemas son:<\/p>\n<ul>\n<li>Usar <strong>Promesas<\/strong> o <strong>as\u00edncrono\/espera<\/strong> en JavaScript para evitar el infierno de las devoluciones de llamadas y mejorar la legibilidad.<\/li>\n<li>El uso de lenguajes de programaci\u00f3n que admitan la optimizaci\u00f3n de llamadas finales puede mitigar los problemas de eficiencia.<\/li>\n<\/ul>\n<h2>Comparaciones<\/h2>\n<p>Aqu\u00ed hay una comparaci\u00f3n de CPS con otros paradigmas de programaci\u00f3n:<\/p>\n<table>\n<thead>\n<tr>\n<th>Paradigma de programaci\u00f3n<\/th>\n<th>Flujo de control<\/th>\n<th>Caso de uso<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Estilo de paso de continuaci\u00f3n (CPS)<\/td>\n<td>Expl\u00edcito, con continuaciones.<\/td>\n<td>Operaciones sin bloqueo\/asincr\u00f3nicas, optimizaci\u00f3n de llamadas de cola.<\/td>\n<\/tr>\n<tr>\n<td>Estilo directo<\/td>\n<td>Impl\u00edcita, la funci\u00f3n regresa a la persona que llama.<\/td>\n<td>Operaciones s\u00edncronas\/de bloqueo.<\/td>\n<\/tr>\n<tr>\n<td>Corrutinas<\/td>\n<td>Realice m\u00faltiples tareas de forma cooperativa al permitir que las funciones hagan una pausa y reanuden la ejecuci\u00f3n.<\/td>\n<td>Flujo de control complejo, multitarea cooperativa.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Perspectivas futuras<\/h2>\n<p>CPS sigue desempe\u00f1ando un papel esencial en la estructuraci\u00f3n de c\u00f3digo asincr\u00f3nico, especialmente en JavaScript. La introducci\u00f3n de async\/await, que es az\u00facar sint\u00e1ctico sobre Promises, puede verse como un desarrollo con respecto al CPS tradicional, que proporciona una mejor sintaxis y evita el infierno de las devoluciones de llamadas.<\/p>\n<p>A medida que las aplicaciones web y de servidor se vuelven m\u00e1s complejas y la concurrencia se vuelve m\u00e1s importante, es probable que CPS y otros paradigmas de programaci\u00f3n asincr\u00f3nica se vuelvan a\u00fan m\u00e1s importantes. Se est\u00e1n realizando investigaciones para mejorar los lenguajes de programaci\u00f3n y los sistemas de ejecuci\u00f3n para respaldar mejor estos paradigmas.<\/p>\n<h2>Servidores Proxy y CPS<\/h2>\n<p>Los servidores proxy act\u00faan como intermediarios para las solicitudes de clientes que buscan recursos de otros servidores. Al manejar solicitudes de clientes simult\u00e1neas, un servidor proxy puede usar CPS o paradigmas de programaci\u00f3n asincr\u00f3nica similares para administrar estas solicitudes sin bloquearlas, mejorando as\u00ed el rendimiento y el rendimiento.<\/p>\n<h2>enlaces relacionados<\/h2>\n<ol>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Continuation-passing_style\" target=\"_new\" rel=\"noopener nofollow\">Estilo de paso de continuaci\u00f3n en Wikipedia<\/a><\/li>\n<li><a href=\"https:\/\/www.cs.utah.edu\/plt\/publications\/icfp07-fyff.pdf\" target=\"_new\" rel=\"noopener nofollow\">El arte del continuador<\/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\">Una historia de Haskell: ser vago con la clase<\/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\/es\/wp-json\/wp\/v2\/wiki\/476419","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/oneproxy.pro\/es\/wp-json\/wp\/v2\/wiki"}],"about":[{"href":"https:\/\/oneproxy.pro\/es\/wp-json\/wp\/v2\/types\/wiki"}],"version-history":[{"count":0,"href":"https:\/\/oneproxy.pro\/es\/wp-json\/wp\/v2\/wiki\/476419\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oneproxy.pro\/es\/wp-json\/wp\/v2\/media\/468006"}],"wp:attachment":[{"href":"https:\/\/oneproxy.pro\/es\/wp-json\/wp\/v2\/media?parent=476419"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}