编译程序在其工作过程中,必须为源程序中所出现的一些量(常量、变量及某些数组等等)分配运行时的存储空间。存储分配方案的选择是否得当,将关系到计算机资源的合理使用,从而也将对编译系统的解题能力产生一定的影响。
存储管理是指目标程序在运行时对内存的使用和再使用的安排。存储管理的策略要尽可能满足对内存使用的合理性和经济性,以及对程序中各个数据和实体访问的方便性。在实施存储管理时,应根据高级语言各自不同的特点来决定采取不同的存储分配方案。
如果一个高级语言不允许有可变体积的数据项或待定属性的名字,也不允许递归过程,则可以在编译时完全确定程序中每个数据项的存储空间。对于这样的高级语言(例如BASIC和FORTRAN) ,可采用静态分配的策略,也就是说,在编译时就分配各种数据项的存储空间。
反之,如果不能在编译时完全确定高级语言源程序中所有数据项的存储空间,就要采用动态分配的策略,即在编译时仅产生各种必要的信息,而在运行时,再动态地分配数据项的存储空间。动态分配一般有两种方案。一种是用一个栈作为动态分配的存储区,运行时,每当进入一个分程序或过程,其中各数据项所需的存储空间就动态地分配于栈顶;退出时,则释放所占用的空间。这种方法称为栈式动态分配。另一种是给运行的程序划分一个大的存储区(称为堆),每当需要时可从堆中分得一块,用过之后再退还给堆,这种方法称为堆式动态分配策略。如果说栈式分配很好地解决了过程的递归调用等问题,那么,堆式分配则解决了程序运行时动态申请存储空间等问题。