目标程序运行时存储组织
目标程序运行时的存储组织是指在运行阶段对目标代码的存储分配和组织形式的设计和实现。这种设计和实现需要考虑编译程序在编译阶段对存储组织形式的设计,并将其体现出来。目标程序运行时的存储组织要解决的问题是把静态的源程序与程序运行时的动态活动联系起来,即运行中的程序信息是如何进行存储和访问的。
在程序执行过程中,程序中数据的存取是通过对应的存储单元来进行的。因此,存储组织就是要在编译阶段为源程序中出现的用户定义的变量与常量、临时工作单元、过程或函数调用时需要的连接单元与返回地址等分配其在运行阶段的存储空间。
目标程序运行时的存储空间结构包括目标代码区、静态数据区、栈区和堆区。目标代码区用于存放目标代码,静态数据区用于存放编译时能确定所占用空间的数据,如全局变量和静态变量。栈区和堆区用于存放编译时不能确定所占用空间的数据,如可变数据以及管理过程活动的控制信息。
影响存储空间分配策略的因素包括源语言的结构特点、源语言的数据类型、源语言中决定名字作用域的规则等。编译器具体实现时,采用静态存储分配、栈式动态存储分配和堆式动态存储分配三种策略之一或其混合形式。
静态存储分配是指在编译时对数据对象分配固定的存储位置,运行时始终不变。这种策略适用于不允许递归过程或递归调用,不允许可变体积的数据结构的语言。
动态存储分配是指在运行阶段动态地为源程序中的数据对象分配存储位置。这种策略适用于允许递归过程、允许可变数据结构和允许用户自由申请和释放空间的语言。
栈式动态存储分配是指在数据空间中开辟一个栈区,每当调用一个过程时,它所需要的数据空间就分配在栈顶,每当过程工作结束时就释放这部分空间。这种策略适合于典型过程式语言,如 PASCAL 和 C 语言。
堆式动态存储分配是指在数据空间中开辟一片连续的存储区(通常叫做堆),每当需要时就从这片空间借用一块,不用时再退还。这种策略适合于用户可以自由申请和归还数据空间的语言,如 C++ 语言。
目标程序运行时的存储组织是编译程序在编译阶段对存储组织形式的设计和实现,并将其体现出来。这种设计和实现需要考虑编译程序在编译阶段对存储组织形式的设计,并将其体现出来,以便在运行阶段实现目标程序的正确执行。