网站大量收购独家精品文档,联系QQ:2885784924

程序设计语言 编译原理(第三版)第9章幻灯片.ppt

程序设计语言 编译原理(第三版)第9章幻灯片.ppt

  1. 1、本文档共38页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 9.5 嵌套过程语言的栈式实现 2.Par T T——为过程 ?为了使得过程T工作时能够知道过程P的display,必须在P把 T作为实参传递给Q的时候把P自身的display地址也传过去。 即:过程P中的par T的作用可刻画为建立如下所示的两个相继 临时单元: 第一个临时单元B1:过程T的入口地址; 第二个临时单元B2:现行的display地址。; 然后执行(i+1)[TOP]:=addr(B1) ?把第一临时单元B1的地址传给Q * 假定过程Q现在执行到调用语句call Z, m Z—形式参数,形式单元Z中已含有上述B1的地址 ? 故B1的内容将用来作为转子指令的目的地址 (即转进过程T) B2的内容将作为“全局display地址” (第三项连接数据)传送给T 9.5 嵌套过程语言的栈式实现 2.Par T T——为过程 * 9.6 堆式动态存储分配 1.堆式动态存储分配使用的情况 (1)允许用户自由地申请数据空间和退还空间 (2)不仅有过程而且有进程的程序结构 即空间的使用未必服从“先请后还,后请先还”的原则 例如:Pascal语言中的标准过程new-dispose 2.该种分配方法必须考虑的几个主要问题 (1)当运行程序要求一块体积为N的空间时,应该分配哪一块 给它? (2)如果运行程序要求一块体积为N的空间,但所有空闲块的 总和也不够N,那该怎么办? * 一、堆式动态存储分配的实现 1.定长块管理 (1)实现方法: (2)优点: 占用 占用 占用 空闲 空闲 空闲 占用 空闲 占用 空闲 空闲 空闲 available available 9.6 堆式动态存储分配 * 2.变长块管理 (1)实现方法 (2)实现的非配策略 A.首次满足法 B.最有满足法 C.最差满足法 (3)3种分配策略的比较 A.适用情况 B.时间比较 9.6 堆式动态存储分配 * 二、隐式存储回收 1.隐式存储回收的要求: 用户程序和支持运行的回收子程序并行工作. 原因:回收子程序需要知道分配给用户程序的存储块 何时不再使用. 2.存储块格式: 块长度 访问计数标记 指针 用户使用空间 9.6 堆式动态存储分配 * 3.回收过程 (1)标记阶段:对已分配的块跟踪程序中各指针的访问路 径,若某个块被访问过,则给该块加一个标记。 (2)回收阶段:所有未加标记的存储块回收到一起,并插入 空闲块链表中,然后消除在存储块中所加的全部标记。 9.6 堆式动态存储分配 4.优缺点 优点:防止死块产生。 缺点:开销随空闲块的减少而增加。 * 第九章 运行时存储空间组织 编译程序的最终目的: 将源程序翻译成等价的目标程序。 生成目标代码前:需要把程序静态的正文和实现这个程 序的运行时的活动联系起来,弄清楚 将来在代码运行时刻,源代码中的各 种变量、常量等用户定义的量是如何 存放的,如何去访问它们。 * 第九章 运行时存储空间组织 在程序执行过程中,程序中数据的存取是通过与之对应的存储单元来进行的。 标识符对应的内存地址都是由编译程序在编译时或由其生成的目标程序运行时进行分配。 程序中使用的存储单元都由标识符来表示。 * 第九章 运行时存储空间组织 9.1 目标程序运行时的活动(略) 9.2 运行时存储器的划分 9.3 静态存储分配(略) 9.4 简单的栈式存储分配 9.5 嵌套过程语言的栈式实现 9.6 堆式动态存储分配 * 9.1 目标程序运行时的活动 活动——过程/函数的一次执行。 即每次执行一个过程体,产生该过程体的一次活动。 活动的生存期——指的是从执行该过程体第一步操作到最后 一步操作之间的操作序,包括执行该过程时 调用其它过程花费的时间。 “生存期”——指在程序执行过程中若干步骤的一个顺序序列。 作用域——一个说明在程序里能起作用的范围称为该说明的 作用域。 * 9.2 运行时存储器的划分 一、运行时存储器的划分 1.编译器需要在存储区保护的对象 (1)目标代码?编译时可确定,故可放在一个静态确定的区域 (2)数据对象?部分数据对象的大小在编译时可确定,故也可 放在一个静态确定的区域 (3)跟踪过程活动的控制栈 目标代码 静态数据 栈 ↓

文档评论(0)

love87421 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档