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

问题描述 投票:0回答:2

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

compiler-construction interpreter
2个回答
2
投票

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

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

这里的范围这个词有什么意义

变量的作用域描述了变量名称在程序的哪些部分引用该变量。因此,如果您在第 23 行定义了一个名为

x
的变量,并在第 42 行定义了另一个名为
x
的变量,然后您在程序中的某个位置引用了
x
,则作用域规则决定这是否引用第 23 行定义的变量、 42 或两者都不是(在这种情况下,您通常会收到类似“变量 x 不在范围内”的错误,具体取决于语言)。

动态作用域意味着函数

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

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

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

不是。


0
投票

许多解释性语言尝试“正确”地实现具有块作用域的词法闭包,但都失败了。

几乎正确是“容易”的,但完全正确很难。考虑这个例子:

let x = "global"
{
    function foo() {
        return x
    }
    let x = "local"
    println(foo())
}

将典型的编译语言的功能与典型的“词法范围”解释语言的功能进行比较。

© www.soinside.com 2019 - 2024. All rights reserved.