【从零开始学习计算机科学】编译原理(七)运行时刻环境
- 运行时刻环境
- 存储组织
- 空间的栈式分配
- 活动树
- 活动记录和控制栈
- 简单栈式存贮分配
- C语言的过程调用和过程返回时的存贮管理
- 堆式存储分配
- 堆式存储分配的功能
- 垃圾回收
- 基于跟踪的垃圾回收
- 短停顿垃圾回收
运行时刻环境
存储组织
目标程序在它自己的逻辑地址空间内运行,程序中的代码和数据都在这个空间中有一个具体的地址。目标程序在逻辑地址空间的运行时刻映像包括:
- 代码区,存储目标代码。目标代码的大小在编译时刻就已经确定,编译器将可执行的目标代码放在一个静态确定的区域。
- 数据区,具体分为静态数据区、栈区和堆区。
- 静态数据区:程序的某些数据对象的大小可在编译时刻知道,它们可被放置在静态数据区。
- 栈区和堆区:动态数据区,其大小会随着程序运行而改变。
栈区存放为运行函数而分配的局部变量、函数参数、返回数据等,函数运行时分配,函数结束时释放。分配方式类似于数据结构中的栈。栈区是一块连续的内存区域;栈区内存通常大小有限,一般不超过8MB;向栈区申请的内存过大时会导致栈溢出。
堆区存放具有更灵活的生命周期的数据,支持手动分配和回收数据对象。分配方式类似于数据结构中的链表。其使用不连续的内存区域;32位计算机堆的大小最大可为4GB;若不释放分配的内存会造成内存泄露。
空间的栈式分配
活动树
我们可以用一棵树来描绘控制进入和离开活动的途径,这样的树称作活动树。在一棵活动树中:每一个结点代表一个过程的活动;根结点代表主程序的活动(如main函数);代表