本篇文章也是拾遗,丫的,叫你大学不好好听课啊,现在还不是乖乖看起了.下文摘自编译原理第十章.
从逻辑上看,在代码生成前,编译程序必须进行目标程序运行环境的设计和数据空间的分配.程序在运行的时候需要得到一块内存空间让自己在上面运行,此空间需要包含目标代码和目标代码运行时的数据空间.通常,此内存区域划分为:目标区, 静态数据区, 栈区, 堆区.
在编译时能确定目标程序运行中所需要的全部数据空间的大小,编译时安排豪目标程序运行时的全部数据空间,确定每个数据对象的存数位置
如果一个程序设计语言允许递归过程,可变数组或允许用户自由申请和释放空间,那么就需要动态存储管理技术.因为对于这种程序在编译时无法知道他在运行时需要多大的存储空间,它所需要的数据空间的大小需要程序运行时动态的确定.有两种动态存储分配方式:栈式(stack)和堆式(heap)
这种分配策略是将整个数据的数据空间设计为一个栈.每当调用一个过程时,它所需要的数据空间就分配在栈顶,每当工作结束时就释放这部分空间.过程所需的数据空间包括两部分:一部分是生存期在本过程这次活动中的数据对象,如局部变量,参数单元,临时变量等等;另一部分则是用以管理过程活动的记录信息.即当一次过程调用出现时,调用该过程的那个过程的活动即被中断,当前机器的状态信息,诸如程序计数器(返回地址).,存器的值等等,也都必须保留在栈中.
当控制从调用返回时,便根据栈中记录的信息恢复机器状态,使该过程的活动继续进行.
如果一个程序语言提供用户自由地申请数据空间和退还数据空间的机制(如new init),或者不仅有过程而且有进程的程序结构的情况下,空间的使用未必服"先申请后释放,后申请先释放"的原则,那么栈式的动态分配方案就不适用了.通常使用一种称为堆式的动态存储分配方案.假设程序允许时有一个大的存储空间,每当需要时就从这片空间中借用一块,不用时再退还,由于借还的时间先后不一,经一段运行之后,程序运行空间将被分划成许多块块,有些占用,有些空闲.那么当运行程序要求一块体积为N的空间时,需要决定应该从哪个空闲块得到这个空间.理论上讲,应该从比N稍大一些的空闲块中取出N个单元,以便使大的空闲块派更大的用场,但实际难度很大,实际中常常采用的办法是:先遇到哪块比N大就从其中取出N个单元.即使这样,也会发生找不到一块比N大的空闲块,但所有空闲块的总和比N大得多的情况,这时,有的分配管理系统采用废品回收的办法来应付.
原文地址:http://blog.csdn.net/uxyheaven/article/details/41686601