- 1、本文档共39页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第七章 运行时刻环境 Code and Data在运行时如何组织? 两个问题: 存储分配 变量的访问 本章主要内容 存储管理——在代码生成之前,把静态的程序和实现程序运行时的活动联系起来。 活动记录(栈) 过程的一次执行称为过程的一次活动 过程的活动需要可执行代码和存放所需信息的存储空间,后者称为活动记录 讨论一个活动记录中的数据安排,以及程序执行过程中,所有活动记录的组织方式 Three kinds of runtime environments Fully static environment: FORTRAN77 Stack-Based environment:C C++ Fully dynamic environment:LISP 7.1 存储组织 典型的内存组织形式 存储区划分为块 目标代码 数据对象 堆 空闲内存 记录过程活动的控制栈的对应区域 7.2栈式分配 支持过程、函数 函数调用 7.2.1 活动树 活动:过程体 函数 的一次执行。 可以同时存在关于同一个程序的多个活动 如并发、递归调用 。 活动的生存期:活动存在的时间。 活动树:用树来描绘控制进入和离开活动的方式 例7.1 C的quicksort程序 C的quicksort程序(续) 程序的一次执行(活动) 例7.2 活动树和控制栈 活动树的特点 控制栈 运行时刻栈 当前活跃着的过程活动可以保存在一个栈中 由于活动的控制转移是“后进先出”,所以可以用栈来保存当前仍然存活的活动信息。 一个程序的执行顺序与对表示该执行的活动树的深度优先遍历一致。 7.2.2 活动记录(帧) 过程一次执行所需的信息保存在一块连续的存储区 每个活动记录的大小是固定的。 过程调用时保存信息的地址在编译时也是已知的。 一般的活动记录的布局 向下增长的活动记录 7.2.3 调用代码序列 过程调用和过程返回都需要执行一些代码来管理活动记录栈,保存或恢复机器状态等 过程调用序列 过程调用时执行的分配活动记录,把信息填入它的域中的代码 过程返回序列 过程返回时恢复机器状态,释放活动记录,使调用过程能够继续执行的代码 调用序列和返回序列常常都分成两部分,分处于调用过程和被调用过程中 调用者和被调用者之间的任务划分 过程p调用过程q的调用序列 p计算实参 p把返回地址和调用前top_sp的值存入q的活动记录中,建立q的访问链,根据局部数据域和临时数据域的大小增加增加top_sp的值 q保存寄存器的值和其它机器状态信息 q初始化局部数据,并开始执行过程体 过程p调用过程q的返回序列 q把返回值置入邻近p的活动记录的地方 q对应调用序列的步骤减小top_sp的值 q恢复寄存器和机器状态,返回p p根据参数个数与类型和返回值类型调整top_sp,然后取出返回值 过程的参数个数可变的情况 活动记录的长度在编译时不能确定的情况 7.3 对非局部名字的访问 语言的作用域规则决定了对非局部名字的访问 词法作用域规则(静态作用域) 根据程序的正文确定用于名字的声明 无过程嵌套的静态作用域(C语言) 有过程嵌套的静态作用域(Pascal语言) 动态作用域规则(Lisp语言) 根据当前的活动来决定用于名字的声明 7.3.1 程序块 程序块本身是含有局部变量声明的语句 可以嵌套 最近嵌套作用域规则 可以用栈式分配实现 并列程序块不会同时活跃 并列程序块的变量可以重叠分配 Static scope: block structure C语言的块结构 block ? declarations statements C++程序中的块 main int a 0; int b 0; int b 1; int a 2; printf “%d %d\n”, a, b ; int b 3; printf “%d %d\n”, a, b ; printf “%d %d\n”, a, b ; printf “%d %d\n”, a, b ; 7.3.2 无过程嵌套的静态作用域 C语言的过程定义不允许嵌套 一个名字的非局部引用一定在所有函数之外声明,在任何函数之外的所有名字的存储空间静态分配 因此,过程体中的非局部引用可以直接使用静态确定的地址 局部变量在栈顶的活动记录中,可以通过栈顶指针来访问,无须深入栈中取数据,无须访问链 例7-20 含有对a的非局部引用的C程序 int a[11]; readarray …a… int partition y, z int y, z; …a… quicksort m, n int m, n; … main …a… 7.4 参 数 传 递 形参和实参相关联的方法 传值调用 call-by-value 引用调用 call-by-ref
文档评论(0)