第七章 运行环境
源语言问题
存储组织
存储分配策略
访问非局部名字
参数传递
静态和动态
静态和动态的联系
名字和数据对象
数据对象的动态表示
名字的作用域
数据对象的存储分配
过程和活动
参数处理
运行时支撑程序包
源语言问题(1)
过程及其执行
过程定义:是一个声明,最简单形式是把一个标识符和一个语句联系起来
该标识符称为过程名
语句是过程体
函数:返回值的过程
过程调用
过程名出现在可执行语句中时,则称这个过程在这点被调用
调用者、被调用者和调用点
参数
形式参数:与局部变量有不同
实在参数:在调用点,将其传递给被调用的过程
源语言问题(2)
program sort ( input, output );
var a : array [ 0 .. 10 ] of integer;
procedure readarray;
var i : integer;
begin
for i := 1 to 9 read( a[i] )
end;
function partition ( m , n : integer );
var i , j , x , v : integer;
begin
….
end;
procedure quicksort( m , n : integer );
var i : integer;
begin
if ( n > m ) then begin
i := partiton(m , n); quicksort( m , i – 1 ); quicksort( i + 1 , n );
end
end;
begin
a[ 0 ] := -9999; a[ 10 ] := 9999; readarray; quicksort( 1 , 9 )
end.
源语言问题(3)
过程的执行的表示:活动树
控制流的假设
控制流是连续的
过程的每次执行都从过程体的起点开始,最后控制返回到直接跟随本次调用点的位置
过程间的控制流可以用树表示(调用树)
活动:过程体的一次执行
活动的生存期:过程体执行的第一步和最后一步之间的步序列
包括直接或间接被这个过程调用的其它过程的时间
过程的活动的生存期要么是不重叠的,要么是嵌套的
递归:如果一个过程的前一个活动结束前,它的一个新的活动又开始
递归的两种缘起
源语言问题(4)
活动树描述控制进入和离开活动:
每个结点代表过程的一个活动
根结点代表主程序的活动
结点a是结点b的父结点,当且仅当控制流从a的活动进入b
a结点处于b结点的左边,当且仅当a的生存期先于b的生存期
结点和活动是一一对应的
源语言问题(5)
幻灯片4中程序的活动树
源语言问题(6)
控制栈
控制栈用于保存活跃着的过程
栈的内容表示活动树上到根结点的一条路径
源语言问题(7)
名字与数据对象
声明的作用域
区分同名程序声明:最接近的嵌套规则
int a , b;
int *p;
int foo( int a )
{
int b, c;
char *p;
p = malloc( sizeof( char ) );
b = foo( 1 ); …
}
作用域:一个声明起作用的程序部分称为该声明的作用域
局部和非局部:过程中名字的出现,如果是在该过程的一个声明的作用域内,则这个出现称为局部于该过程
源语言问题(8)
名字的结合
程序中声明的名字和动态数据对象的关系
数据对象是保存值的存储单元
一个名字可能代表不同的数据对象
环境:表示将名字映射到存储单元(即名字的左值)的函数
状态:表示将存储单元映射到它所保存的值(即名字的右值)的函数
赋值操作只改变状态,但不改变环境
结合:如果环境把存储单元s联系到名字x,则称x结合到s,这个联系本身称为x的结合
静态概念动态概念
过程的定义过程的活动
名字的声明名字的结合
声明的作用域结合的生存期
研究生院第七章 来自淘豆网www.taodocs.com转载请标明出处.