{"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\/my\/wiki\/continuation-passing-style-cps\/","title":{"rendered":"Gaya hantaran berterusan (CPS)"},"content":{"rendered":"<p>Gaya laluan berterusan (CPS) ialah kaedah pengendalian aliran kawalan dalam pengaturcaraan komputer yang melibatkan penghantaran kawalan secara eksplisit melalui parameter fungsi.<\/p>\n<h2>Evolusi Gaya Lulus Berterusan (CPS)<\/h2>\n<p>Asal-usul gaya lulus-sambungan boleh dikesan kembali kepada perkembangan sains komputer teori, dan konsep sambungan itu sendiri mempunyai akar dalam kalkulus lambda. Sebutan eksplisit pertama &quot;Gaya terusan-lulus&quot; sebagai frasa dan penggunaannya dalam amalan telah diperkenalkan oleh saintis komputer Christopher Strachey pada tahun 1960-an. Dalam tempoh inilah dia dan rakan-rakannya meneroka semantik denotasi, rangka kerja untuk mentakrifkan makna bahasa pengaturcaraan.<\/p>\n<h2>Gaya Lulus Sambungan (CPS)<\/h2>\n<p>Gaya laluan berterusan (CPS) ialah satu bentuk organisasi program yang melibatkan penggunaan sambungan yang jelas. Sambungan ialah perwakilan keadaan program komputer pada satu masa tertentu, termasuk timbunan panggilan dan nilai pembolehubah.<\/p>\n<p>Dalam CPS, setiap fungsi menerima hujah tambahan, biasanya dinamakan &quot;samb&quot; atau &quot;k&quot;, yang mewakili kesinambungan atur cara-apa yang sepatutnya berlaku selepas fungsi selesai pengiraannya. Apabila fungsi telah mengira hasilnya, ia &quot;mengembalikan&quot; hasil ini dengan menghantarnya ke sambungan, bukannya mengembalikannya dengan cara biasa.<\/p>\n<p>Konsep ini boleh dilihat sebagai satu cara untuk membuat aliran kawalan jelas: bukannya memberikan kawalan secara tersirat kepada pemanggil apabila ia selesai, fungsi CPS melepasi kawalan dengan memanggil sambungan.<\/p>\n<h2>Struktur Gaya Lulus Sambungan (CPS)<\/h2>\n<p>Dalam konvensyen panggilan fungsi tradisional, apabila fungsi dipanggil, ia melaksanakan dan mengembalikan kawalan kepada pemanggil dengan nilai pulangan. Walau bagaimanapun, dalam gaya hantaran kesinambungan, kawalan dihantar secara eksplisit melalui parameter fungsi, sering disebut sebagai &quot;sambungan&quot;.<\/p>\n<p>Sambungan mewakili pengiraan yang lain. Iaitu, apabila fungsi menerima kesinambungan, ia melakukan beberapa operasi dan kemudian menghantar hasilnya kepada kesinambungan yang diterima. Oleh itu, dalam gaya hantaran berterusan, pulangan tidak pernah dilakukan secara tersirat.<\/p>\n<p>Fungsi CPS biasa dalam bahasa pseudo mungkin kelihatan seperti:<\/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>Salin 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>Fungsi &quot;tambah&quot; ini menjalankan operasi tambah dan kemudian menyerahkan hasilnya kepada sambungan.<\/p>\n<h2>Ciri-ciri Utama Gaya Lulus Berterusan (CPS)<\/h2>\n<ol>\n<li>\n<p><strong>Aliran Kawalan Eksplisit<\/strong>: Dalam CPS, aliran kawalan adalah eksplisit. Tiada kesan tindanan tersembunyi dan anda boleh melihat susunan pelaksanaan dengan jelas dalam kod.<\/p>\n<\/li>\n<li>\n<p><strong>Fleksibiliti<\/strong>: Memandangkan CPS memisahkan pengiraan daripada aliran kawalan, ia memberikan lebih fleksibiliti untuk memanipulasi aliran kawalan.<\/p>\n<\/li>\n<li>\n<p><strong>Operasi Tidak Menghalang<\/strong>: CPS sangat berguna dalam menguruskan operasi tidak menyekat atau tak segerak. Ia boleh digunakan untuk mengelakkan panggilan balik neraka dan mengurus senario aliran kawalan yang kompleks dalam kod tidak menyekat.<\/p>\n<\/li>\n<li>\n<p><strong>Pengoptimuman Panggilan Ekor<\/strong>: Bahasa yang menyokong pengoptimuman panggilan ekor boleh mendapat manfaat daripada CPS kerana ia mengubah semua panggilan menjadi panggilan ekor, yang boleh menjadi lebih cekap dari segi penggunaan memori.<\/p>\n<\/li>\n<\/ol>\n<h2>Jenis Gaya Lulus Sambungan (CPS)<\/h2>\n<p>Terdapat terutamanya dua jenis sambungan, <strong>gaya langsung<\/strong> dan <strong>gaya hantaran berterusan<\/strong>. Di bawah adalah perbandingan antara keduanya:<\/p>\n<table>\n<thead>\n<tr>\n<th>Gaya<\/th>\n<th>Penerangan<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Gaya Langsung<\/td>\n<td>Dalam gaya langsung, fungsi melengkapkan pelaksanaannya dan mengembalikan kawalan kepada fungsi panggilan. Nilai pulangan selalunya merupakan hasil pengiraan.<\/td>\n<\/tr>\n<tr>\n<td>Gaya berterusan-lulus<\/td>\n<td>Dalam CPS, fungsi menerima hujah tambahan, kesinambungan, dan menyerahkan hasilnya kepada kesinambungan ini. Aliran kawalan adalah eksplisit.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Penggunaan, Masalah dan Penyelesaian<\/h2>\n<p>CPS mendapati penggunaannya kebanyakannya dalam bahasa pengaturcaraan berfungsi dan dalam mengurus operasi tak segerak.<\/p>\n<ol>\n<li>\n<p><strong>JavaScript tak segerak<\/strong>: JavaScript, terutamanya dalam Node.js, menggunakan CPS untuk mengurus operasi tidak menyekat tak segerak. Panggilan balik dalam JavaScript adalah contoh CPS.<\/p>\n<\/li>\n<li>\n<p><strong>Pengaturcaraan Berfungsi<\/strong>: Bahasa seperti Skim dan Haskell menggunakan CPS untuk mengendalikan struktur kawalan seperti gelung dan pengendalian pengecualian.<\/p>\n<\/li>\n<\/ol>\n<p>Walau bagaimanapun, CPS boleh membawa kepada beberapa masalah:<\/p>\n<ul>\n<li><strong>Kebolehbacaan<\/strong>: CPS kadangkala boleh membawa kepada kod yang sukar dibaca dan difahami kerana panggilan balik neraka, terutamanya jika terdapat banyak panggilan balik bersarang.<\/li>\n<li><strong>Kecekapan<\/strong>: Transformasi CPS berpotensi meningkatkan saiz kod disebabkan oleh parameter tambahan dan panggilan fungsi.<\/li>\n<\/ul>\n<p>Penyelesaian untuk masalah ini ialah:<\/p>\n<ul>\n<li>guna <strong>Janji<\/strong> atau <strong>async\/menunggu<\/strong> dalam JavaScript untuk mengelakkan panggilan balik neraka dan meningkatkan kebolehbacaan.<\/li>\n<li>Menggunakan bahasa pengaturcaraan yang menyokong pengoptimuman panggilan ekor boleh mengurangkan kebimbangan kecekapan.<\/li>\n<\/ul>\n<h2>Perbandingan<\/h2>\n<p>Berikut ialah perbandingan CPS dengan paradigma pengaturcaraan lain:<\/p>\n<table>\n<thead>\n<tr>\n<th>Paradigma Pengaturcaraan<\/th>\n<th>Aliran Kawalan<\/th>\n<th>Use Case<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Gaya Lulus Sambungan (CPS)<\/td>\n<td>Eksplisit, dengan sambungan.<\/td>\n<td>Operasi tidak menyekat\/tak segerak, pengoptimuman panggilan ekor.<\/td>\n<\/tr>\n<tr>\n<td>Gaya Langsung<\/td>\n<td>Tersirat, fungsi kembali kepada pemanggil.<\/td>\n<td>Operasi segerak\/menyekat.<\/td>\n<\/tr>\n<tr>\n<td>Coroutines<\/td>\n<td>Bekerjasama berbilang tugas dengan membenarkan fungsi menjeda dan menyambung semula pelaksanaan.<\/td>\n<td>Aliran kawalan yang kompleks, multitasking koperatif.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Perspektif Masa Depan<\/h2>\n<p>CPS terus memainkan peranan penting dalam menstruktur kod tak segerak, terutamanya dalam JavaScript. Pengenalan async\/wait, iaitu gula sintaksis atas Janji, boleh dilihat sebagai perkembangan berbanding CPS tradisional, memberikan sintaks yang lebih baik dan mengelakkan panggilan balik neraka.<\/p>\n<p>Apabila aplikasi web dan pelayan menjadi lebih kompleks dan konkurensi menjadi lebih penting, CPS dan paradigma pengaturcaraan tak segerak yang lain mungkin menjadi lebih penting. Terdapat penyelidikan berterusan dalam menambah baik bahasa pengaturcaraan dan sistem masa jalan untuk menyokong paradigma ini dengan lebih baik.<\/p>\n<h2>Pelayan Proksi dan CPS<\/h2>\n<p>Pelayan proksi bertindak sebagai perantara untuk permintaan daripada pelanggan yang mencari sumber daripada pelayan lain. Apabila mengendalikan permintaan pelanggan serentak, pelayan proksi mungkin menggunakan CPS atau paradigma pengaturcaraan tak segerak yang serupa untuk mengurus permintaan ini tanpa menyekat, sekali gus meningkatkan daya pengeluaran dan prestasi.<\/p>\n<h2>Pautan Berkaitan<\/h2>\n<ol>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Continuation-passing_style\" target=\"_new\" rel=\"noopener nofollow\">Gaya hantaran kesinambungan di Wikipedia<\/a><\/li>\n<li><a href=\"https:\/\/www.cs.utah.edu\/plt\/publications\/icfp07-fyff.pdf\" target=\"_new\" rel=\"noopener nofollow\">Seni Penerus<\/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\">Sejarah Haskell: Menjadi Malas Dengan Kelas<\/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\/my\/wp-json\/wp\/v2\/wiki\/476419","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/oneproxy.pro\/my\/wp-json\/wp\/v2\/wiki"}],"about":[{"href":"https:\/\/oneproxy.pro\/my\/wp-json\/wp\/v2\/types\/wiki"}],"version-history":[{"count":0,"href":"https:\/\/oneproxy.pro\/my\/wp-json\/wp\/v2\/wiki\/476419\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oneproxy.pro\/my\/wp-json\/wp\/v2\/media\/468006"}],"wp:attachment":[{"href":"https:\/\/oneproxy.pro\/my\/wp-json\/wp\/v2\/media?parent=476419"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}