Compiler construction 为什么编译器更喜欢词法作用域?

Compiler construction 为什么编译器更喜欢词法作用域?,compiler-construction,scope,lexical-scope,Compiler Construction,Scope,Lexical Scope,词法作用域如何帮助编译器?它对编译或优化有帮助吗?词法范围对编译器或优化代码没有帮助。这是一个语言设计决策。请参阅以获得更多解释。我确实认为词法范围有助于编译器和优化。这取决于你所说的帮助是什么意思 词法或静态作用域允许编译器在本地引用变量时证明变量的可用性,这意味着在其词法上下文中。它必须在引用变量的方法的范围内 要在动态范围环境中这样做,必须考虑所有调用上下文,因为函数知道其调用上下文也知道的所有变量。为了确保变量可供引用,在编译时需要对所有调用上下文进行递归回溯 因为这非常复杂,所以在编译

词法作用域如何帮助编译器?它对编译或优化有帮助吗?

词法范围对编译器或优化代码没有帮助。这是一个语言设计决策。请参阅以获得更多解释。

我确实认为词法范围有助于编译器和优化。这取决于你所说的帮助是什么意思

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

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

因为这非常复杂,所以在编译时会忽略它,在运行时抛出异常


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

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

动态范围,许多优化是不可能的,因为不能保证使优化成为可能的约束。 这在不保证存储大小或表示的动态语言中尤其重要

例如,动态类型语言的编译器可能能够获取装箱对象的链接列表,并将其替换为无符号8位字节数组,前提是它可以证明列表中的元素始终是0到255之间的整数。当您正确地使用静态范围时,这类事情很容易用静态范围来证明,并且会导致空间和计算效率的巨大增加

调试词汇范围的代码通常也更容易,因为在调试过程中更难跟踪动态变量。有一种意大利式的代码来定义事物的位置,类似于goto和过度使用全局变量所导致的问题。

非常简单地说,静态类型的语言有助于词汇(或静态)范围,动态类型的语言有助于动态范围

在动态范围中,变量的范围在运行时解析。如果声明为int的变量在另一个词汇环境中使用,其中具有相同名称的变量具有float类型。唯一的考虑是两个不同的变量,这意味着变量必须携带类型信息,在大多数静态类型系统中,类型信息根本不输入对象代码。一个程序只有在证明不会发生类型错误,并且不再需要类型信息的情况下才会简单地编译


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

请参阅48:00:可能没有时间观看整个过程。但听起来我需要上一两节课;-)与大多数语言设计决策一样,它对效率有很大影响。