- 1、本文档共20页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《编译原理课程教案》第6章:运行时存储分配1
第六章 运行时存储空间的组织 本章要求 主要内容:程序的静态文本与它运行时的活动之间的关系,源程序运行时各种对象的存储空间主要有三种方式分配方式:静态存储分配、栈式存储分配和堆式存储分配 重点掌握:源程序运行时的活动,参数传递方式,程序中名字的作用域,局部数据区的内容,存储空间的分配方式 6.1 程序执行时的活动 静态和动态的联系 名字和数据对象 数据对象的动态表示 名字的作用域 数据对象的存储分配 过程和活动 参数处理 运行时支撑程序包 过程相关的几个概念 过程定义是一个声明,它的最简单的形式是把一个标识符(过程的名字)和一段语句联系起来。 当过程名出现在可执行语句中时,则称过程在该点被调用 出现在过程定义中的标识符称为形式参数(或形参) 出现在过程调用中的标识符或常数称为实在参数(或实参) 一个过程的一次执行指的是从过程体的起点开始,最后退出该过程,将控制返回到该过程被调用之后的位置。 一个过程的活动指的是该过程的一次执行。就是说,每次执行一个过程体就产生该过程的一个活动。 从执行该过程体的第一步操作到最后一步操作之间的操作序列所花的时间称为该过程的一个活动的生存期 声明的作用域 语言中名字的声明是把信息与名字联系起来的语法结构。 区分同名程序声明:最接近的嵌套规则 int a , b; int *p; int foo( int a ) { int b, c; char *p; p = malloc( sizeof( char ) ); b = foo( 1 ); … } 作用域:一个声明起作用的程序部分称为该声明的作用域 局部和非局部:过程中名字的出现,如果是在该过程的一个声明的作用域内,则这个出现称为局部于该过程 参数的传递 传地址(常用):把实在参数的地址传递给相应的形式参数 传值(常用):调用段把实在参数的值传给被调用段。被调用段把实参值抄进形式单元中,再使用。 得结果:形式参数对应有两个单元,第一个单元放实参的地址,第二个单元放实参的值。对形式参数的任何引用或赋值都看成是对第二个单元的直接访问,过程返回前必须把第二个单元的内容存放到第一个单元所指的那个实参单元之中 传名:(ALGOL60 )过程调用相当于把被调过程的过程体抄到调用出现的位置,把其中任一出现的形式参数都替换成相应的实在参数(文字替换) 名字的绑定 名字绑定要考虑的问题 过程是否递归 当控制从过程的活动返回时,局部名字的值是否要保留 过程能否引用非局部的名字 过程调用时参数是如何传递的 过程是否可以作为参数被传递 过程能否作为结果值返回 存储区能否在程序控制下动态地分配 存储区是否必须显式地释放 6.2 运行时内存的划分 程序运行时如何使用内存: 目标代码的存放 目标代码可以存放在静态确定的区域,其长度在编译时即可确定 数据对象 可静态分配的数据对象,其地址可以编译到目标代码中 动态分配 控制栈:记录过程活动 堆:可以存放动态分配的数据等,但开销要比栈大 局部数据区的内容 活动记录:过程的依次执行所需要的信息用一块连续的存储区来管理,这块存储区叫做活动记录或帧 并不是所有的语言或编译器都是如此 寄存器的使用 活动记录的操作: 过程被调用时入栈 过程返回时出栈 活动记录的各个域的作用 临时数据:临时变量的存储等 局部数据:局部于过程执行的数据 机器状态:保存过程调用前的机器状态信息 返回地址 可选的访问链:用于非局部数据的访问 可选的控制链:指向调用者的活动记录 实在参数域:参数个数较少时,可以考虑用寄存器传递,效率高;参数多时用用这个域传递 返回值域:用于存放被调用过程返回给调用过程的值,也可以用寄存器返回(效率高,但形式受限制) 6.3 存储分配策略 静态存储分配 栈式存储分配 堆式存储分配 静态存储分配策略 名字的绑定: 编译时实现,不需要运行时支撑程序 名字和存储的绑定是固定的 允许名字的值在过程停止活动后保持 根据名字的类型,编译器可以在静态时刻确定该名字所需的存储空间,效率 局限: 数据对象的长度和它在内存中位置的限制必须在编译时知道 不允许递归过程 不允许有动态数据结构 在FORTRAN77中,静态存储分配策略,每个过程的活动记录可以与它的代码放在一起 静态存储分配策略(2) PROGRAM CNSUME CHARACTER * 50 BUF INTEGER NEXT CHARACTER C , PRDUCE DATA NEXT / 1 /, BUF /‘ ’/ 6 C = PRDUCE( ) BUF( NEXT , NEXT ) = C NEXT = NEXT + 1 IF ( C .NE. ‘ ’ ) GOTO 6
文档评论(0)