StephenChan's Tech Space 潜心修炼

12Dec/090

基于栈的运行时环境

在《Compiler Construction Principles and Practice》一书中讲了两种语言运行时环境:完全静态运行时环境和基于栈的运行时环境。

完全静态运行时环境是最简单的运行时环境类别,其所有的数据都是静态的,且在程序执行期间内存中的数据都是固定的,这种运行时环境没有指针和动态内存分配,并且也不支持函数递归调用,这类语言的一个标准例子就是FORTRAN77。在完全静态运行时环境中,所有的变量,不论全局和局部的变量,都是静态分配的,我们可以通过固定的地址来直接访问到这些变量。

基于栈的运行时环境是我们常见的语言运行时环境,如C,C++等语言就是基于栈的运行时环境。允许递归调用并且在递归调用过程中要重新分配局部变量,不能静态分配活动记录(Activation Record)。一般在内存中,数据的组织如下:

在内存中数据组织图

代码区域是程序的执行指令,是不允许修改的,接下来就是全局和静态数据区,然后就是栈和堆。栈是向下生长的(向地址空间减少的方向),而堆是向上生长的(向地址空间增加的方向)。在内存分配中的一个重要单元为过程活动记录(procedure activation record),它包含了过程或函数被调用时内存分配的局部数据,一个活动记录一般包含下面几个部分:

活动记录

其实活动记录就是函数调用时被压入栈的数据总称,首先被压入栈的是函数或过程的参数,接着是返回地址,然后在函数执行过程中分配的局部数据等等。涉及函数调用还有一个指向当前活动记录的指针,称为框架指针(frame pointer)或fp,通常fp保存在寄存器中,而每个活动记录中,在bookkeeping information区域(薄记信息),都会有一个值(称为Control Link)指向上一个活动记录,即调用当前函数的函数活动记录,使整个执行流程中的活动记录呈现链状形式。

Filed under: Compiler Continue reading