第九章 运行的时存储空间组织.pptVIP

  • 2
  • 0
  • 约2.76千字
  • 约 17页
  • 2016-08-04 发布于湖北
  • 举报
第九章运行时存储空间组织 编译程序在完成词法、语法和语义分析后,在生成目标代码之前,需要把程序的静态正文和实现这个程序的运行时的活动联系起来,弄清楚将来在代码运行时刻,源代码中的各种变量、常量等用户定义的量是如何存放的,如何去访问它们。 * 本章主要内容 回顾目标程序运行时的活动 介绍一系列概念:过程、过程的活动、调用等 概述运行时存储器的划分 活动记录 存储分配策略 以pascal 、fortran 等为例,介绍静态存储分配、栈式分配、堆式分配(自学) * 9.1 目标程序运行时的活动 9.1.1 过程的活动 过程(函数):过程名和程序段组成 活动:一个过程的活动指的是该过程的一次执行。程序的每次执行都需要活动记录的支持,即需要在活动记录中保存活动执行中的信息,如形式单元、局部变量、包含该过程的外围过程和激活该活动的活动等内容。 活动的生存期:关于过程P一个活动的生存期,指的是从执行该构成体第一步操作到最后一步操作之间的操作序列,包括执行P时调用其他过程花费的时间。一般来说,术语“生存期”指的是在程序执行过程中若干步骤的一个顺序序列。 变量作用域:一个说明在程序里能起作用的范围成为该说明的作用域。根据变量的作用域范围进行活动记录的维护。 调用:过程名出现在执行语句中,称过程被调用。调用的结果是激活一个过程。 递归:在过程体中调用自身。递归使得同一过程对应不同的活动,从而使得程序中的名字对应于不同的存储单元 * 9.1.2 参数传递 参数:形式参数, 实参数等基本概念。 形参:过程定义中的参数 实参:过程调用时用到的参数、 问题:如何把实参传给形参? 方案: 传址:call by reference 得结果:call by result 传值: call by value 传名: call by name * 传址调用 特点:把实参地址传给形参 实现: 每个形参都有一个存储单元,称形式单元 参数传递:将实参的地址存放到形式单元中 实参是一个变量,直接传入变量的地址 实参是一个表达式,则先计算表达式的值,用临时单元存放该值,然后再传送临时单元的地址 形参的引用都是对形式单元的间接访问 * 得结果调用 特点:与传地址相似,但不等价 实现: 每个形参都有两个单元,第一单元存放实参的地址,第二单元存放实参的值, 参数传递:在过程体中对形参的任何引用或赋值都看成对它的第二单元的直接访问,但在过程工作完成返回前必须把第二单元的内容存放到第一单元所指的那个实参的单元之中 * 传值调用 调用段首先计算实参的值,并把它放到一个被调用段可以访问的地方 被调用段运行时,把这些值抄入到形式单元中 特点:被调用段不能改变实参的值 * 传名调用 特点:特殊的形—实参数的结合方式 过程调用把被调用段的代码抄到调用出现的地方,并把形参出现的地方替换成实参; 实现办法:在进入被调用段之前不计算实参的值,只有在使用相应的形参时才对它计值。 * 考虑下面的程序: ........... Var i:integer; a:array[1..2] of integer; procedure Q(b); Var b:integer; begin i:=1;b:=b+2; i:=2;b:=b+3 End; begin a[1]:=5;a[2]:=6;i:=1; Q(a[i]); print(a[1],a[2]) END. 试问:若参数传递的方式分别采用传地址和传值时,程序执行后输出a[1],a[2]的值是什么?传名?得结果? 解: 传地址:a[1]=10 , a[2]=6 传 值:a[1]=5 , a[2]=6 传 名:a[1]=7 , a[2]=9 得结果:a[1]=10 , a[2]=6 * 9.2 运行时存储器的划分 9.2.1 运行时存储器的划分 编译程序为了使它编译后得到的目标程序能够运行,要从操作系统中获得一块存储空间。 目标代码:可在编译时确定长度,并且运行过程中不变。对过程的不同活动共享同样的目标代码。 目标代码 静态数据 栈 堆 运行时存储空间的划分 * 9.2 运行时存储器的划分 9.2.1 运行时存储器的划分 编译程序为了使它编译后得到的目标程序能够运行,要从操作系统中获得一块存储空间。 静态数据:比如全局变量。把数据放到静态区的优点在于,可以在程序的编译过程中获得变量的相对地址,从而可以把这些地址编译到目标代码中,从而提高目标程序的执行效率。 目标代码 静态数据 栈 堆 运行时存储空间的划分 * 9.2 运行时存储器的划分 9.2.1 运行时存储器的划分 编译程序为了使它编译后得到的目标程序能够运行,要从操作系统中获得一块

文档评论(0)

1亿VIP精品文档

相关文档