才知道 CPS 是什么

2025-07-01

我意识到一个问题,我已经写过非常多的 nodejs 异步调用的代码了,无论是读取文件,还是调用接口,nodejs 里大量出现这种写法,比如:

fs.readFile("a.txt", (err, data) => {
  // do something
});

但是从来没有人告诉我这玩意儿叫 CPS!

为什么我感觉 CPS 这个东西非常神秘?因为传说中的 “王垠 40 行代码”,就是在做 “自动 CPS 变换” 这件事情。可以参考这两个链接查看相关的讨论:

那么为什么我最近又关注到 CPS 这个东西了呢?因为王垠有一个《continuation 和并发计算专项班》的课程,我没有学习但是好奇课程内容是什么,好奇这个 continuation 是什么意思。

continuation 是什么意思呢?CPS 的全称是 Continuation-Passing-Style,而我们已经熟知的 nodejs 里,已经无数次甚至默认都在使用 CPS 来实现异步调用!continuation 这个词变得不再神秘!

串起来了,很多东西都串起来了。

我现在为什么能发现并明白这些东西呢?因为我从基础班学到了很有效的学习方法,以及解决问题的思路。经过了基础班的学习,我知道该如何去面对一些难题了。甚至经过了基础班的学习,我可以自己设计一套 continuation 的课程,让自己学习和进一步练习。虽然我没有学习王垠老师的 “continuation 和并发计算专项班”,但是我感觉我能够猜出课程内容和风格,然后结合 ChatGPT 的帮助,我知道应该如何自己去深入学习 continuation 了。

那么也就是接下来的学习计划,我可以试着自己去从各个角度搞明白 continuation 相关的知识,当然这个过程要大量依赖于 ChatGPT。话说王垠曾经比较推崇 “苏格拉底问答” 式的学习方法,我跟 ChatGPT 聊天,岂不正好能达到这种学习效果?

我觉得有必要再次称赞一下在基础班中学到的东西,因为收获到的,不只是表面上的知识那么简单。如果没有参加基础班的学习,我肯定想不到,自己有信心去搞明白 continuation 这些东西,虽然现在还不明白,主要是了解的不够系统。然而经过了基础班的学习,我隐约已经知道接下来要具体怎么练习了,而不只是看懂!

至于在基础班一个月的学习历程,关于有效性的分析,得再加一句,一个月能学到多少知识呢?知识的多少不敢说,但是就像今天这样 “串起来了” 的感受,可是连一个月都不需要,也许只需要几分钟的时间,就能 “串起来”,把很多东西 “串起来”,突然感觉 “串起来”。我工作了这么多年,已经积攒了很丰富的一线开发的经验,基础班的课程不是让我拥有那些经验,而是让我能够把零碎的知识点和技能给串起来。