为什么编译器首选词汇范围?

时间:2009-06-09 17:17:58

标签: compiler-construction scope lexical-scope

词汇范围如何帮助编译器?它有助于编译或优化吗?

5 个答案:

答案 0 :(得分:2)

我认为词汇范围有助于编译和优化。这取决于你的帮助意味着什么。

词法或静态范围允许编译器在本地引用时证明变量的可用性,这意味着在其词汇上下文中。它必须在引用变量的方法范围内。

要在动态范围环境中执行此操作,必须考虑所有调用上下文,因为函数知道其调用上下文也知道的所有变量。为了确保变量可供参考,在编译时需要对所有调用上下文进行递归回溯。

由于这非常复杂,在编译时会省略它,在运行时抛出异常。

请参阅here:相比之下,在动态作用域中,首先搜索本地函数,然后搜索调用本地函数的函数,然后搜索调用该函数的函数,等等打开,调用堆栈。 “动态”是指变化,因为每次调用给定函数时调用堆栈都可能不同,因此函数可能会根据调用它的位置命中不同的变量。

答案 1 :(得分:1)

词法(或静态)作用域减少了编译器将文本正确转换为代码所需的信息量。它可以帮助编译,因为编译器不需要添加必须在运行时访问的其他信息(如动态作用域的情况)。对于优化,编译器不需要考虑其他范围中可能存在的变量,因为您可以访问局部变量或全局变量而不需要其他任何变量。

答案 2 :(得分:0)

词法范围无助于编译器或优化代码。这是一种语言设计决策。有关详细说明,请参阅this question

答案 3 :(得分:0)

对于动态范围,许多优化是不可能的,因为您无法保证使优化成为可能的约束。

这在不保证存储大小或表示的动态语言中尤其重要。

例如,动态类型语言的编译器可能能够获取盒装对象的链接列表,并将其替换为无符号8位字节数组,如果它可以证明列表的元素将始终是整数之间的整数当你正确使用它时,这种东西很容易用静态范围证明,并且可以在空间和计算效率方面造成巨大的增加。

调试词法范围的代码通常也更容易,因为动态变量在调试时很难跟踪。有一种意大利面条代码可以定义事物,类似于goto和过度使用全局变量引起的问题。

答案 4 :(得分:0)

非常简单地说,词法(或静态)范围有助于语言静态输入,动态范围有助于动态输入语言。

在动态范围中,变量的范围在运行时解析。如果声明为int的变量用于另一个词法环境,其中具有相同名称的变量的类型为float。唯一的是它要考虑它们两个不同的变量,这意味着变量必须携带类型信息,在大多数静态类型系统中,类型信息根本不会输入目标代码。程序只有在能够证明不会发生类型错误时才会编译,然后当然不再需要类型信息。

具有词法范围的动态语言通常需要使用堆而不是堆栈来为此分配运行时信息。