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