我现在正在阅读SICP,并不太了解5.5.6 SICP的词法寻址中描述的词法寻址的必要性。
既然说
“由于我们的语言是词法范围的,所以任何表达式的运行时环境都将具有与表达式所在的程序的词法结构相似的结构”,我认为在运行时环境中搜索变量的成本与在编译环境中搜索。
我们为什么要费心实现一个编译环境?
我认为编译环境将具有与程序的词汇结构相同的结构,并且与运行时环境相同,不是吗?
最佳答案
词法寻址对于加快变量查找很有用。如果没有词法寻址,查找变量将需要在运行时遍历当前环境的框架或封闭环境的框架,等等,因为我们根本不知道变量的绑定位置。书中提到了这一点:
到目前为止,我们已实现的编译器生成的代码使用评估器计算机的lookup-variable-value操作。通过将其与当前绑定的每个变量进行比较来搜索变量,并在运行时环境中逐帧向外工作。如果框架深度嵌套或变量很多,此搜索可能会很昂贵。
相比之下,词法寻址查找过程准确地知道了在编译时在哪里查找变量,从而大大减少了查找变量所需的时间:
lexical-address-lookup
以一个环境和一个由两个数字组成的词法地址作为参数:一个框架编号,它指定要传递多少个框架;一个位移编号,它指定要在那个框架中传递多少个变量。 Lexical-address-lookup
将产生相对于当前环境存储在该词法地址处的变量的值。如果在计算机上添加lexical-address-lookup
操作,则可以使编译器生成使用此操作而不是lookup-variable-value
引用变量的代码。
关于compiler-construction - SICP第5章中的词法寻址有什么优势?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11068508/