- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
编译原理第八章 运行时数据分配
第八章 运行时数据区的管理 引言 一、数据的存储单元 编译程序必须为目标程序的运行分配数据的存储单元 ---如:变量、常量单元、临时工作单元、返回地址。 ---若无存放数据信息的单元,则目标程序将无法运行。 引言 二、存储单元分配策略 1、静态存储分配 ●在编译时就可以完全为数据项目分配存储单元,称为静态存储分配。 ●注:若一个程序设计语言不允许存储单元,称为静态存储分配。 ●注:若一个程序设计语言不允许递归调用,而且不含有可变数组,则可使用静态存储分配策略。 引言 二、存储单元分配策略 2、动态存储分配策略 ●在运行时才能进行数据存储单元分配,称为 动态存储分配。 ●注:1)若某程序设计语言允许过程调用,而且允许使用可变数组,那么在编译时就不可能完全为其数据项目分配存储单元,必须采取动态存储分配策略。 2)动态分配数据单元时一般使用: ----栈式存储分配 ----堆式存储分配 引言 二、存储单元分配策略 2、动态存储分配策略 (1)栈式存储分配 ●运行时,每进入一个过程,就在栈顶为该过程分配一块数据区,一旦退出该进程,它所占的空间也退还给系统。 (2)堆式存储分配 ●有些语言允许用户随时动态地申请和释放存储空间,但申请和释放之间不遵守先申请后释放或后申请先释放原则,故不能使用栈式存储分配,而是更复杂的动态分配策略。 ●这种策略是:让运行程序持有一个大的存区(堆),在申请时从堆中取一块,释放时将一块存储区退还给堆。 第二节 栈式存储管理 一、允许过程(函数)递归调用的数据存储管理 1、语言特点 允许过程(函数)的递归调用,但不允许定义嵌套的过程(函数),也不允许使用可变数组。如C语言 2、栈式存储分配 每进入一个过程,就有相应的数据区建立在栈顶。当程序开始运行前,用于建造数据区的栈是空栈,当开始进入主程序执行语句前,便在栈中建立全局变量和主程序数据区。在主程序中若有调用过程的语句时,便在栈顶累筑该过程的活动记录。在进入过程后执行过程的可执行语句前再把局部数组累筑于栈顶,若还有调用过程的语句就重复上述过程 第二节 栈式存储管理 例如有如下程序: MAIN( ) { …. Q( ) } P( ) {….} Q( ) {…. P( ); } 当P过程进入运行后,栈顶数据区有两个指针: ---SP指向现行过程数据区起点; ---TOP指向顶点 注:从数据区中引出指向主程序数据区的箭头表示外部变量引用关系。 第二节 栈式存储管理 一、允许过程(函数)递归调用的数据存储管理 3、活动记录 包含连接数据,形式单元,局部变量,内情向量和临时工作单元等。 第二节 栈式存储管理 注:1)活动记录的建立是按照调用次序而累筑而非排列次序; 2)栈顶活动记录数据区有两个指针SP和TOP,SP指向现行数据区起点,TOP指向顶点; 3)从数据区中引出指向主程序数据区的箭头表示外部变量引用关系; 4)C语言的活动记录所含区段是连接数据(包含老SP值(即前一活动记录的首地址;或称施调过程的数据区首地址)和返回地址(即调用语句的下一条指令的地址))参数(形参)个数、形式单元(存放实参值或地址)、过程的局部变量(简单变量)、数组内情向量和临时工作单元。 第二节 栈式存储管理 注:5) 过程中的局部变量(简单变量) 在内存地址可表示为变址形式x[SP],其中SP为当前数据区首地址,用作变址值,x称为相对位移量。连接数据: ---老SP值:前一活动记录的首地址(施调过程的数据区首址); ---返回地址: 简单变量x在数据区相对地址设为x,则,x的内存地址表示为变址形式 x[SP],SP为当前数据区首址,x为相对位移量。 第二节 栈式存储管理 一、允许过程(函数)递归调用的数据存储管理 4、C语言的数据区建立与撤消 1)过程调用段: ----Call语句翻译成中间代码后所作操作有两个:将参数传递到过程或函数的数据区的形参单元中;跳转到过程或函数。 ----例如:call Q(T1,T2,…..Tn)语句的中间代码为: ●Par T1 ●….. ●Par Tn ●Jsr,Q 一、允许过程(函数)递归调用的数据存储管理 4、C语言的数据区建立与撤消 2)过程进入段 工作 :(1)定义新活动记录的SP,保护返回地址和定义这个活动记录的TOP,即: --- SP:=TOP+1 ---1[SP]:=返回地址 ---TOP:=TOP+L/*L是过程Q的活动记录所需单元数*/ *(2)若过程中包含可变数组,且数组的空间分配在活动记录的顶上,则接下来执行对数组进行存储分配指令,这段指令是编译数组说明时产生的运行子程序,具体工作是: ---计算各维上下界; ---调用数组空间分配程序,构造内情向量表,计算数组尺寸预留数组空间 第二
文档评论(0)