编译原理第6章 运行时存储空间组织和符号表.pptVIP

编译原理第6章 运行时存储空间组织和符号表.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
运行时存储空间组织和符号表 §1运行时存储空间组织基本内容 一、运行时存储空间组织的基本思想: 存储分配是在运行阶段进行的,但编译程序在编译阶段要为源程序中用户定义的变量与常量、临时变量、过程与函数调用时需要的连接数据、返回地址等组织好运行阶段的存储空间,为其设计好存储组织形式,并将这种组织形式通过生成的目标代码体现出来。在运行阶段,随着目标代码的运行,数据的存储组织形式便得以实现。 二、过程的活动与活动记录 一个过程的活动指的是该过程的一次执行。即,每次执行一个过程体,就产生该过程的一个活动。 活动记录:为了管理过程在一次执行中所需要的信息,使用一个连续的存储块记录表示该活动的相关信息,称为该过程的活动记录。 当前活动记录一般包含如下内容: 连接数据: ①返回地址 ②动态链:指向调用该过程前的运行活动记录地址的指针。运行时,使运行栈上各数据区按动态建立的次序连成链。链头为栈顶起始位置。 ③静态链:指向静态直接外层最新活动记录地址的指针,用来访问非局部数据。 形式单元:存放相应实在参数的地址或值。 局部数据区:局部数据、内情向量、临时单元。 ( P164 图6.7 ) 三、参数的传递方式及其实现 不同语言的形实参数结合方式不同,解决的方法也不相同。常见的有四种: ①传地址(Call by reference)(类似Pascal变参) 每一个形式参数都有一个形式单元,用来存放实在参数的地址。在子程序中,对形式参数的引用都是对实参单元的引用。 实参是变量:传地址 实参是常量:值放临时单元,传临时单元地址 实参是表达式:值放临时单元,传临时单元地址 例如:有程序段: ①传地址举例: 执行了语句:x:=x+5;后 运行结果为: 8 , 8 8 ②传值(Call by value)(类似Pascal值形参) 每一个形式参数都有一个形式单元,用来存放实在参数的值。在子程序中,对形式参数的引用都是对存放值的形式单元的引用。 ③传结果(Call by result) 每一个形式参数都有两个形式单元,一个用来存放实参值的单元x,另一个用来存放实参地址的单元y。在子程序中,对形式参数的引用都是对存放值的形式单元x的引用,调用结束返回前,按y单元地址将结果写入实在参数对应的单元。 ②传值举例: 执行了语句:x:=x+5;后 运行结果为: 8 , 3 3 ③传结果举例: 执行了语句:x:=x+5;后 运行结果为: 8 , 3 8 ④传名/换名(Call by name) 过程调用的作用相当于把被调用段的过程体抄到调用出现的位置,把所有形式参数都替换成实在参数(文字替换),若替换时有同名标识符,则换名表示。这是ALGOL60所定义的一种特殊的形实结合方式。 ④传名/换名: 假设有如下示意性程序段,采用传名方式: procedure R(x , I ) begin I:=2; x:=5; I:=3; x:=I-1; end; 假设程序中,B的所有元素初值为3,且有调用: j:=2; R( B[ j*2 ] , j ) 程序运行后,被替换成: procedure R( B[ j*2 ] , j ) begin j:=2; B[ j*2 ] :=5; j:=3; B[ j*2 ] :=j-1; end; 四、存储分配策略 1、静态存储分配:在编译时就能确定目标程序运行中所需要的全部空间大小,则编译时就能安排好目标程序的全部数据空间,并能确定每个数据项的单元地址、存储空间,这种分配方法叫做静态存储分配。 例如:FORTRAN语言中,不允许递归,不含可变体积的数据对象。 ∴FORTRAN可以使用静态存储分配策略。 2、栈式存储分配:将整个存储空间设计成一个栈,每当调用一个过程时就将它的活动记录压入栈,在栈顶形成当前过程数据工作区,当过程结束时将活动记录弹出栈。(在这种分配方式下,每个过程可能有若干个不同的活动记录,每个活动记录表示了一次不同的调用)。 分为: 简单栈式存储分配(无嵌套过程) 嵌套过程的栈式存储分配 3、堆式存储分配:允许数据对象自由地分配和释放,空间的使用不一定按照“先申请后释放”的原则,这种语言通常采用堆式存储分配。 §2 静态存储分配 FORTRAN77采用的是静态存储分配,它的程序是段结构,整个程序由主程序段和若干个子程序段组成,它的每个数据名所需的存储空间大小都是常量,并且不允许递归调用,这样,整个程序所需存储空间的总量在编译时就能完全确定,所以,可以采用静态存储分配方式。 §3 简单栈式存储分配 适用于语言没有分程序结构,过程定义不允许嵌套,

文档评论(0)

9885fp + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档