在计算机科学中,编译原理是研究如何将高级编程语言转换为机器可执行代码的学科。本章主要探讨的是运行时存储空间的组织和管理,这是程序执行的关键环节。中国科学技术大学计算机科学与技术学院的陈意云教授在这一章节中详细讲解了这一主题。
运行时存储空间的组织涉及到如何安排和管理程序在执行过程中所需的数据和代码。过程(或函数)的活动是指过程在一次调用中的具体执行,包括过程的代码和存放过程活动所需信息的存储空间,这部分存储空间被称为活动记录。活动记录包含了如返回值、临时数据、参数控制链、访问链、机器状态以及局部数据等元素。
在讨论存储分配策略时,要考虑语言特性,例如过程是否可以递归、局部变量的值是否需要在返回时保留、过程是否能访问非局部变量、参数传递方式(传值、传引用等)、过程是否可以作为参数传递、过程是否可以作为返回值,以及存储块是否能动态分配和是否需要显式释放。
接着,讲解了名字的作用域和绑定的概念。名字的作用域是指一个声明在其定义的程序部分内有效,而在运行时,名字可能代表不同的数据对象。环境负责将名字映射到左值,而状态则将左值映射到右值。赋值操作改变状态,但不改变环境;过程调用会改变环境,即改变名字到存储单元的映射关系。
静态概念和动态概念之间存在对应关系。过程的定义对应于过程的活动,名字的声明对应于名字的绑定,声明的作用域对应于绑定的生存期。这帮助我们理解在编译时和运行时,程序结构是如何映射到实际的存储分配的。
活动记录的常见布局包括返回值、临时数据、参数控制链、访问链、机器状态和局部数据。局部数据的布局是根据变量类型静态确定的,通常按照声明顺序分配空间,并且考虑到数据对象的对齐问题。例如,结构体的大小可能会因为对齐规则而有所不同,不同架构(如SPARC/Solaris和X86/Linux)的对齐策略可能不同,导致相同结构体的大小会有差异。
程序块(或称代码块)是包含局部变量声明的语句,可以嵌套,并遵循最接近的嵌套作用域规则。并列程序块的变量可以重叠分配,但只有最近的那个块内的变量处于活跃状态。
通过以上内容,我们可以了解到运行时存储空间的组织和管理对于程序执行效率和正确性的重要性,以及如何根据编程语言特性和硬件架构来优化存储分配策略。