第七章节运行时刻环境.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第七章节运行时刻环境

第七章:运行时刻环境 第七章 运行时刻环境 概述 静态存储分配 动态存储分配 参数传递 7.1 概述 目标代码运行环境: 空间环境: 目标代码的运行都是在操作系统分配的一块存储区内进行的,这块存储区必须容纳目标代码和目标代码运行时的数据空间(目标代码中指令能访问的空间) 编译程序分配目标程序运行时的数据空间的基本依据是设计程序语言时对程序运行中存储空间的使用和管理办法的规定 寄存器环境: 寄存器是目标机器中的宝贵资源 如何分配寄存器提高程序运行的效率是代码生成器主要要解决的问题。(详细内容见代码生成) 数据空间分配和寄存器分配最后都体现在生成的目标代码中 7.1 概述 几种典型程序设计语言的特点 不同的语言有不同的分配数据空间的规定,有不同的组织运行时刻存储空间的方法 几种典型程序设计语言的特点与差异: 7.1 概述 名字的联编: 名字的左值 — 内存地址,存储名字的瞬时值 名字的右值 — 名字的瞬时值 名字的联编 — 将一个内存地址与一个名字联系起来 在程序的一次运行中,一个名字右值(瞬时值)可能会经常改变,一个名字也可能被联编到多个地址(如递归调用中) 运行时刻内存的典型划分: 操作系统收到运行目标程序的指令,分配一块连续的内存空间使目标程序在其上运行 运行时刻的内存的典型划分见P275 图6.6。 这只是一个典型的划分,具体语言不同,该划分也不同 栈:支持过程的递归调用 堆:支持动态内存申请 7.1 概述 过程的活动: 过程的一次完整执行(第一条语句到最后一条语句),称为过程的一次活动。即,每次执行一个过程体,就产生该过程的一个活动。 某过程的一个活动的生存期,指的是从执行该过程体第一步操作到最后一步操作之间的操作序列 活动记录: 是一段连续的存储区,用以存放过程的一次执行所需要的信息,如局部数据等 活动记录的结构见 P276 图6.7 参数域、状态域、数据域 说明每个域的内容与作用见P276下面的内容 这只是一个一般的结构,具体语言不同,活动记录的结构和内容也有差异 7.2 静态存储分配 静态存储分配: 所谓静态存储分配,即在编译时刻对源程序中的量分配固定单元,运行时始终不变。采用此分配策略时对语言的要求:①程序中每一个数据对象的大小在编译阶段能够确定;②程序运行过程中的给定时刻,每一个数据对象只允许存在一个实例(即限制递归过程的使用) 采用静态存储分配的典型语言是 FORTRAN FORTRAN: FORTRAN的特点:程序是段结构的,主程序段 + 若干子程序(函数)段;没有动态数据类型,每个名字所需空间是确定的;没有递归调用,无需栈区;没有动态数据结构(如链表),没有动态内存申请,无需堆区。因此,编译时可确定数据区大小,为每个名字分配好地址。 FORTRAN 程序运行时内存划分为目标代码区和静态数据区,没有栈区和堆区。参考图 6.8 给出的例子及图6.9其对应的内存划分。 7.3 动态存储分配 动态存储分配: 若程序设计语言允许递归调用、可变数组或可变数据结构,在编译时无法确定运行时需要的存储空间大小,只能在运行时动态地确定 在运行阶段动态地为源程序中的量分配存储空间;在编译阶段要为运行阶段设计好存储形式,为每一个数据项安排好它在数据区中的相对位置 动态存储分配包括:栈式存储分配和堆式存储分配 栈式存储分配的思想: 在运行空间中划分一块存储空间作为栈区 程序运行时每当调用一个过程,就将该过程的活动记录压入栈中,过程执行完毕将它的活动记录从栈中弹出 7.3 动态存储分配 简单的栈式存储分配的实现: 语言特点:没有分程序结构,过程定义不嵌套,但允许过程递归调用。 此时的分配策略:运行时,每当进入一个过程,则为该过程分配一段存储区,当一个过程工作完毕返回时,它所占用的存储区则释放。程序运行时的存储空间,在某一时刻可能会包含某个过程的几个活动记录(某个过程递归调用的情况);另外,同样的一个存储位置,可能不同运行时刻分配给不同的数据对象。 例子:假定有符合此语言的程序结构如下: 7.3 动态存储分配 此时的栈式存储分配情况描述: 7.3 动态存储分配 嵌套过程语言的栈式实现: 语言特点:允许过程嵌套定义。 此时的分配策略: 它的存储分配也是采用栈式动态分配策略,只是它的过程活动记录中应增设一些内容,用以解决对非局部变量的引用问题。 例子:参见书中P294的图 6.18。下面是过程sort调用了过程quiksort时的存储栈情况。 7.3 动态存储分配 存取链 是存取非局部变量的一种方法。 活动记录中的一个域,是一个指针,指向包含该过程的直接外层过程的最新活动记录的起始位置。 例子,假设对于书中P294的图6.18的程序,有如下的次序的调用: sort→quicksort →quicksort →

文档评论(0)

qiwqpu54 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档