运行时环境是目标计算机寄存器和内存的结构,用于管理内存和维护指导程序执行过程所需的信息。
运行时环境的类型 –
- 完全静态:
除了不支持递归函数调用之外,完全静态的运行时环境对于无法使用指针或动态分配的语言可能很有用。- 每个过程将只有一个在执行前分配的活动记录。
- 变量通过固定地址直接访问。
- 很少的簿记开销;即,最多返回地址可能必须存储在激活记录中。
- 调用序列包括计算每个参数地址并将其存储到其适当的参数位置并保存返回地址,然后进行跳转。
- 基于堆栈:
在这种情况下,每当进行函数调用时都会分配激活记录(推送激活记录)。必要的内存取自程序的堆栈部分。当程序执行从函数返回时,活动记录使用的内存被释放(活动记录的弹出)。因此,堆栈随着函数调用链的增长和收缩。 - 完全动态:
Lisp、ML 等函数式语言使用这种风格的调用堆栈管理。悄悄地,这里的活动记录只有在对它们的所有引用都消失时才会被释放,这需要在执行过程中的任意时间动态释放活动记录。需要内存管理器(垃圾收集器)。处理这种管理的数据结构是堆,这也称为堆管理。
激活记录——
单个程序执行所需的信息使用称为“激活记录”的连续存储块进行管理。
活动记录在进入一个过程时被分配,并在该过程退出时被释放。它包含临时数据、本地数据、机器状态、可选访问链接、可选控制链接、实际参数和返回值。
- 程序计数器 (PC) –其值是要执行的下一条指令的地址。
- Stack Pointer (SP) –其值为栈顶(栈顶,ToS)。
- 帧指针 (FP) –指向当前激活。
笔记:
激活记录从静态区域(如 Fortran 77)、堆栈区域(如 C 或 Pascal)和堆区域(如 lisp)之一分配。