编译原理课程讲授课件.ppt

  1. 1、本文档共26页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

运行时环境

授课:胡静

本章研究问题

在生成目标代码之前,需要把程序静态的正文和实现这个程序的运行时的活动联系起来,主要是存储组织与管理

活动记录的建立与管理

存储器的组织与存储分配策略

非局部名称的访问

目标程序运行时的活动

过程的活动

过程的活动主要讨论的是过程的静态源程序和它的目标程序在运行时的活动之间的关系

过程最简单的形式是一个标识符和一段语句组成。

函数是具有返回值的过程,也放入过程中进行讨论

把完整的程序也看成过程

过程的调用位置

过程名出现在可执行语句里时

过程名出现在表达式里时

过程中的定义的标识符

形式参数(相对应实在参数)

局部变量

过程的活动

一个过程的活动指的是该过程的一次执行

过程P一个活动的生存期,指的是从执行该过程体第一步操作到左后一步操作之间的操作序列,也包括执行P时调用其他程序花费的时间

每次控制从过程P进入过程Q后,如果没有错误,最后都要返回到过程P。

如果a和b都是过程的活动,那么它们的生存期或者是不重叠,或者是嵌套的。

如果一个过程是递归的(直接递归或间接递归),在某一时刻可能有几个活动记录活跃着

运行时存储器的划分

运行时存储器的划分

存储组织

产生的目标代码

长度在编译时可以确定

放在静态区域,内存的低地址区

静态数据

某些数据的长度在编译时可知

放在静态区域,其地址可以编译到目标代码中

拓广的控制栈

栈保存程序的断点需要保存的各种状态

堆用来保存那些不能用活动树表示的语言的实现过程中产生的活动信息。

活动记录

活动记录的定义

过程一次执行所需要的信息用一块连续的存储区来管理,这块存储区叫做活动记录

在过程调用时将活动记录压入栈,在控制返回调用者时把活动记录弹出

活动记录各部分信息

临时数据域:计算表达式时出现的那些值

局部数据域:保存局部于过程执行的数据

机器状态域:保存过程调用前的机器状态信息,包括程序计数器的值和寄存器的值

可选的访问链:引用存于其它活动记录中的非局部变量(静态链)

可选的控制链:用来指向调用者的活动记录(动态链)

实在参数域:用于存放调用过程提供给被调用那个过程的参数

返回值域:用于存放被调用返回给调用过程的值

存储分配策略

存储分配的三种策略

静态分配策略

在编译时为所有数据对象分配固定的存储单元,且在运行时始终保持不变

栈式动态分配策略

在运行时按栈方式管理运行时的存储空间

堆式动态分配策略

在运行时根据需要从堆数据区域分配和释放存储空间

存储分配策略

静态存储分配

在静态分配中,名字在程序编译时与存储单元绑定,所以不需要运行时支撑程序包。

因为运行时不改变绑定,所以每次过程活动时,它的名字都绑定到同样的存储单元。

这种性质允许局部名字的值在过程停止活动后仍然保持,即当控制再次进入过程时,局部名字的值同控制上一次离开时一样。

因为静态分配,所以编译时在目标代码中能填上所有操作的数据对象的地址

静态分配的局限性

数据对象的长度和它在内存中的位置的约束在编译时必须知道

不允许递归过程,因为一个过程的所有活动使用同样的局部名字绑定

数据结构不能动态建立,因为没有运行时的存储分配机制。

栈式存储分配

栈式存储分配的思想(基于控制栈)

把存储空间组织为栈,而且随着过程活动的开始和结束将活动记录进栈和出栈

过程每次调用时,局部量的存储空间包含在该次调用的活动记录中。

每次调用都引起新的活动记录进栈,每次活动时局部量都绑到新的存储单元

活动记录弹出栈时局部量的存储空间将被释放,所以活动结束时局部量的值被删除。

栈式存储分配

调用序列:

过程调用是通过在目标代码中生成调用序列来实现

调用序列分配活动记录,并把信息填入它的域中

返回序列恢复机器状态,使调用过程能继续执行。

调用序列的代码常常分成两部分,分别处于调用过程和被调用过程中。

有助于设计调用序列和活动记录的一个原则是,长度能较早确定的域放在活动记录的中间。

栈式存储分配

在活动记录中,控制链、访问链和机器状态域出现在中间。

临时数据域的长度可以在编译时最终确定,但就前端而言,这个域的大小也可能是未知的。

临时数据放在局部数据域后面,它的长度的改变不会影响数据对象相对于中间那些域的位置。

返回值和实参放在活动记录的最开始。方便调用者和被调用者之间的数据交换。

栈式存储分配

寄存器top_sp指向活动记录中机器状态域的末端,在控制转移到被调用过程之前用它来置top_sp的值,其调用序列是:

调用者计算实参

调用者把返回地址和top_sp的旧值存入被调用者的活动记录中

被调用者保持寄存器值和其他机器状态信息

被调用者初始化其局部数据,并开始执行

……

参数和返回值

链和保存的状态

临时变量和局部数据

参数和返回值

临时变量和局部数据

控制链

链和保存的状态

控制链

top_sp

调用者的活动记录

被调用者的活动记录

您可能关注的文档

文档评论(0)

浅唱愁淡 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档