SICP第5章中词法寻址的优势是什么?

时间:2012-06-17 02:31:30

标签: compiler-construction scheme sicp lexical

我现在正在阅读SICP,并没有真正理解5.5.6词典寻址中描述的词汇寻址的必要性。

因为它说 “因为我们的语言是词法​​范围的,所以任何表达式的运行时环境都将具有与表达式出现的程序的词汇结构相似的结构”,我认为在运行时环境中搜索变量的成本相同在编译环境中搜索。 为什么我们懒得实现编译环境? 我认为编译环境将具有与程序的词法结构相同的结构,这与运行时环境相同,不是吗?

1 个答案:

答案 0 :(得分:10)

词法寻址对于加速变量查找很有用。没有词法寻址,查找变量需要遍历当前环境的框架或其封闭环境的框架等等,所有这些都在运行时 - 因为我们不知道变量绑定的位置,如果在所有。这在书中提到:

  

我们的编译器,到目前为止已经实现了它,它生成的代码使用了求值器机器的lookup-variable-value操作。这通过将变量与当前绑定的每个变量进行比较来搜索变量,在运行时环境中逐帧向外工作。如果框架是深层嵌套的,或者有很多变量,那么这种搜索可能会很昂贵。

相比之下,词法寻址查找的过程知道完全编译时找到变量的位置,大大减少了查找变量所需的时间:

  

lexical-address-lookup将环境和词法地址作为参数,该地址由两个数字组成:一个帧号,指定要传递的帧数,以及一个位移数,指定要传递的变量数。那个框架。 Lexical-address-lookup将生成相对于当前环境存储在该词法地址的变量的值。如果我们将lexical-address-lookup操作添加到我们的机器中,我们可以使编译器生成使用此操作引用变量的代码,而不是lookup-variable-value