编译原理课程讲授课件

上传人:suns****4568 文档编号:93062795 上传时间:2019-07-16 格式:PPT 页数:26 大小:192.51KB
返回 下载 相关 举报
编译原理课程讲授课件_第1页
第1页 / 共26页
编译原理课程讲授课件_第2页
第2页 / 共26页
编译原理课程讲授课件_第3页
第3页 / 共26页
编译原理课程讲授课件_第4页
第4页 / 共26页
编译原理课程讲授课件_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《编译原理课程讲授课件》由会员分享,可在线阅读,更多相关《编译原理课程讲授课件(26页珍藏版)》请在金锄头文库上搜索。

1、运行时环境,授课:胡静,本章研究问题,在生成目标代码之前,需要把程序静态的正文和实现这个程序的运行时的活动联系起来,主要是存储组织与管理 活动记录的建立与管理 存储器的组织与存储分配策略 非局部名称的访问,目标程序运行时的活动,过程的活动,过程的活动主要讨论的是过程的静态源程序和它的目标程序在运行时的活动之间的关系 过程最简单的形式是一个标识符和一段语句组成。 函数是具有返回值的过程,也放入过程中进行讨论 把完整的程序也看成过程 过程的调用位置 过程名出现在可执行语句里时 过程名出现在表达式里时 过程中的定义的标识符 形式参数(相对应实在参数) 局部变量,过程的活动,一个过程的活动指的是该过程

2、的一次执行 过程P一个活动的生存期,指的是从执行该过程体第一步操作到左后一步操作之间的操作序列,也包括执行P时调用其他程序花费的时间 每次控制从过程P进入过程Q后,如果没有错误,最后都要返回到过程P。 如果a和b都是过程的活动,那么它们的生存期或者是不重叠,或者是嵌套的。 如果一个过程是递归的(直接递归或间接递归),在某一时刻可能有几个活动记录活跃着,运行时存储器的划分,存储组织,产生的目标代码 长度在编译时可以确定 放在静态区域,内存的低地址区,静态数据 某些数据的长度在编译时可知 放在静态区域,其地址可以编译到目标代码中,拓广的控制栈 栈保存程序的断点需要保存的各种状态 堆用来保存那些不能

3、用活动树表示的语言的实现过程中产生的活动信息。,活动记录,活动记录的定义 过程一次执行所需要的信息用一块连续的存储区来管理,这块存储区叫做活动记录 在过程调用时将活动记录压入栈,在控制返回调用者时把活动记录弹出,活动记录各部分信息,临时数据域:计算表达式时出现的那些值 局部数据域:保存局部于过程执行的数据 机器状态域:保存过程调用前的机器状态信息,包括程序计数器的值和寄存器的值 可选的访问链:引用存于其它活动记录中的非局部变量(静态链) 可选的控制链:用来指向调用者的活动记录(动态链) 实在参数域:用于存放调用过程提供给被调用那个过程的参数 返回值域:用于存放被调用返回给调用过程的值,存储分配

4、策略,存储分配的三种策略 静态分配策略 在编译时为所有数据对象分配固定的存储单元,且在运行时始终保持不变 栈式动态分配策略 在运行时按栈方式管理运行时的存储空间 堆式动态分配策略 在运行时根据需要从堆数据区域分配和释放存储空间,存储分配策略,静态存储分配,在静态分配中,名字在程序编译时与存储单元绑定,所以不需要运行时支撑程序包。 因为运行时不改变绑定,所以每次过程活动时,它的名字都绑定到同样的存储单元。 这种性质允许局部名字的值在过程停止活动后仍然保持,即当控制再次进入过程时,局部名字的值同控制上一次离开时一样。 因为静态分配,所以编译时在目标代码中能填上所有操作的数据对象的地址 静态分配的局

5、限性 数据对象的长度和它在内存中的位置的约束在编译时必须知道 不允许递归过程 ,因为一个过程的所有活动使用同样的局部名字绑定 数据结构不能动态建立,因为没有运行时的存储分配机制。,栈式存储分配,栈式存储分配的思想(基于控制栈) 把存储空间组织为栈,而且随着过程活动的开始和结束将活动记录进栈和出栈 过程每次调用时,局部量的存储空间包含在该次调用的活动记录中。 每次调用都引起新的活动记录进栈,每次活动时局部量都绑到新的存储单元 活动记录弹出栈时局部量的存储空间将被释放,所以活动结束时局部量的值被删除。,栈式存储分配,调用序列: 过程调用是通过在目标代码中生成调用序列来实现 调用序列分配活动记录,并

