今天的主流编程语言主要使用动态还是静态(词法)作用域?

Do mainstream programming languages today mostly use dynamic or static(lexical) scope?

我已经阅读了 this 问题,我想我已经理解了投票最多的答案,但他说

since basically every programming language in wide use today uses lexical scoping

我也是从 coursera programming language 那里听说的,但这里有一个简单的 C 代码:

#include <stdio.h>

int x = 1;

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

void dummy1(){
    x = 2;
    fun();
}

void dummy2(){
    x = 3;
    fun();
}


int main(){

    x = 4;

    fun();
    dummy1();
    dummy2();

    return 0;
}

输出:

4
2
3

C++ 具有完全相同的行为,所以我认为 C 和 C++ 是动态作用域语言,对吗?大多数编程语言都使用静态作用域是真的吗?

您拥有的不是动态范围。您没有引入任何新变量,而是使用相同的全局变量。如果 C 和 C++ 有动态作用域那么这个(注意每个 x 是一个新变量):

#include <stdio.h>

int x = 1;

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

void dummy1(){
    int x = 2;
    fun();
}

void dummy2(){
    int x = 3;
    fun();
}


int main(){

    int x = 4;

    fun();
    dummy1();
    dummy2();

    return 0;
}

会输出

4
2
3

而是 it outputs

1
1
1

因为 fun() 总是使用初始化为 1 的相同全局 x。这是因为 C 和 C++ 使用静态词法范围。