静态与动态

静态/动态(static/dynamic)

  • 静态:支持编译器静态决定某个问题(编译期 compile time)

  • 动态:只允许在程序运行时刻作出决定(运行时 run time)

作用域(scope)

  • x 的作用域指程序的一个区域,在其中对x 的使用都指向这个声明

  • 静态作用域编译期即可决定作用域(仅通过阅读程序就可以确定一个声明的作用域),也叫词法作用域(lexical scope),大部分语言(如C和Java)使用静态作用域。

  • 动态作用域(dynamic scope):运行时才可决定作用域,程序运行时,同一个对x 的使用会指向x 的几个声明中的某一个。

比如Java类声明中术语static 的使用:public static int x;

指明变量的存放位置可静态确定

  • 这里static 不是指变量的作用域,而是编译器确定用于存放声明变量的内存位置的能力

  • 不管创建了多少个这个类的对象只存在一个x 的拷贝

  • 反之,如果去掉static ,那么这个类的每个对象都有它自己的用于存放x 的位置,编译器无法在运行前确定所有这些位置

环境与状态

  • 环境:是从名字到存储位置的映射

  • 状态:从存储位置到它们值的映射

静态作用域和块结构

C语言使用静态作用域,C语言程序由顶层的变量、函数声明组成,函数内部可以声明变量(局部变量/参数),这些声明的作用域在它出现的函数内,一个顶层声明的作用域包括其后的所有程序

  • 作用域规则基于程序结构,声明的作用域由它在程序中的位置决定

  • 后面出现的语言(如C++、Java、C#),也通过public、private、protected 进行明确控制

  • 块(block)是声明和语句的一个组合

C语言使用{} 来界定一个块。

规则:如果名字x 的声明D 属于块B ,那么D 的作用域包括整个B ,但是嵌套在B 中的B' 如果重新声明了x ,则不在此作用域中。

Last updated