编译原理课程第15讲.ppt

  1. 1、本文档共48页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
中国科大 第六章 运行时存储空间的组织和管理 编译程序在完成词法、语法和语义分析后,在生成目标代码之前,需要把程序的静态正文和实现这个程序的运行时的活动联系起来弄清楚将来在代码运行时刻,源代码中的各种变量、常量等用户定义的量是如何存放的,如何去访问它们。 在程序的执行过程中,程序中数据的存取是通过与之对应的存储单元来进行的。在程序语言中,程序使用的存储单元都是由标识符来表示的。它们对应的内存地址都是由编译程序在编译时或由其生成的目标程序运行时进行分配。所以对于编译程序来说存储组织与管理是一个复杂而又十分重要的问题。 第六章 运行时存储空间的组织和管理 过程的活动 过程的一次执行称为过程的一次活动 活动记录 过程的活动需要可执行代码和存放所需信息 的存储空间,后者称为活动记录 本章内容 讨论一个活动记录中的数据安排 程序执行过程中,所有活动记录的组织方式 第六章 运行时存储空间的组织和管理 过程P一次活动的生存期,指的是从执行该过程体第一步操作到最后一步操作之间的操作时间,包括执行P时调用其它过程花费的时间。 过程可以是递归的 一个过程可对应多个活动 第六章 运行时存储空间的组织和管理 影响存储分配策略的语言特征 过程能否递归 当控制从过程的活动返回时,局部变量的值是否要保留 过程能否访问非局部变量 过程调用的参数传递方式 过程能否作为参数被传递 过程能否作为结果值传递 存储块能否在程序控制下动态地分配 存储块是否必须显式地释放 6.1 (过程内部)局部存储分配策略 6.1.1 过程 过程定义、过程调用、形式参数、实在参数、活动的生存期 6.1 局部存储分配策略 6.1.2 名字的作用域和绑定 名字的作用域 一个声明起作用的程序部分称为该声明的作用域。 6.1 局部存储分配策略 6.1.2 名字的作用域和绑定 名字的作用域 即使一个名字在程序中只声明一次,该名字在程序运行时也可能表示不同的数据对象。 6.1 局部存储分配策略 名字到存储单元的绑定 环境把名字映射到左值(存储单元),而状态把左值映射到右值(值)。 赋值改变状态,但不改变环境。 如果环境将名字x映射到存储单元s,我们就说x被绑定到s。 6.1 局部存储分配策略 静态概念和动态概念的对应 6.1 局部存储分配策略 6.1.3 活动记录 编译程序每次运行时,编译器从操作系统(OS)获得一块存储区(内存)。其内容包括: 编译后的目标代码 (可执行程序 .exe) 数据对象 (各种静态变量和动态变量) 用于管理过程活动的控制栈 (活动记录) 6.1 局部存储分配策略 6.1.3 活动记录 编译程序每次运行时,编译器从操作系统(OS)获得一块存储区(内存)。其空间安排: 6.1 局部存储分配策略 6.1.3 活动记录 例子 6.1 局部存储分配策略 6.1.3 活动记录 一般的活动记录的布局 6.1 局部存储分配策略 6.1.4 局部数据的安排 字节是可编址内存的最小单位。 一个过程所声明的局部变量,按这些变量声明时出现的次序,在活动记录的局部数据区中依次分配空间。 局部数据的地址可以用相对于某个位置(本过程对应的活动记录的起始位置)的偏移来表示。 数据对象的存储安排深受目标机器寻址方式的影响,存在对齐问题。例如,要求整数(int,long)的相对地址可以被4整除。由于对齐而引起的无用空间称为衬垫空白区。 例题 例题解答: 例题解答: 6.1 局部存储分配策略 6.1.5 程序块 语法如{声明 语句} 本身含有局部变量声明的语句,可以嵌套 最接近的嵌套作用域规则 程序块B’中声明的作用域包括B 如果名字x没有在B中声明,那么B中x的出现是在外围程序块B’的x声明的作用域中,且满足 B’有x的声明 B’比其他任何包含x声明的程序块更接近被嵌套的B 并列程序块不会同时活跃 并列程序块的变量可以重叠分配 6.1 局部存储分配策略 main() { /? begin of B0 ?/ int a = 0; int b = 0; { /? begin of B1 ?/ int b = 1; {/? begin of B2 ?/ int a = 2; }/? end of B2 ?/ {/? begin of B3 ?/ int b = 3; }/? end of B3 ?/ }/? end of B1 ?/ }/? end of B0 ?/ 6.1 局部存储分配策略 main() { /? begin of B0 ?/ int a = 0; int b = 0; { /? begin of B1 ?/ int b = 1;

文档评论(0)

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

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

1亿VIP精品文档

相关文档