编译基本知识存储组织.ppt
《编译基本知识存储组织.ppt》由会员分享,可在线阅读,更多相关《编译基本知识存储组织.ppt(74页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、编译原理之存储组织,华东交通大学软件学院 万仲保,第十章 目标程序运行时的存储组织,概述 数据空间的使用方法和管理方法 栈式存储分配的实现 参数传递 过程操作 练习,概述,一般来讲,假如编译程序从操作系统中得到一块存储区以位目标程序在其上运行,该存储区需容纳生成的目标代码和目标代码运行时的数据空间。 数据空间应包括: 用户定义的各种类型的数据对象(变量和常数)所需的存储空间、作为保留中间结果和传递参数的临时工作单元,调用过程时所需的连接单元、以及组织输入/输出所需的缓冲区。 运行时的存储区常常划分成: 目标区、静态数据区、栈区和堆区。 运行时存储区的典型划分 编译程序对数据空间的分配,运行时存
2、储区的典型划分,代码(code)区用以存放目标代码,这是固定长度的,即编译时能确定的。 静态数据区(static data)用以存放编译时能确定所占用空间的数据。 堆栈区(stack and heap)用于可变数据以及管理过程活动的控制信息。,目标程序运行时存储区的典型划分,编译程序对数据空间的分配,基本原则是程序语言设计时对程序运行中存储空间的使用和管理办法的规定。 数据空间的分配: 本质上看是将程序中的每个名字与一个存储位置关联起来,该存储位置用以容纳名字的值。 在程序设计语言语义学中,使用术语environment表示将一个名字映射到一个存储位置的函数,术语state表示存储位置到值的映
3、射。,名字到存储、到值的映射,数据空间的使用方法和管理方法,术语: 静态:如果一个名字的性质通过说明语句或隐或显规则而定义,则称这种性质是“静态”确定的。 动态:如果名字的性质只有在程序运行时才能知道,则称这种性质为“动态”确定的。 静态存储分配 动态存储分配,静态存储分配,如果在编译时能确定目标程序运行中所需的全部数据空间的大小,编译时安排好目标程序运行时的全部数据空间,确定每个数据对象的存储位置,那么则称这种分配策略为静态存储分配。 示例 FORTRAN 77的示例程序 该程序中局部变量的静态存储位置,FORTRAN 77的程序,局部变量的静态存储位置,动态存储分配,如果一个程序设计语言允
4、许递归过程、可变数组或可变数据结构,那么,就需要采用动态存储管理技术。因为对于这种程序在编译时无法知道它在运行时需要多大的存储空间,它所需要的数据空间的大小需待程序运行时动态地确定。 分类: 栈式动态存储分配 堆式动态存储分配,栈式动态存储分配,这种分配策略是将整个程序的数据空间设计为一个栈。它适用于Pascal,C,ALGOL之类的语言的实现,每当调用一个过程时,它所需的数据空间就分配在栈顶,每当过程工作结束时就释放这部分空间。 过程所需的数据空间包括两部分: 一部分是生存期在本过程这次活动中的数据对象,如局部变量、参数单元、临时变量等等; 另一部分则是用以管理过程活动的记录信息,即当一次过
5、程调用出现时,调用该过程的那个过程的活动即被中断,当前机器的状态信息,诸如程序计数器(返回地址)、寄存器的值等等,也都必须保留在栈中。 当控制从调用返回时,便根据栈中记录的信息恢复机器状态,使该过程的活动重新开始。,堆式动态存储分配,如果一个程序语言提供用户自由地申请数据空间和退还数据空间的机制(如C+中的new,deletePascal的new,便是这种机制),或者不仅有过程而且有进程的程序结构,即空间的使用未必服从“先申请后释放,后申请先释放”的原则,那么栈式的动态分配方案就不适用了。这种情况下通常使用一种称为堆式的动态存储分配方案。 假设程序运行时有一个大的存储空间,每当需要时就从这片空
6、间中借用一块,不用时再退还,由于借还的时间先后不一,经一段运行之后,程序运行空间将被分划成许多块块,有些占用,有些空闲。那么当运行程序要求一块体积为N的空间时,需要决定应该从哪个空闲块得到这个空间。 理论上讲,应该从比N稍大一些的空间块中取出N个单元,以便位大的空闲块派更大的用场,但实现难度很大,实际中常常采用的办法是:先遇到哪块比N大就从其中取出N个单元。即使这样,也会发生找不到一块比N大的空闲块,但所有空闲块的总和比N大得多的情况,这时,有的分配管理系统采用废品回收的办法来应付。,栈式存储分配的实现,过程的活动记录 简单的栈式动态分配实现 嵌套过程语言的栈式实现 分程序结构的存储管理,过程
7、的活动记录,过程的活动记录是一段连续的存储区用以存放过程的一次执行所需要的信息。 简单描述,简单描述,1临时工作单元,比如计算表达式过程中需存放中间结果用的临时值单元。 2局部变量,一个过程的局部变量。 3 保存机器状态,容纳该过程执行前关于机器状态信息,诸如程序计数器、寄存器的值,这些值都需要在控制从该过程返回时给予恢复。 4存取链,用以存取非局部变量,这些变量存放于其它过程活动记录中。并不是所有语言需要该信息。 5控制链,指向调用该过程的那个过程的活动记录,这也不是所有语言都需要的。 6实参,也称形式单元,由调用过程向该被说过程提供实参的值(或地址)。当然在实际编译程序中,也常常使用机器寄
8、存器传递实参。 7返回地址,保存该被调过程返回后的地址。,简单的栈式动态分配实现,要求: 没有分程序结构 过程定义不嵌套 允许过程递归调用 示例: 程序结构 分配策略 存储分配结构图 活动记录内容 运行栈,程序结构,分配策略,运行时,每当进入一个过程,则为该过程分配一段存储区。当一个过程工作完毕返回时,它所占用的存储区则可释放。程序运行时的存储空间,(栈)中在某一时刻可能会包含某个过程的几个活动记录(某个过程递归调用的情况); 另外,同样的一个存储位置,可能不同运行时刻分配给不同的数据对象。,存储分配结构图,若主程序调用了过程Q,Q又调用了R,在R进入运行后的存储结构如图(a)所示。 若主程序
9、调用了过程Q,Q递归调用自己,在Q过程第二次进入运行后的存储结构如图(b)所示。 若主程序先调用过程Q,然后主程序接着调用R,且Q过程不调用Q和R,这时Q和R进入运行后的存储结构分别如图(c)和(d)所示。,活动记录内容,SP总是指向现行过程活动记录的起点。 TOP则始终指向已占用的栈顶单元。,运行栈,嵌套过程语言的栈式实现,具有嵌套过程的Pascal程序 程序中过程定义的嵌套情况 存储栈的布局 活动记录情况 在过程活动记录中增设存储链 在过程活动记录中存取非局部变量,具有嵌套过程的Pascal程序,程序中过程定义的嵌套情况,sort readarray exchange quickson p
10、artition 可将整个程序sort看成最外层的过程,readarray、 exchange、 quickson、 partition中引用的a均不是它们的局部变量,而是过程sort的局部变量。,存储栈的布局,假如过程sort激活(调用)了过程quicksort,这时存储栈小的情形示意如下图所示,其中在quicksort过程活动记录中有一(或一些)存储单元(用斜线描绘)用以记录过程quicksort以引用sort中定义的变量a和x。,增设存储链,在活动记录过程中增设存取链,指向包含该过程的直接外层过程的最新活动记录的起始位置。 示例: 过程活动记录的内容图 过程sort调用过程quickso
11、rt的存储栈图 如果某次执行的顺序为: sortquicksortquicksortpartitionexchange 进入过程exchange之后的运行栈图。,过程活动记录的内容图,过程sort调用过程quicksort的存储栈图,进入过程exchange之后的运行栈图,存取非局部变量,存取非局部变量的办法是常用的有效办法。即每进入一个过程后,在建立它的活动记录的同时建立一张嵌套层次显示表display。 display是一个指针数组d,也可看作是一个小栈,自顶向下每个单元依次存放着现行层,直接外层,直至最外层(0层,主程序层)等每一层过程的最新活动记录的地址。 示例: 1)sortquic
12、ksort ; 2)sortquicksort quicksort ; 3)sortquicksort quicksort partition ; 4)sortquicksortquicksortpartitionexchange 过程调用时display的建立,1的运行栈和display,2的运行栈和display,3的运行栈和display,4的运行栈和display,过程调用时display的建立,当过程P1调用过程P2而进入P2后,P2为了建立自己的display,P2必须知道它的直接外层过程(记为P0)的display。这意味着,当P1调用P2时必须把P0的display地址作为连接
13、数据之一传给P2。 display的构造 P2是真实过程时的构造 P2是形式参数时的构造,真实过程时的构造,P0或者就是P1自身或者既是P1又是P2的直接外层(示意图)。不论哪一种情形,只要在进入P2后能够知道P1的display就能知道P0的display ,从而可直接构造出P2的display 。 事实上,只需从P1的display中自底而上地取过l2个单元(l2为P2的层数)再添上进入P2后新建立的SP值就构成了P2的display。也就是说,在这种情况下,只需把P1的display地址作为连接数据之一传送给P2就能够建立P2的display。,P1调用P2的两种不同嵌套示意图,形式参数
14、时的构造,调用P2意味着调用P2当前相应的实在过程。此时的P0应是这个实在过程的直接外层过程。 假定P0的display地址可从形式单元P2所指示的地方获得。为了能在P2中获得P0的display地址,必须在P1调用P2时设法把P1的display地址作为连接数据之一(称为“全局display地址”)传送给P2。于是连接数据变为三项: (1)老SP值; (2)返回地址; (3)全局display地址。,分程序结构的存储管理,概述 声明作用域遵循的原则最近嵌套原则 分程序结构的存储管理 分程序结构的存储实现方法 视分程序为“无参过程” 视分程序为完整的过程体 活动记录的内容 分程序的进入和退出时
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 基本知识 存储 组织
限制150内