运行时环境笔记

《编译原理与实践》第七章
名词:
活动记录(Activation Record):包括参数,状态信息,local data,临时数据
stack frames:存储在stack上的AR
frame pointer:专门用于指向AR的寄存器
argument pointer(ap):专门用于指向AR中参数部分的寄存器
调用序列(calling sequence):包括AR的内存分配,参数的计算和存储,印象调用的必要的寄存器的存储和设置
返回序列(return sequence):返回值的设置,寄存器的调整,AR内存的释放
设计调用序列的重要性在于:
1)在调用者和被调用者之间划分调用操作的范围,即有多少调用序列的代码放在调用的时候,有多少代码放在被调用者开始
这一点是很重要的,一般来说在调用点插入代码较为容易,但是相同的代码被复制多次会导致生成的代码量的提高
2)多大程度上依赖于处理器的支持,而不是为调用序列的每一步显式的生成代码

【笔记】由以上知,AR中的各项数据,他们分别由谁来存储,需要在调用者(caller)和被调用者(callee)之间协调和分配

一般来说有三种主要的运行时环境,静态,基于栈,动态,这里主要说基于栈的运行时环境,因为这是C的方式
一般来说,这种基于栈的运行时环境,需要包括当前的AR和前一个AR,前一个AR用于在退出当前调用的时候使用。当前AR指针一般保存在fp中,前一个AR的指针则保存在当前AR中,一般在AR的中部,参数区和局部变量之间,该指针也被称为控制链(control link)或者动态链(dynamic link),它指向前一个AR的控制链。

上图给出了AR的结构,其中m为参数,y为局部变量,由于控制链在AR的中部,可以通过正负偏移量的方式,计算出各个参数和局部变量的地址
call sequence:
1.计算参数,并且把它们存储在正确的位置(通过入栈的方式,参数从右向左或者从左向右入栈)
2.把fp存储在新的AR的控制链中
3.把fp指向新的AR的控制链,通常就是把sp赋值给fp,因为此时,sp指向栈顶,也就是控制链的位置
4.把返回地址存储在新的AR中
5.跳转到被调用过程中
return sequence:
1.把fp赋值到sp中
2.把控制链加载到fp中(现在fp指向上一个AR)
3.根据返回地址进行跳转(可以通过fp找到返回地址的偏移)
4.sp popup 参数

如何处理变长参数

Nested Declaration
嵌套声明,在C中就是在一个block中,嵌套了另外一个block,对于这种情况,一般的处理方法是在进入block的时候,在栈中分配临时数据,在退出block的时候,释放栈中的临时数据

Stack-Based Environments with Local Procedures
对于在一个procedure中包含有另外一个procedure的情况,需要在AR中加入access link,指向定义procedure的AR,control link构建了calling environments,access link构建了defining environments。在访问变量的时候,通过access link可以逐层查找定义,为了计算递归查找的次数,为每一种declaration都加入了netsting level的概念,即嵌套层数,处于最外层的global 变量或者procedure的nesting level是0,嵌套一层该值加一。在m层如果需要访问n层的变量的话,只需要递归m-n次就可以查找到。


Stack-Based Environments with Procedure Parameters
在处理把Procedure当做参数的情况中,需要传递两个参数,一个是指令指针ip(指向代码地址),一个是环境指针ep(指向定义代码的AR),他们一起构成了closure(也就是access link close the hole caused by nonlocal reference)。如下图所示的调用过程:procedure p的参数是procedure r,procedure r在procedure q中定义

如下图:在调用p的AR中,参数a:<ip,ep>的ip是procedure r,ep是procedure r所在的procuedure q的AR,这是r的定义环境,而在procedure r被调用的时候,其AR中的access link就是这个ep所指向的access link

根据以上分析,最终的AR如下:
其中当参数为procedure的时候,需要传递procedure code和context作为参数,其中context就是access link,它指向caller
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值