程序设计语言中的静态作用域(Static Scope)与动态作用域(Dynamic Scope)

静态作用域(Static Scope)与动态作用域(Dynamic Scope)

1. 静态与动态

  • 静态策略(static policy): 一个问题可以在编译时刻(compile time)决定的策略。
  • 动态策略(dynamic policy): 一个问题要在运行时刻(run time)做出决定的策略。

2. 静态作用域和块(block)结构

1)C语言中的静态作用域策略

  • 一个C程序由一个顶层的变量函数声明的序列组成
  • 函数内部可以声明变量,变量包含局部变量和参数,其作用域被限制在该函数内。
  • 名字x的一个顶层声明的作用域包括其后的所有程序。而若一个函数中也有一个x的声明,那么该函数中的关于x的相关语句就不在这个顶层声明的作用域内。

2)块结构(block)

  • 一对大括号 {} 包围起来的一个声明序列和一个语句序列。
  • 有着 1)中阐述的静态作用域策略。
Example 1: How static policy works
void main()
{
	// B1
	int a=1;
	int b=1;
	// B2
	{
		int b=2;
		//B3
		{
			int a=3;
			cout<<a<<b;
		}
		//B4
		{
			int b=4;
			cout<<a<<b;
		}
		cout<<a<<b;
	}
	cout<<a<<b;
}

声明作用阈
int a=1;B1-B3
int b=1;B1-B2
int b=2;B2-B4
int a=3;B3
int b=4;B4

3. 动态作用域

  • 受只要在程序执行时刻才能知道的因素的影响
  • 动态作用域策略:对于一个名字x的使用,指向的是最近被调用还没有终止声明了x的过程中的这个声明
Example 2-1: How dynamic policy works
#define a (x+1)
int x=2;

void fun1()
{
	int x=1;
	cout<<a<<endl;
}
void fun2()
{
	cout<<a<<endl;
}

void main()
{
	fun1();
	fun2();
}

//results
2
3
Example 2-2: How dynamic policy works
#define a (x+1)
int x=2;

void fun2()
{
	cout<<a<<endl;
}
void fun1()
{
	int x=1;
	cout<<a<<endl;
	fun2();
}

void main()
{
	fun1();
}

//results
2
2

4. 静态作用域和动态作用域的类比

某种意义上看该两种策略之间有个有趣的关系,即动态作用域处理时间段方式类似于静态作用域处理空间的方式。

  • 静态作用域寻找的声明位于最内层的、包含变量使用位置的单元中。
  • 动态作用域寻找的声明位于最内层的、包含变量使用时间的单元(过程调用)中。

Reference

大多数表述和例子直接来源于
VAho A, SLam M, Sethi R, etal. 编译原理 Compilers: Principles, Techniques, and Tools[M]. 第二版. 机械工业出版社.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值