s
r
q(1,9)
p(1,9)
q(1,3)
p(1,3)
q(1,0)
q(2,3)
q(5,9)
p(2,3) q(2,1) q(3,3)
12
控制栈
活动树只是逻辑上存在 的——类似于语法分析树
13
栈和活动树的变化
s Sr S q(1.9) S q(1.9) p(1,9) S q(1.9) q(1,3) S q(1.9) q(1,3) p(1,3) S q(1.9) q(1,3) q(1,0) S q(1.9) q(1,3) q(2,3)
:= t2 – f
25
运行时刻存储分配策略
分配策略是:
静态分配; 栈式分配,或称栈式动态分配; 堆式分配,或称堆式动态分配。
采用哪种分配策略是由源语言的语义决定的。
26
静态存储分配
还能用控制栈进 行控制吗? 27
静态存储分配的局限
在编译时刻知道数据目标的大小和它们在内存位置 上的约束; 不能递归调用过程(一个过程的两个活动的生存期 不相交,一个过程的所有活动可以使用同一个活动记 录); 不能动态地建立数据结构。
22
活动记录
控制链:指向调用过程活动的活动 记录。 访问链:指向本活动要访问的非 局部数据所在的活动记录。 保存机器状态:调用过程活动在 调用点的机器状态,包括计数 器,各种寄存器的值。 局部数据:过程中定义的局部 量。 临时变量:编译产生。
返回值 实在参数
控制链 访问链
保存机器状态
局部数据
临时变量
23
编译时刻的局部数据的设计
PROCEDURE sub(x,y:real); VAR i ,j:integer; a:ARRAY[1..5] OF real; e, f : real; BEGIN …… f :=e+i*j; …… END;