- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
编译原理10编译原理10
第10章 目标程序运行时 的存储组织 10.1 数据空间的三种不同使用和管理方法 10.2 栈式存储分配的实现 10.3 参数传递 10.4 过程调用、过程进入和过程返回 编译中的存储 编译要生成目标代码,产生特定的数据空间,以及相关的运行环境信息 借此向操作系统申请一块存储区使目标程序得以正常运行 会让问题变得稍微复杂一点的情况是,目标代码所占存储空间的大小在编译是能够确定,有些数据对象所占的存储空间在编译时可能也可以确定,但有些数据对象具有“可变体积”和带编译性质,它们在编译时无法确定存储空间的位置 运行时存储区的基本划分 运行时的存储区常常划分为目标区、静态数据区、栈区和堆区,如下图 堆区是“正向生长”的一块区域 概念 静态:如果一个名字的性质通过说明语句或隐或显规则而定义,则称这种性质是“静态”确定的 动态:如果一个名字的性质只有在程序运行的时候才能知道,则称这种性质为“动态”确定的 数据空间 数据或数据空间无疑是现实程序必不可少的一个部分 它们的使用和管理方法分为下面三种:静态存储分配、栈式动态存储分配和堆式动态存储分配 三种数据空间存储分配策略 静态存储分配策略 如果编译时能确定目标程序运行中所需的全部数据空间大小,并安排好,每个数据对象的存储位置,则称这种分配策略为静态存储分配 像FORTRAN这样的语言具有下述特点 其程序是段结构的 各段中定义的名字一般是彼此独立的 同一个名字在不同的程序段表示不同的存储单元 它的每个数据名所需的存储空间大小都是常量(因而不支持可变数组) 整个程序所需数据空间的总量在编译时完全确定 三种数据空间存储分配策略 动态存储分配 如果一个程序设计语言允许递归过程、可变数组,或允许用户自由申请和释放存储空间,就需要采取此种存储管理技术 栈式动态存储分配 像Pascal, C, ALGOL语言等,就包含这类存储策略的实现 主要为过程或函数调用服务 过程所需的数据空间主要包括两个部分 生存期在本过程的数据对象 用以管理过程活动的记录信息 三种数据空间存储分配策略 堆式动态存储分配 它提供用户自由申请和退还数据空间的机制 像C++中的new, delete, Pascal中的new等等 它假设程序运行时有一个大的存储空间,每当需要的时候就从其中借用一块,不同时再退还 栈式存储分配的实现 服务于过程的栈式存储分配策略,在栈顶为有关过程分配所需的数据空间,当一个过程工作完毕返回时,它在栈顶区域的数据空间也即释放 大家可以结合汇编所学的子程序调用所涉及到的栈的操作 过程的活动记录 过程的活动记录,Activation Record,对应一段连续的存储区,用以存放过程一次执行相关的信息,可见下面的图表 过程活动记录各项的含义 上表中各项的含义可以简单地解释如下: 临时工作单元 计算表达式时,需存放中间结果用的临时值单元 局部变量 一个过程的局部变量 机器状态信息 和有关过程执行前的机器状态信息,包括程序计数器、寄存器的值,它们需要在该过程返回时恢复 存取链 用以存取非局部变量,这些变量存放于其他过程活动记录中 过程活动记录各项的含义 控制链 指向调用该过程的那个过程的活动记录 实参 由调用过程提供相关的值(也就是该过程实际运行所需要的参数值) 返回地址 保存调用该过程的位置,以保证调用过程结束正常返回 简单栈式存储分配 针对没有分程序结构,过程定义不嵌套,但允许过程递归调用的情况 例,对下面的程序,主程序调用了过程Q,Q又调用了R,在R进入运行后的存储结构的图见下页 图1,主程序先调用过程Q,在进入Q运行后的存储结构 注:Q的过程没有调用Q或R 图3,主程序调用了过程Q,Q又调用了R,在进入R运行后 的存储结构 无嵌套过程定义的活动记录内容 见右图1,这里可把控制链称为老SP,它记录了调用该过程的那个过程最新活动记录的起点 含嵌套过程的栈式分配方案 像Pascal语言就允许过程嵌套定义(注意嵌套定义和递归调用的区别) 特点: 一个过程可以引用包围它的任一外层过程所定义的标识符(如变量,数组或过程等) 在该过程执行时要可以引用它的任一外层过程的最新活动记录中的某些数据 Pascal的程序实例 Program sort(input, output); Var a: array[0,10] of integer; X: integer; procedure readarray; var i: integer; begin … a … end {r
您可能关注的文档
- 纺材历年真题纺材历年真题.doc
- 纹身割线 打雾方法以及操作技巧详解纹身割线 打雾方法以及操作技巧详解.doc
- 纺织品的印染前处理纺织品的印染前处理.pdf
- 纺织印染助剂之精华版纺织印染助剂之精华版.ppt
- 纺织服装企业价值增值分析纺织服装企业价值增值分析.doc
- 纺织染整工业大气污染物排放标准DB 33 962—2015纺织染整工业大气污染物排放标准DB 33 962—2015.pdf
- 纺织品防紫外线性能的检测标准近况纺织品防紫外线性能的检测标准近况.pdf
- 纺锤 体 组装 检 验点纺锤 体 组装 检 验点.pdf
- 约定购回最新政策解读约定购回最新政策解读.ppt
- 纽约大学商业分析专业入学要求纽约大学商业分析专业入学要求.pdf
文档评论(0)