【问题标题】:Do mainstream programming languages today mostly use dynamic or static(lexical) scope?今天的主流编程语言主要使用动态或静态(词法)范围吗?
【发布时间】:2018-08-24 07:17:46
【问题描述】:

我已经阅读了this 的问题,并且我想我已经理解了最受好评的答案,但他说

因为基本上今天广泛使用的每种编程语言都使用 词法作用域

我也从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++ 是动态范围语言,是吗?大多数编程语言都使用静态作用域是真的吗?

【问题讨论】:

  • 该答案中的完整句子是这可能是一个非常陌生的概念,因为今天广泛使用的每种编程语言(可能除了 emacs lisp 之外)都使用词法范围让您认为其中包括 C 和 C++(如果它们不同,将很难忘记)
  • 所有这些函数都使用同一个全局变量。这没有显示动态范围。
  • 动态范围是当您引入一个新变量(即int x = 3)并且您调用的函数可以看到它时。在这里,您没有引入任何新变量,而是使用相同的全局变量。
  • 这里只有一个 x 定义,所以 static lexical scopingdynamic scoping 的行为无论如何都是一样的。 C 和 C++ 都使用静态词法作用域
  • 我真的认为你应该扩大你的语言词汇量并研究 LISP、SNOBOL、BASIC 和 ADA。并非所有语言都有范围规则。

标签: c++ c scope programming-languages


【解决方案1】:

您拥有的不是动态范围。您没有引入任何新变量,而是使用相同的全局变量。如果 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++ 使用静态词法作用域。

【讨论】:

  • 另一个有助于说明动态作用域和使一切全局化之间区别的有用点是在调用 dummy 函数之后添加另一个对 fun() 的调用。使用动态范围,输出应该是4,2,3,4,而只有一个全局变量的OP版本会产生4,2,3,3
  • 如果是动态的,输出应该是4 2 34 3 2?
  • 糟糕,应该是4 2 3。我弄错了顺序。已编辑。
猜你喜欢
  • 1970-01-01
  • 2014-12-12
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
相关资源
最近更新 更多