编译原理——编译程序构造实践教程 教学课件 作者 张幸儿 戴新宇 901编译程序构造与实践教程第九章.ppt

编译原理——编译程序构造实践教程 教学课件 作者 张幸儿 戴新宇 901编译程序构造与实践教程第九章.ppt

ID:50066894

大小:129.50 KB

页数:23页

时间:2020-03-08

编译原理——编译程序构造实践教程 教学课件 作者 张幸儿 戴新宇 901编译程序构造与实践教程第九章.ppt_第1页
编译原理——编译程序构造实践教程 教学课件 作者 张幸儿 戴新宇 901编译程序构造与实践教程第九章.ppt_第2页
编译原理——编译程序构造实践教程 教学课件 作者 张幸儿 戴新宇 901编译程序构造与实践教程第九章.ppt_第3页
编译原理——编译程序构造实践教程 教学课件 作者 张幸儿 戴新宇 901编译程序构造与实践教程第九章.ppt_第4页
编译原理——编译程序构造实践教程 教学课件 作者 张幸儿 戴新宇 901编译程序构造与实践教程第九章.ppt_第5页
资源描述:

《编译原理——编译程序构造实践教程 教学课件 作者 张幸儿 戴新宇 901编译程序构造与实践教程第九章.ppt》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、第9章目标代码的运行9.1概述如何保证正确地执行目标程序?除了目标代码正确外,必须为运行做好一切方面的准备:目标代码+运行的支持环境。除了语法结构目标代码的总体设计外,与运行紧密相关的就是:运行时刻的存储管理、寄存器分配、运行子程序。寄存器分配涉及太多的细节,不予讨论。存储管理涉及的是标识符,相应的是符号表,因此讨论问题:·运行时刻的存储管理;·符号表的管理;·运行时刻支持系统。9.2运行时刻的存储管理9.2.1变量情况分析冯•诺伊曼型计算机的核心是存储器:变量存储字变量与存储字的结合有多种情况,看下面的例子。例C程序:typedefs

2、tructNodeT{intdata;structNodeTnext;}NodeType;NodeTypeP;(1)voidCreateLink(){NodeTypep1,q;(2)intj=1;q=(NodeType)malloc(sizeof(NodeType));(3)p1=q;while(j){printf("Inputanintegervalue:");scanf("%d",&j);if(j){p1→next=(NodeType)malloc(sizeof(NodeType));(4)p1=p1→next;p1→data=j;}}

3、p1→next=NULL;p=q→next;free(q);(5)}/CreateLink/voiddisplay(NodeTypeq){NodeTypep1;(6)p1=q;while(p1){printf("%4d",p1→data);p1=p1→next;}}main(){CreateLink();display(p);}请注意几种不同的变量:·p(在(1)处定义)(全局变量)·p1与q(分别在(2)与(6)处定义)(局部变量)·指针变量q与p1所指向的各个数据对象(分别在(3)与(4)处创建)(无名变量)对上述三类变量,看到是完全不

4、同的三类。注意:作用域动态性生命期目标程序静态数据区栈↓↑堆存储区域划分存储分配策略:静态存储分配动态存储分配:栈式堆式9.2.2静态存储分配•静态存储分配:编译时刻进行的存储分配•语言背景:全局变量,C语言的静态变量等•编译时刻已知道它们的存在,且知道它们的大小编译时刻由编译程序为它们进行存储分配•但C语言、PASCAL语言等不能仅静态存储分配。9.2.3栈式存储分配•动态存储分配的一种•语言背景:函数调用运行时刻当函数调用时进行分配存储(活动记录)、运行结束返回时撤消存储(活动记录)由谁在何处完成栈式存储分配,也即活动记录的分配与释放?

5、由调用序列实现活动记录的存储分配,由返回序列实现活动记录的撤销。进一步说,是函数入口子程序实现对活动记录分配存储,由函数出口子程序实现对活动记录撤销存储。•栈式存储分配实质上是活动记录的分配与释放(在运行栈上)。返回值实在参数控制链访问链机器状态局部数据临时数据活动记录•如何确定局部量的存储位置?函数中的局部变量由它们在活动记录中(局部数据域)的相对地址来定位。•变量的存储位置的确定函数中局部变量存储位置的确定两个指针:top指向运行栈的栈顶(下一个活动记录的存储区域开始位置)(控制链域)top_sp指向活动记录中机器状态域的末端(局部数据

6、域之紧前,即指向局部数据区域的首址)•局部量的生命期与所在函数的生命期相同。9.2.4堆式存储分配•动态存储分配的一种•语言背景:存储分配函数的调用运行时刻,由调用malloc创建,由调用free撤消•一般说,只要出现下列情况中的任何一种情况,就必须采用堆式存储分配·数据对象随机地创建、随机地撤销;·当函数的活动结束时,局部变量的值还得保存下来;·被调用函数活动的生命期比调用函数活动的生命期更长。堆式存储分配的例子。typedefstructNode{intinfo;structNodeNext;}NodeType;NodeTypep;P=

7、(NodeType)malloc(sizeof(NodeType));P→info=1;p→Next=NULL;对已释放之存储的引用称为悬空引用。注意:要避免悬空引用,例如main函数中的dangle(5)。typedefintintp;intpp;intpdangle(intn){intpi,tmp;i=(intp)malloc(sizeof(int));i=n;tmp=i;free(tmp);returni;}main(){p=dangle(5);printf("p=%d",p);}注意:也要避免无用单元,即,动态分配时引起的不可达

8、到的存储字。例无用单元产生之例#includestructcell{intinfo;structcellnext;};typedefstructcelllin

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。