首页 理论教育 编译原理与实践:静态存储分配实现

编译原理与实践:静态存储分配实现

时间:2023-11-17 理论教育 版权反馈
【摘要】:静态存储分配策略的实现非常简单。在FORTRAN语言中,每个初等类型的数据对象都用一个确定长度的机器字表示,比如,整型和布尔型用一个机器字表示,实型则用两个连续的机器字表示等。图7-12给出了一个FORTRAN程序段,图7-12则是该程序段编译时所对应的符号表,其中,“编号”栏和“地址”栏就形成了该程序段在运行时的存储映像。图7-12一个FORTRAN程序段和对应的符号表一个FORTRAN程序段的活动记录如图7-13所示。

编译原理与实践:静态存储分配实现

静态存储分配策略的实现非常简单。在FORTRAN语言中,每个初等类型的数据对象都用一个确定长度的机器字表示,比如,整型和布尔型用一个机器字表示,实型则用两个连续的机器字表示等。FORTRAN语言各程序段可以独立编译,在编译每段源程序时,首先,把每个变量及其类型等属性信息都填入到符号表中;然后,再依据符号表计算每个数据占用的空间大小,并在符号表的地址栏给它们分配地址。在分配地址时可以从符号表的第1个入口开始,依次为每个变量分配地址。比如,假设第1个数据对象的地址为a,表示相对于该源程序段的数据区的首地址的位移,则第2个数据对象的地址就是a+ni,其中,ni表示第1个变量所占有的单元数。依此类推,逐个累计计算每个数据对象的地址。图7-12(a)给出了一个FORTRAN程序段,图7-12(b)则是该程序段编译时所对应的符号表,其中,“编号”栏和“地址”栏就形成了该程序段在运行时的存储映像。

图7-12 一个FORTRAN程序段和对应的符号表

一个FORTRAN程序段的活动记录如图7-13所示。其中,返回地址单元用来存放调用程序段的返回地址;寄存器保护区则用来保存调用段的有关寄存器的信息,以供返回时使用;而形式单元是与形式参数相对应的,用来存放实际参数的地址或者值。

由于在对源程序段从左到右扫描的过程中,符号表的第1项总是形式参数,因此,在图7-13中,假定X的起始地址是a,于是,从0至a-1共a个单元则被返回地址和寄存器保护区所占用。并且,需要注意的是,形式单元的个数与参数传递的方式密切相关。如果采用传地址方式,则每个形式参数只需一个单元即可;如果采用得结果方式,则需要两个连续的单元,分别用来存放实参的地址和值。(www.xing528.com)

图7-13 FROTRAN程序段的活动记录格式

另外,对于各程序段中common语句说明的公用元的地址分配,可以采用如下的方式进行:首先,在符号表中把它们按公用块连接起来,并把公用块名登记在一张专门的公用块名表中,表中记录每个公用块在符号表中的链首和链尾;然后,在为每个公用块分配地址时,从公用块名表中查找到该块的链首,再沿公用链向下查找,从而为每个公用元分配地址。

编译程序为每个程序段及公用区建立了数据映像并生成目标代码之后,就可以使用装入程序把它们装入内存,此时,才可依据符号表中的数据区映像来建立数据的内存数据区。

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

我要反馈