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

use*_*328 7 compiler-construction scheme sicp lexical

我现在正在阅读SICP,并不真正理解5.5.6词典寻址中描述的词法寻址的必要性.

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

Ósc*_*pez 10

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

正如我们迄今为止实现的那样,我们的编译器生成使用评估器机器的lookup-variable-value操作的代码.这通过将变量与当前绑定的每个变量进行比较来搜索变量,在运行时环境中逐帧向外工作.如果框架是深层嵌套的或者有许多变量,则此搜索可能很昂贵.

相比之下,词法寻址查找的过程确切地知道在编译时在哪里找到变量,大大减少了查找变量所需的时间:

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