什么是词法范围?

2022-08-29 22:27:06

什么是词法范围界定的简要介绍?


答案 1

我通过例子来理解它们。:)

首先,在类似 C 的语法中,词法作用域(也称为静态作用域):

void fun()
{
    int x = 5;

    void fun2()
    {
        printf("%d", x);
    }
}

每个内部级别都可以访问其外部级别。

还有另一种方法,称为 Lisp 的第一个实现所使用的动态作用域,同样采用类似 C 的语法:

void fun()
{
    printf("%d", x);
}

void dummy1()
{
    int x = 5;

    fun();
}

void dummy2()
{
    int x = 10;

    fun();
}

这里可以访问 或 ,或任何调用其中声明的函数中的任何函数。funxdummy1dummy2xfunx

dummy1();

将打印 5,

dummy2();

将打印 10。

第一个称为静态,因为它可以在编译时推导,第二个称为动态,因为外部作用域是动态的,并且依赖于函数的链调用。

我发现静态范围对眼睛来说更容易。大多数语言最终都以这种方式发展,甚至是Lisp(可以两者兼而有之,对吧?)。动态作用域类似于将所有变量的引用传递给被调用的函数。

作为为什么编译器无法推断出函数的外部动态范围的一个例子,请考虑我们的最后一个示例。如果我们这样写:

if(/* some condition */)
    dummy1();
else
    dummy2();

调用链取决于运行时条件。如果为 true,则调用链如下所示:

dummy1 --> fun()

如果条件为假:

dummy2 --> fun()

在这两种情况下,外部范围都是调用方加上调用方的调用方,依此类推fun

仅提一下,C语言不允许嵌套函数或动态范围。


答案 2

让我们尝试尽可能短的定义:

词法作用域定义了如何在嵌套函数中解析变量名称:即使父函数已返回,内部函数也包含父函数的作用域

这就是它的全部内容!