我现在正在读SICP,并不是真的理解SICP的5.5.6词汇寻址中所描述的词汇寻址的必要性。
因为它说“因为我们的语言是词法作用域的,所以任何表达式的运行时环境都会有一个类似于表达式出现的程序的词法结构的结构”,我认为在运行时环境中搜索变量的成本与在编译环境中搜索变量的成本是一样的。为什么我们要费心去实现编译环境呢?我认为编译环境将具有与程序的词法结构并行的相同结构,这与运行时环境相同,不是吗?
发布于 2012-06-17 11:52:17
词法寻址对于加快变量查找很有用。在没有词法寻址的情况下,查找变量需要遍历当前环境的框架,或者它的封闭环境的框架等等,所有这些都是在运行时进行的-因为我们根本不知道变量被绑定在哪里。这是书中提到的:
到目前为止,我们已经实现了查找我们的编译器,它生成使用计算器机器的
-variable-value操作的代码。这将通过将变量与当前绑定的每个变量进行比较来搜索变量,通过运行时环境逐帧向外工作。如果框架嵌套得很深,或者有很多变量,这种搜索的代价可能会很高。
相比之下,词法寻址查找过程确切地知道在编译时在哪里查找变量,从而大大减少了查找变量所需的时间:
lexical-address-lookup
将环境和由两个数字组成的词法地址作为参数:帧编号指定要传递的帧数,置换编号指定在该帧中传递的变量数。Lexical-address-lookup
将生成与当前环境相关的存储在该词法地址的变量的值。如果我们将lexical-address-lookup
操作添加到我们的机器中,我们可以让编译器使用这个操作而不是lookup-variable-value
.
生成引用变量的代码。
https://stackoverflow.com/questions/11068508
复制相似问题