在范围界定方面,编译器和解释器之间有什么区别?

时间:2018-02-18 13:47:22

标签: compiler-construction interpreter

我们说编译器的范围是静态的,而解释器的范围是动态的,所以这里的Scope这个词的意义是什么?为什么在编译器的情况下它是静态的,在解释器的情况下是动态的?

1 个答案:

答案 0 :(得分:2)

  

我们说编译器的范围是静态的,而解释器的范围是动态的

那不是真的。语言的动态或静态范围是语言的属性,而不是实现,并且为静态范围的语言(或者用于动态范围的语言的编译器)编写解释器是完全可能的(并且是常见的)。这很重要,但动态范围的语言并不常见。)

  

这里的范围是什么意思

变量的范围描述了程序的哪些部分变量的名称是指该变量。因此,如果您在第23行定义名为x的变量,在第42行定义另一个名为x的变量,然后在程序中的某处引用x,则作用域规则决定是否指向在第23,42行或两者都没有定义的变量(在这种情况下,你通常会得到类似"变量x不在范围内"错误,取决于语言)。

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

静态范围(也称为词法范围)表示当且仅当变量在周围块中定义时,变量才在范围内。这是一个静态属性,可以在不运行程序的情况下轻松检查(除非涉及其他动态功能,例如在运行时定义变量的能力),因此术语"静态范围"。

  

为什么在编译器时是静态的,在解释器的情况下是动态的

不是。