首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >块作用域和函数作用域语言

块作用域和函数作用域语言
EN

Software Engineering用户
提问于 2017-02-09 16:04:41
回答 1查看 1.4K关注 0票数 4

我注意到一些语言,如C、C++、Java、Perl和.NET Visual都有“块”作用域,这意味着变量将只定义在它所声明的特定代码块中。

例如,

(C++):

代码语言:javascript
复制
if (true) {
    int x = 1;
}
std::cout << x << std::endl;

此代码将无法编译,因为x仅在if语句创建的块作用域中可见。

错误:“X”未在此范围内声明

但是,像VBA、Python和Javascript这样的语言都有“基于函数”的作用域,这意味着创建新范围的唯一时间是定义新函数时。

例如,

(VBA):

代码语言:javascript
复制
If True Then
    Dim x As Integer
    x = 1
End If
MsgBox(x)

此代码成功运行,x的值在if语句之外可见。

这种类型的范围划分在我看来相当令人困惑,因为从视觉上看,x应该“属于”if语句。

因此,

提出了一个问题:除了看和感觉以外,还有什么其他的优势吗?比如性能优势/编译速度优势/等等.对于一种语言来说,它是“函数”作用域,而不是“块”作用域?

EN

回答 1

Software Engineering用户

回答已采纳

发布于 2017-02-09 17:18:43

理论上,函数作用域实际上应该更快--变量通常是在堆栈框架中创建的,函数作用域只创建该堆栈帧一次,而块作用域则需要在每个块中重复打开一个新的堆栈帧。

在实践中,有几个事实使最初的假设无效:

  1. 只有当一个特定的块实际到达时,编译器才被迫为一个块创建堆栈框架--而且大多数编译器都是这样做的--正在创建一个堆栈框架,为函数中的所有变量的超集保留空间。像C这样的语言只定义一个变量的编译时可访问性.因此,编译器必须确保禁止访问当前不在作用域中的变量--而不是根本不存在此变量。这是一条可以在编译时强制执行的规则。请注意,好的编译器甚至可以重用堆栈帧中的空间,该空间由具有不重叠作用域的变量使用,并将对堆栈帧中的所有变量进行排序和合并,以确保内存的最大重用。
  2. 如果编译器足够聪明,并且有足够的寄存器可用,块作用域可以更好地使用寄存器--因为块中的变量只需要有块的生存期,就可以更早地重用它们。

因此,从性能的角度来看,我并不认为这两种方法都有好处--正如上面指出的,即使语言要求块作用域,您也可以在技术上实现函数作用域。不过,这可能会浪费一些记忆。

然而,从程序员的角度来看,我确实看到了块作用域的明显优势(不过,这可能仅仅是因为我是使用C和C++等语言长大的)。

票数 8
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/341906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档