起
随着 nodejs 的兴起,异步编程成为一种潮流,而异步也对编程风格带来了一些影响,典型的比如在客户端尚不明显的 cps 风格的大量出现:
getUser(function(){ // .... getItem(function(){ // ... }); })
回调嵌套带来性能,栈溢出,以及代码阅读上的一系列的问题,目前有不少解决方案,比如 promise 或引入新的编程原语. 但本次要介绍的是在上世纪60年代就提出来的一个概念 continuation,用来解决该问题。
承
continuation 是一种表达范围更广的概念,可用于实现 closure,generator 等动态语言常见的特性,甚至 goto ,而支持的语言也比较少,恰好 rhino 实现了 continuation,因此可以在 javascript 上做下演示,对比下传统的回调实现。
常见应用场景: 异步执行某些操作后再进行返回结构处理,一般实现如下(不解释):
function doSomethingAsynchronously(callback) { var t = new java.lang.Thread(new java.lang.Runnable() { run: function () { try { java.lang.Thread.sleep(1000); } catch (e) { print(e); } callback(1); } }); t.start(); } var cont = doSomethingAsynchronously(function (x) { print(x); });
可以看到已经引入了一个回调函数用来接收异步结果,即 cps 风格。
而如果用 continuation 来实现的话则是另外一种风格:
function makeRequest(cont) { var t = new java.lang.Thread(new java.lang.Runnable() { run: function () { try { java.lang.Thread.sleep(1000); } catch (e) { print(e); } cont(1); } }); t.start(); } function getContinuation() { return new Continuation(); } function doSomethingAsynchronously() { var x = 1; var cont = getContinuation(); if (cont instanceof Continuation) { x = 2; makeRequest(cont); } else { print('run'); cont += x; } return cont; } var cont = doSomethingAsynchronously(); if (typeof cont == 'number') { print(cont); }
其中 new Continuation() 产生一个 continuation 可调用对象,这个对象封装了当前代码执行处以及上下文(注意 rhino 记录的是 new Continuation() 所在函数的位置),当调用 continuation 对象后则相当于一个增强的 goto 调用,回到产生 continuation 对象的调用点,恢复上下文,并把参数值作为 continuation 对象的值后执行。
continuation 不仅可以解决 cps 带来的问题,也可以解决目前 web 开发多页面跳转无状态所带来的逻辑代码分散的问题(个人建议单页面 javascript 控制),在java端有 cocoon 框架(结合 rhino ),可以使用 continuation 记录上下文来达到传统客户端的开发体验:
function calculator() { var a, b, operator; cocoon.sendPageAndWait("getA.html"); a = cocoon.request.get("a"); cocoon.sendPageAndWait("getB.html"); b = cocoon.request.get("b"); cocoon.sendPageAndWait("getOperator.html"); operator = cocoon.request.get("op"); }
转
continuation 虽然有不少优点,但由于过于灵活,强大也会导致一些其他问题,例如 continuation 实现需要比 closure 记录更多的上下文信息,可能会对运行效率造成影响。另外如果滥用会造成 goto 语句一样的问题。
合
continuation 是一个表达力很强的功能,合理利用后能够形成新的编程风格从而改善可读性,维护性等问题,而随着 es6 generator 等的实现,javascript 也将受益。
相关推荐
内容概要:本文深入介绍了Continuation Passing Style (CPS) 在功能性编程中的应用。首先定义了尾调用和继续(continuation),并通过具体的函数示例讲解了如何将递归函数转换为尾递归形式。接着详细探讨了 CPS 函数...
CPS,全称为Continuation Passing Style(延续传递风格),是一种编程范式,它将控制流程的传递通过函数调用的参数来实现,而非传统的跳转指令。这种编程风格在函数式编程、编译器设计、异步编程等领域有着广泛的...
CPS,全称为Continuation Passing Style(延续传递风格),是一种编程范式,它将控制流程转化为函数调用的形式,使得程序的控制权通过函数参数的形式传递。在CPS中,函数不再直接返回结果,而是接受一个继续执行的...
CPS,全称为Continuation Passing Style(延续传递风格),是一种编程范式,它将控制流程转化为函数调用的形式,使得程序的控制权通过函数参数在各个函数之间传递。在CPS中,函数不再直接返回结果,而是接受一个代表...
CPS,全称为Continuation Passing Style(延续传递风格),是一种编程范式,它将函数调用的返回操作作为参数传递给另一个函数,而不是直接返回结果。这种编程风格在函数式编程语言中尤其常见,但也可以在命令式语言...
在IT行业中,CPS(Continuation Passing Style,延续传递风格)是一种编程范式,它将控制流通过函数调用的参数传递,而不是使用传统的返回机制。这种编程风格常见于函数式编程语言,但也可用于命令式语言。在这个...
CPS,全称为Continuation Passing Style(延续传递风格),是一种编程范式,它将函数调用的返回过程作为参数传递给另一个函数,而不是直接返回结果。这种编程方式在函数式编程语言中尤其常见,但也可以在命令式语言...
CPS,全称为Continuation Passing Style(延续传递风格),是一种编程范式,它将函数调用的返回操作作为参数传递给另一个函数,而不是直接返回结果。这种编程风格在某些领域,如编译器构造、异步编程和控制流管理等...
CPS,全称为Continuation Passing Style(延续传递风格),是一种编程范式,它将函数调用的返回操作作为参数传递给另一个函数,而不是直接返回结果。这种编程模式在处理异步操作、事件驱动编程以及优化编译器时非常...
标题中的“cps.zip_40_CPS_site:www.pudn.com_王垠40行代码”表明这是一个关于计算机编程的压缩文件,其中包含了王垠编写的40行代码,用于实现CPS(Continuation-Passing Style)转换。CPS是一种编程范式,常在函数...
CPS,全称为Continuation Passing Style(延续传递风格),是一种编程范式,它将函数调用的返回过程转化为传递一个函数作为参数。这种方式在处理异步操作、事件驱动编程、编译器构造等领域中有着广泛的应用。在这个...
“dotty-cps-async”是一个与Dotty编程语言相关的实验项目,主要涉及控制流转换(Continuation Passing Style, CPS)和异步编程。Dotty是Scala的未来版本,它旨在改进语言设计,提升编译器性能,并提供更现代的类型...
在编程领域,`CPS`(Continuation Passing Style,延续传递风格)是一种编程范式,它将函数调用的控制流转化为参数传递,常用于异步操作和错误处理。CPS通过将函数的返回值作为参数传递给另一个函数(即“延续”),...
在C#编程中,递归APS(Accumulator Passing Style)和CPS(Continuation Passing Style)模式是两种处理递归和控制流程的不同方法。理解并掌握这两种模式可以帮助开发者编写更高效、更灵活的代码。 首先,让我们...
"groovy-cps"是Groovy的一个重要概念,它涉及到Groovy代码的连续传递样式(Continuation Passing Style,CPS)执行。 连续传递样式是一种编程范式,它将函数调用的返回值作为参数传递给另一个函数,而不是直接返回...
JooseX.CPS-JavaScript的Continuation Passing Style 实现以及一些语法糖,简化了其在Joose方法和方法修饰符中的使用 概要 独立使用: UI.maskScreen("Please wait") TRY(function (url, data) { XHR....
在Nim编程语言中,CPS(Continuation-Passing Style,连续传递样式)是一种编程范式,它将控制流程转化为函数参数的传递。这种风格在处理异步操作、协程、并发和并行计算时非常有用。让我们深入探讨Nim中的CPS以及它...
本书深入探讨了延续传递风格(Continuation-passing style, 简称CPS)在编译过程中的应用及其相关优化技术。CPS是一种编程范式,它涉及将函数的控制权显式地转换为一个“延续”参数,允许编译器在不同的上下文中更...
CPS(Continuation-Passing Style)是一种编程范式,它将控制流转化为一系列的函数调用,每个函数接收一个“延续”(continuation)作为参数,这个延续实际上就是接下来要执行的操作。在C语言中使用CPS来实现...