欢迎来到天天文库
浏览记录
ID:51495991
大小:228.50 KB
页数:29页
时间:2020-03-25
《编译原理实践 (2).ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、编译原理实践--运行时的存储组织与分配在程序的执行过程中,程序中数据的存取是通过对应的存储单元进行的。在早期的计算机上,这个存储管理工作是由程序员自己来完成。在程序执行以前,首先要将用机器语言或汇编语言编写的程序输送到内存的某个指定区域中,并预先给变量和数据分配相应的内存地址。而有了高级语言之后,程序员不必直接和内存地址打交道,程序中使用的存储单元都由逻辑变量(标识符)来表示,它们对应的内存地址都是由编译程序在编译时分配或由其生成的目标程序运行时进行分配。所以,对编译程序来说,存储的组织及管理是一个复杂而又十分重要的问题。另外
2、,有些程序设计语言允许有递归过程,有的允许有可变长度的串,有的允许有动态数组,而有些语言则不允许有这些,为什么呢?这都是因为采用了不同的存储分配方式。1、存储组织概述程序运行时,系统将为程序分配一块存储空间。这块空间用来存储程序的目标代码以及目标代码运行时需要或产生的各种数据:1)目标程序区:用来存放目标代码。2)静态数据区:用来存放编译时就能确定存储空间的数据。3)运行栈区:用来存放运行时才能确定存储空间的数据。4)运行堆区:用来存放运行时用户动态申请存储空间的数据。运行时存储空间的划分目标代码区静态数据区栈自由空间堆存储分
3、配策略静态存储分配在运行前就能确定数据空间的大小,因而在编译时就能分配各种数据项的空间,如FORTRAN语言动态存储分配不能在编译时完全确定所有数据项的存储空间,只能在编译时产生各种必要的信息,而在运行时,再动态地分配数据项的存储空间。包括栈式动态存储分配和堆式动态存储分配1)栈式动态存储分配:运行时,每当进入一个分程序或过程,其中各项数据项所需的存储空间就动态地分配于栈顶,退出时,则释放所占用的空间特点:效率很高,但是分配的内存容量有限2)堆式动态存储分配:允许用户动态申请存储空间,每当需要时可从堆中分得一块,用完之后再退还
4、给堆特点:动态内存的生存期由我们决定,使用非常灵活,但问题也最多注意:我们接下来只讨论栈式动态存储分配栈式动态存储分配在允许递归调用的语言中,每次递归调用都要重新分配局部变量。对于这种语言应该采用“栈式动态存储分配”,其分配策略是将整个程序的数据空间设计为一个栈,每当调用一个过程时就将其活动记录压入栈,在栈顶形成该过程工作时的数据区,而当过程结束时再将其活动记录弹出栈。在这种分配方式下,过程的调用关系是先进后出的栈模型,每个过程都可能有若干个不同的活动记录,每个活动记录代表了一次不同的调用。当前的AR首地址由栈指针SP指出。A
5、R中通常应包含如下内容:被调用过程非局部变量存储区的首地址(静态链、Display表)调用过程的AR首址(动态链,oldSP)调用点的机器状态形实参数通讯区返回值被调用过程的局部量和临时变量存储区返回指针returnedpointer动态链dynamiclink静态链staticlink机器状态machinestates参数单元parameters局部变量localvariables临时变量temporaries高地址低地址mainpQcallQcallQcallpSPmain’sARp’sARQ’sAR(1)Q’sAR(2)
6、栈增长方向过程的一次执行对应一个AR1)简单语言的栈式存储分配简单语言:无分程序结构,过程定义不嵌套,但允许过程的递归调用。如C语言。C语言不允许过程嵌套定义,即不允许在一个过程内定义另一个过程。C语言的全局变量只能出现在源程序的开头,可采用静态存储分配,编译时候就确定它们的地址计算局部变量或形参绝对地址的公式为:绝对地址=SP+相对地址比较简单,具体不再讨论2)嵌套过程语言的栈式存储分配嵌套过程语言:允许过程嵌套,如pascal,PL/0。AR中必须有一些内容,用于解决对非局部变量的引用问题“嵌套层次”,或称层数。主程序为0
7、,过程S在层数为i的过程R定义,则S层数为i+1一个过程可以引用包围它的任一外层过程所定义的变量,解决方法很多,常见的方法:双指针方法和Display表方法双指针方法简单直接,但当嵌套层次较多时,对非局部量的访问效率较低!Display表方法效率较高,实现略复杂对于PL/0的编译程序,采用的是双指针方法PL/0数据动态存储采用的技术措施编译时为每一变量名、过程名和程序段确定一个反映静态嵌套深度的级别level调用一个过程时,把他的活动记录压入运行时的栈顶,返回时弹出相应的活动记录。活动记录包括:静态链接SL:指向定义该过程的直
8、接外层过程的活动记录的基地址,以确保变量的正确存取动态链接DL:指向调用该过程前正在运行的那个过程的活动纪录的基地址,以确保能返回到调用过程段返回地址RA:保存该被调用过程返回后的地址,也就是调用过程指令的下一条指令的地址为过程局部变量预留的存储单元所有运算操作都从栈顶找到它
此文档下载收益归作者所有