6、把信息填入它的域中 返回序列恢复机器状态,使调用过程能继续执行。 调用序列的代码常常分成两部分,分别处于调用过程和被调用过程中。 有助于设计调用序列和活动记录的一个原则是,长度能较早确定的域放在活动记录的中间。,栈式存储分配,在活动记录中,控制链、访问链和机器状态域出现在中间。 临时数据域的长度可以在编译时最终确定,但就前端而言,这个域的大小也可能是未知的。 临时数据放在局部数据域后面,它的长度的改变不会影响数据对象相对于中间那些域的位置。 返回值和实参放在活动记录的最开始。方便调用者和被调用者之间的数据交换。,栈式存储分配,寄存器top_sp指向活动记录中机器状态域的末端,在控制转移到被调用

7、过程之前用它来置top_sp的值,其调用序列是: 调用者计算实参 调用者把返回地址和top_sp的旧值存入被调用者的活动记录中 被调用者保持寄存器值和其他机器状态信息 被调用者初始化其局部数据,并开始执行,参数和返回值,链和保存的状态,临时变量和局部数据,参数和返回值,临时变量和局部数据,控制链,链和保存的状态,控制链,top_sp,调用者的活动记录,被调用者的活动记录,调用者的任务,被调用者的任务,堆式存储分配,栈式存储分配策略在下列情况下不能使用: 活动结束时必须保持局部名字的值 被调用者的活动比调用者的活动的生存期长。 堆式存储器的策略:(堆管理器管理堆空间) 把连续存储区域分成块,当活

8、动记录或其他对象需要时就分配。 块的释放可以按任意次序进行,所以经过一段时间后,堆可能包含交错的正在使用的和已经释放的区域,堆管理器的效率问题,堆管理的效率问题是数据结构理论中的特殊问题 对每个感兴趣的活动记录的大小,保存一个相应大小的空闲块的链表 可能的话,为大小为s的请求分配一个大小为s的块,其中s是大小等于s的最小块。当该块最终被释放后,将其链回原来的空闲块链表 对于大块存储空间,使用堆管理器管理。 其具体管理方法可以参考操作系统中堆内存的管理方法。,对非局部名字的访问,语言的作用域规则确定了如何处理非局部名字的访问 词法作用域规则(静态作用域规则):仅仅根据程序正文即可以确定用于名字的

9、声明。如最近嵌套规则 动态作用域规则:在运行时根据当前的活动来决定用于名字的声明。,参数传递,参数传递,说明的作用域 如果一个说明的作用域是在一个过程里,那么这个过程里出现的该说明中的名字都是局部于本过程的; 除上述之外的名称是非局部的。 参数传递方式:过程的形式参数和实在参数的对应方式。 形式参数和实在参数的“左值”和“右值”之间的对应关系划分参数传递方式: 传值调用 引用调用(传地址调用) 复制-恢复调用 传名调用,参数传递传值调用,传值调用:计算实参,并把它的右值传给被调用过程 把形参当作局部名字看待,形参的存储单元在被调用过程的活动记录中 调用者计算实参,并把其右值放入形参的存储单元中

10、 传值调用的显著特征是对形参的运算不影响调用者活动记录中的值 打印结果 a is 1, b is 2,swap(x,y) int x,y int temp; temp =x; x=y; y=temp; main() int a=1,b=2; swap(a,b); printf(“a is %d, b is %d”, a,b); ,参数传递引用调用,引用调用:传递时,调用过程把实参存储单元的地址传递给被调用过程 如果实参是有左值的名字或表达式,则传递这个左值本身; 如果实参是表达式,没有左值,则计算该表达式的值并存入新的存储单元,然后传递这个单元的地址 打印结果 a is 2, b is 1,s

11、wap(x,y) int x,y int temp; temp =x; x=y; y=temp; main() int a=1,b=2; swap(a,b); printf(“a is %d, b is %d”, a,b); ,参数传递复制-恢复,传值调用和引用调用的混合 在控制流进入被调用过程之前计算实参,实参的右值像传值调用那样传递给被调用过程,此外如果实参有左值的话,在调用之前确定它的左值 当控制返回时,将形参的当前右值复制回实参的左值,该左值是上述调用前计算的左值。 打印结果 a is 2, b is 1,swap(x,y) int x,y int temp; temp =x; x=y

12、; y=temp; main() int a=1,b=2; swap(a,b); printf(“a is %d, b is %d”, a,b); ,参数传递传名调用,传名调用的用法类似于宏 过程被看做宏,也就是说,在调用过程中将调用替换为被调用过程的过程体,但要把任何一个出现的形式参数都文字的替换为相应的实参 被调用过程中局部名字要保持与调用过程中的名字不同 打印结果 a is 2, b is 1,swap(x,y) int x,y int temp; temp =x; x=y; y=temp; main() int a=1,b=2; swap(a,b); printf(“a is %d, b is %d”, a,b); ,Thanks for your time! Questions & Answers,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号