静态与动态
静态/动态(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