Compiler construction 编译器和解释器在作用域方面有什么区别?

Compiler construction 编译器和解释器在作用域方面有什么区别?,compiler-construction,interpreter,Compiler Construction,Interpreter,我们说编译器的作用域是静态的,而解释器的作用域是动态的,那么这里的作用域这个词的意义是什么?为什么编译器的作用域是静态的,解释器的作用域是动态的 我们说编译器的作用域是静态的,而解释器的作用域是动态的 那不是真的。一种语言是动态作用域还是静态作用域是该语言的一个属性,而不是实现,为静态作用域的语言编写一个解释器(或者为动态作用域的语言编写一个编译器,但动态作用域的语言并不那么常见)是完全可能的(也是常见的) “范围”这个词在这里的意义是什么 变量的作用域描述了变量名称在程序的哪些部分引用该变量。

我们说编译器的作用域是静态的,而解释器的作用域是动态的,那么这里的作用域这个词的意义是什么?为什么编译器的作用域是静态的,解释器的作用域是动态的

我们说编译器的作用域是静态的,而解释器的作用域是动态的

那不是真的。一种语言是动态作用域还是静态作用域是该语言的一个属性,而不是实现,为静态作用域的语言编写一个解释器(或者为动态作用域的语言编写一个编译器,但动态作用域的语言并不那么常见)是完全可能的(也是常见的)

“范围”这个词在这里的意义是什么

变量的作用域描述了变量名称在程序的哪些部分引用该变量。因此,如果您在第23行定义了一个名为
x
的变量,在第42行定义了另一个名为
x
的变量,然后您在程序中的某个地方引用了
x
,则范围规则决定这是否引用了在第23行、42行定义的变量(在这种情况下,您通常会得到类似“变量x不在范围内”的结果)错误,具体取决于语言)

动态范围意味着函数
f
可以看到在调用
f
的其他函数中定义的任何变量。这是动态的,因为您无法确定(至少在一般情况下)哪个
f
(如果有)的定义在程序中给定位置的范围内,而不运行它。因此,超出范围的错误必须是运行时错误

静态作用域(也称为词法作用域)意味着变量在作用域中,当且仅当它在周围的块中定义时。这是一个静态属性,无需运行程序即可轻松检查(除非涉及其他动态特性,例如在运行时定义变量的能力),因此术语“静态范围”

为什么编译器是静态的,解释器是动态的

不是

我们说编译器的作用域是静态的,而解释器的作用域是动态的

那不是真的。一种语言是动态作用域还是静态作用域是该语言的一个属性,而不是实现,为静态作用域的语言编写一个解释器(或者为动态作用域的语言编写一个编译器,但动态作用域的语言并不那么常见)是完全可能的(也是常见的)

“范围”这个词在这里的意义是什么

变量的作用域描述了变量名称在程序的哪些部分引用该变量。因此,如果您在第23行定义了一个名为
x
的变量,在第42行定义了另一个名为
x
的变量,然后您在程序中的某个地方引用了
x
,则范围规则决定这是否引用了在第23行、42行定义的变量(在这种情况下,您通常会得到类似“变量x不在范围内”的结果)错误,具体取决于语言)

动态范围意味着函数
f
可以看到在调用
f
的其他函数中定义的任何变量。这是动态的,因为您无法确定(至少在一般情况下)哪个
f
(如果有)的定义在程序中给定位置的范围内,而不运行它。因此,超出范围的错误必须是运行时错误

静态作用域(也称为词法作用域)意味着变量在作用域中,当且仅当它在周围的块中定义时。这是一个静态属性,无需运行程序即可轻松检查(除非涉及其他动态特性,例如在运行时定义变量的能力),因此术语“静态范围”

为什么编译器是静态的,解释器是动态的

不是