编译器设计中运行时存储管理的作用是什么?
编译器需要一块内存用于操作系统。编译器利用这块内存来执行已编译的程序。这块内存被称为存储管理。编译器必须执行的一项重要任务是分配目标机器的资源来表示源程序正在操作的数据对象。
编译器必须确定源程序中数据对象的运行时表示。在源程序中,数据对象的运行时表示(例如整数和实数变量)通常采用机器级别的等效数据对象的形式,而数据结构(例如数组和字符串)则由几段机器内存表示。
就为变量的生存期分配存储空间而言,有三种可能性:
如果变量的生存期是程序的生存期,并且一旦分配了其值的存储空间,以后就不能释放。这种存储被称为静态存储。
如果变量的生存期是声明该变量的特定块、函数或过程,则在块、函数或过程执行结束时,可以释放分配给该变量的存储空间。这种存储被称为动态存储。
可以在程序执行的特定点为不一定要与变量关联的值分配存储空间,该点不一定要对应于块的开始或过程的入口。然后从那时起需要存储空间,直到通过语言机制或通过程序不再可以访问而释放。
然而,这种释放的移动,这个空间只被称为运行时。这种存储被称为全局存储。因此,在介绍结束时,最终可以得出结论,在运行时必须注意以下问题:
- 它可以管理源程序中的名称与运行时存在的数据对象之间的关系。
- 它可以管理运行时数据对象的分配/释放和访问。
- 它可以控制和跟踪不同的过程及其调用。
- 它可以管理语言提供的库函数。
用于为数据对象分配存储空间的策略由定义程序设计语言中名称的作用域和持续时间的规则确定。最简单的策略是静态分配,它用于FORTRAN之类的语言。
使用静态分配,可以在编译期间确定每个数据对象的运行时大小和相对位置。对于支持递归的语言,需要一种更复杂的动态内存分配策略(涉及堆栈),递归的含义是:进入新的块或过程会导致在堆栈上分配空间,并在退出块或过程时释放空间。
广告