将元循环求值器转换为寄存器机器语言,这样的求值器就是 显示控制求值器(explicit-control evaluator)。它能够清楚地向我们展示求值器中的存储管理、参数传递和控制机制。
在显示控制求值器中同样通过类似元循环求值器的 eval
程式的指令序列进行表达式类型判别,然后对不同类型的表达式进行不同的计算过程。其中需要注意的是为避免其他表达式计算过程中将当前表达式计算需要的数据清除,可以将相应的寄存器内容存入堆栈,所以在表达式的计算过程中需要仔细甄别需要推入堆栈的内容。
表达式的计算结果将存储于寄存器 val
中,exp
寄存器存储当前需要计算的表达式,env
记录当前表达式的计算环境,continue
记录表达式计算后返回的节点。除此之外 proc
、argl
和 unev
会用于计算复合表达式时的中间值存储。
另外显示控制求值器需要注意在程式调用时对尾递归的实现。如果不采用尾递归的方式会导致迭代过程的最后一个表达式计算的相应寄存器数据会留存在堆栈中,不断累积,最终导致堆栈溢出。也就是说可能导致无限循环程式的实现需要其他控制机制的参与。
通过模拟的方式运行寄存器机器不仅是观察它的运行结果,同时还要观察它的执行效率,其中标志性的数据来自堆栈的调用次数分析。
网友评论