理解CPS
2015-08-20 本文已影响983人
80s老人
**CPS就是 continuation-passing style **
;普通形式
(define (pyth x y) (sqrt (+ (* x x) (* y y))))
;CPS形式
(define (pyth& x y k)
(*& x x (lambda (x2)
(*& y y (lambda (y2)
(+& x2 y2 (lambda (x2py2)
(sqrt& x2py2 k))))))))
看到没有CPS形式都有一个回调函数,也叫 its continuation .所以pyth函数在最后一步执行了回调函数k,参数来源于前面几部的结果 所以CPS又叫尾递归
那好处是什么呢 ,我的理解就是在执行最后一步回调函数k之前,堆栈中的所有空间都可以清空,留给函数k。
这样我们把如果能把复杂问题用尾递归的形式来表达,意味着整个程序的控制流都被你这个函数显式的描述了。
再来思想跳跃一下,这个的终极应用是什么呢,如果我们的编译器可以将我们的程序通过某种变换全部转为CPS形式,这样复杂的递归问题就会变为,最后一步简单优化为Goto 的问题,明白了没有,但编译原理还不止这些,但CPS变换绝对是这里面很关键的概念。