首页 理论教育 编译原理与实践:不同语言的活动记录和连接数据

编译原理与实践:不同语言的活动记录和连接数据

时间:2023-11-17 理论教育 版权反馈
【摘要】:拿Pascal和C语言来说,当过程调用时,产生一个过程的新的活动,该活动的相关信息将用一个活动记录来表示,并被压入栈。不同语言的活动记录可能有所不同。图7-10给出了一个Pascal过程定义,其对应的中间代码形式如图7-10所示,运行时的活动记录如图7-10所示,图7-10则给出了此过程对应的目标代码。图7-10一个源程序及其各种形式在活动记录中,我们把形式参数、返回地址和保护区这3类数据称为连接数据,主要用来连接两个有调用关系的过程。

编译原理与实践:不同语言的活动记录和连接数据

过程的每个活动所需要的全部信息用一块连续的存储区来管理,这块存储区称为活动记录(Activation Record)。拿Pascal和C语言来说,当过程调用时,产生一个过程的新的活动,该活动的相关信息将用一个活动记录来表示,并被压入栈。不同语言的活动记录可能有所不同。一般情况下,当过程返回(活动结束)时,当前活动记录一般包含如下内容:

(1)返回地址。用来返回调用程序。

(2)形式参数。用来存放相应的实际参数的地址或值。

(3)局部变量和常数。用来存放程序中定义的变量和常数。

(4)临时变量。编译程序在生成中间代码时引入的变量,用来存放中间结果。

(5)保护区。用来保存该过程调用前的机器状态信息,包括程序计数器的值以及控制从该过程返回时必须恢复的寄存器的值,目的是能够返回到调用程序。(www.xing528.com)

下面通过一个例子来说明活动记录的具体内容。图7-10(a)给出了一个Pascal过程定义,其对应的中间代码形式如图7-10(b)所示,运行时的活动记录如图7-10(c)所示,图7-10(d)则给出了此过程对应的目标代码。

图7-10 一个源程序及其各种形式

在活动记录中,我们把形式参数、返回地址和保护区这3类数据称为连接数据,主要用来连接两个有调用关系的过程。实际上,活动记录的每个部分的长度在过程调用时都可以确定。除了动态数组必须到运行时由实参的数组元素个数决定该域的长度外,其他所有情况下域的长度都可以在编译时确定。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