网上看了很多内容,很少有给出一个准确的概念,它的英文全称是continuous passing style, 直译为连续传递样式,那么cps transform就是将一些原本不是continuous passing style代码变成cps代码,这是一种编译器的优化方式,当然你也可以手动来实现这种变换。cps变换常和递归调用关联在一起,因为有一种递归样式叫做尾递归,就是说,递归调用发生在函数的尾部,类似于function f(x){int y;return f(y);}这种样式,这么做有一个好处就是,可以进行尾调用优化,即编译器在处理这种尾递归函数的时候,在递归调用之前无须保存当前调用的现场,或者说无须参数压栈,这样就节省了内存,因为一些递归函数(非尾递归)常常会造成堆栈溢出,这时候cps变换就派上用场了,他可以将非尾递归的函数转化成尾递归的函数。

另外还有一些相互关联的概念,比如coroutine的实现,首先coroutine不是线程,它是在一个线程之内模拟了多任务,或者可以说它是在一个线程内模拟了操作系统的任务调度,javascript就是使用了这样一种机制

yield async wait这些概念都和coroutine有关,不同的语言有不同的实现

05-04 02:19