网站大量收购独家精品文档,联系QQ:2885784924

编译方法、技术与实践课件:中间代码生成.pptx

编译方法、技术与实践课件:中间代码生成.pptx

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

;;

?运行时刻环境概要

?存储组织和帧栈设计方法;

?目标程序的代码放置在代码区

?静态区、堆区、栈区分别放置不同类型生命期的数据值

?实践中,栈是由低地址向高地址增长,而堆是由高地址向低地址增长;

?运行时刻环境概要

?存储组织和帧栈设计方法;

?静态分配

O编译器在编译时刻就可以做出存储分配决定,不需要考虑程序运行时刻的情形

O全局变量

?动态分配

O栈式存储:和过程的调用/返回同步进行分配和回收,值的生命期和过程生命期相同

O堆存储:数据对象比创建它的过程调用更长寿

?手工进行回收:C++/C…

?垃圾回收机制:Java/C#/Python…;

?过程调用(过程活动)在时间上总是嵌套的

O后调用的先返回

O因此用栈式分配来分配过程活动所需内存空间

?程序运行的所有过程活动可以用树表示

O每个结点对应于一个过程活动

O根结点对应于main过程的活动

O过程p的某次活动对应的结点的所有子结点:此次活动所调用的各个过程活动(从左向右,表示调用的先后顺序);

?程序:P277,图7-2

?过程调用(返回)序列和活动树的前序(后序)遍历对应

?假定当前活动对应结点N,那么所有尚未结束的活动对应于N及其祖先结点。;;;

?调用代码序列(callingsequence)为活动记录分配空间,填写记录中的信息

?返回代码序列(returnsequence)恢复机器状态,使调用者继续运行

?调用代码序列会分割到调用者和被调用者中

O根据源语言、目标机器、操作系统的限制,可以有不同的分割方案

O把代码尽可能放在被调用者中;

?数据方面

O能够把参数正确地传递给被调用者

O能够把返回值传递给调用者

?控制方面

O能够正确转到被调用过程的代码开始位置

O能够正确转回调用者的调用位置(的下一条指令)

?调用代码序列和活动记录的布局相关;

?调用者和被调用者之间传递的值放在被调用者活动记录的开始位置

?固定长度的项放在中间位置

O控制链、访问链、机器状态字段

?早期不知道大小的项在活动记录尾部

?栈顶指针(top_sp)通常指向固定长度字段的末端;

?调用代码序列(Callingsequence)

O调用者计算实在参数的值

O将返回地址和原top_sp存放到被调用者的活动记录中。调用者增加top_sp的值(越过了局部数据、临时变量、被调用者的参数、机器状态字段)

O被调用者保存寄存器值和其他状态字段

O被调用者初始化局部数据、开始运行

?返回代码序列(Returnsequence)

O被调用者将返回值放到和参数相邻的位置

O恢复top_sp和寄存器,跳转到返回地址;;

?看一个实际的例子;;

?没有嵌套过程时的数据访问

OC语言中,每个函数能够访问的变量

?函数的局部变量:相对地址已知,且存放在当前活动记录内,top_sp指针加上相对地址即可访问

?全局变量:在静态区,地址在编译时刻可知

O很容易将C语言的函数作为参数进行传递

?参数中只需包括函数代码的开始地址。

?在函数中访问非局部变量的模式很简单,不需要考虑过程是如何激活的;

?PASCAL中,如果过程A的声明中包含了过程B的声明,那么B可以使用在A中声明的变量。

?当B的代码运行时,如果它使用的是A中的变量。那么这个变量指向运行栈中最上层的同名变量。

?但是,我们不能通过嵌套层次直接得到A的活动记录的相对位置,必须通过访问链访问;

?ML是一种函数式语言.

变量一旦被声明并初始化就不会在改变,只有少数几个例外.

?定义变量并设定它们不可更改的初始值的语句有如下形式valname=(expression)

?函数使用如下语法进行定义

funname(arguments)=body

?使用下列形式的let语句来定义函数体

letlistofdefinitionsinstatementsend

其中,定义通常是val或fun语句.

每个这样

文档评论(0)

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

中医资格证持证人

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

领域认证该用户于2023年05月10日上传了中医资格证

1亿VIP精品文档

相关文档