欢迎来到天天文库
浏览记录
ID:50161477
大小:295.00 KB
页数:22页
时间:2020-03-09
《编译原理基础——习题与上机题解答 教学课件 作者 刘坚 第1-5章第5章.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第5章“运行环境”习题解答5.1静态分配策略对语言有哪些限制?栈分配策略对语言有哪些限制? 解: 静态分配策略对语言的限制是: ①名字的绑定是1对1的关系; ②数据对象的大小在编译时确定; ③不允许过程递归调用; ④不允许存储空间的动态分配和释放。栈分配策略对语言的限制是: ①当活动停止时,局部于该活动的名字的值不能保持; ②不允许存储空间任意地动态分配和释放; ③调用者和被调用者的生存期必须满足,后被调用先退出。5.2有过程p和函数max定义如下:procmax(a,b:integer):in
2、teger;beginifa3、大小设为Lp,max活动记录的大小设为Lmax; ④活动记录中的内容安排如题5.2图(a)所示(事实上,活动记录中内容的安排是根据具体应用而定的,此处仅是一个例子而已,其中的安排并不一定合理),其中任何数据对象均占据一个存储单元。(1)p与max之间的调用序列和返回序列如下表。(2)p调用max之前和p调用max之后的栈顶分别如题5.2图的(b)和(c)所示。题5.2图(a)活动记录内容安排;(b)p调用max之前的栈顶;(c)p调用max之后的栈顶5.3试解释为什么在程序运行的任何时刻,均可以通过控制链进行活动记录的正确切换4、,并且均可以通过访问链正确访问非本地数据。 解:(1)通过控制链进行活动记录的切换:控制链中存放的是调用者活动记录的指针(内存地址)。以A调用B为例,当调用发生时,调用序列把B的活动记录加入到控制栈的栈顶,修改栈顶指针指向B的活动记录,并且在B的控制链域中放入A的活动记录指针,这样当前的活动记录就从A切换到B;反之,当调用返回时,返回序列根据B中控制链中存放的A的活动记录指针把栈顶指向A的活动记录,弹出B的活动记录,并且恢复调用发生前的机器状态,这样当前的活动记录就从B切换到A。(2)通过访问链访问非本地数据:访问链指向当前活5、动的过程的最新直接外层过程的活动记录。若当前活动的过程x的嵌套深度为nx,则x活动记录中的访问链指向的活动记录的过程的嵌套深度为nx–1。即沿访问链追踪一次,活动记录对应过程的嵌套深度浅一层。考虑在过程a中调用过程b中的某变量x。设na和nb分别是过程a和b的嵌套深度(注意:nx=nb),由作用域规则可知,必有na≥nb,于是根据公式(5.1)(教材,P160),从当前层次na沿访问链追踪na–nb次,到达na–(na–nb)=nb层,即x所在的活动记录。5.4设过程p和过程q的嵌套深度分别为np和nq,试证明,无论是np6、是np≥nq,本章所讨论的显示表维护方法均能正确工作。 解: 显示表中的每个元素d[i]实质上是一个栈式链表,将所有在生存期的、嵌套深度为i的活动的活动记录链起,最新被调用的活动记录在栈顶。过程调用和返回时显示表的维护仅与当前在控制栈顶的活动记录有关,而与调用者和被调用者的嵌套关系无关。因此只需证明任何一个嵌套深度为i的过程在它被调用时和返回时d[i]可以被正确维护。(1)被调用时的维护过程: ①将d[i]的值保存在新活动记录(被调用者的活动记录)的访问链中,并且 ②置d[i]指向新的活动记录(置d[i]内容为被调7、用者活动记录的sp)。(2)过程返回时的维护过程: 将被调用者活动记录访问链中的内容拷贝回d[i]。 考察调用嵌套深度为i的过程a和从过程a返回时d[i]的变化过程:设调用a之前d[i]的内容是过程b的活动记录的spb,根据显示表的内容可知,b的嵌套深度为i,且是所有嵌套深度为i的、在生存期的活动中最新被调用的。调用a之后,经过上述维护过程(1),spb被放在了a活动记录的访问链中,而d[i]的内容被更改为spa,即d[i]仍然指向嵌套深度为i的最新被调用的活动记录;从a返回时,经过上述维护过程(2),a的活动记录的访问链8、中的内容,即spb被重新放回d[i],于是当从a返回之后,d[i]还是指向嵌套深度为i的最新被调用者的活动记录。5.5有一过程A如下所示。采用静态作用域和最近嵌套原则,设A是第0层的过程。procedureAisprocedureBisproced
3、大小设为Lp,max活动记录的大小设为Lmax; ④活动记录中的内容安排如题5.2图(a)所示(事实上,活动记录中内容的安排是根据具体应用而定的,此处仅是一个例子而已,其中的安排并不一定合理),其中任何数据对象均占据一个存储单元。(1)p与max之间的调用序列和返回序列如下表。(2)p调用max之前和p调用max之后的栈顶分别如题5.2图的(b)和(c)所示。题5.2图(a)活动记录内容安排;(b)p调用max之前的栈顶;(c)p调用max之后的栈顶5.3试解释为什么在程序运行的任何时刻,均可以通过控制链进行活动记录的正确切换
4、,并且均可以通过访问链正确访问非本地数据。 解:(1)通过控制链进行活动记录的切换:控制链中存放的是调用者活动记录的指针(内存地址)。以A调用B为例,当调用发生时,调用序列把B的活动记录加入到控制栈的栈顶,修改栈顶指针指向B的活动记录,并且在B的控制链域中放入A的活动记录指针,这样当前的活动记录就从A切换到B;反之,当调用返回时,返回序列根据B中控制链中存放的A的活动记录指针把栈顶指向A的活动记录,弹出B的活动记录,并且恢复调用发生前的机器状态,这样当前的活动记录就从B切换到A。(2)通过访问链访问非本地数据:访问链指向当前活
5、动的过程的最新直接外层过程的活动记录。若当前活动的过程x的嵌套深度为nx,则x活动记录中的访问链指向的活动记录的过程的嵌套深度为nx–1。即沿访问链追踪一次,活动记录对应过程的嵌套深度浅一层。考虑在过程a中调用过程b中的某变量x。设na和nb分别是过程a和b的嵌套深度(注意:nx=nb),由作用域规则可知,必有na≥nb,于是根据公式(5.1)(教材,P160),从当前层次na沿访问链追踪na–nb次,到达na–(na–nb)=nb层,即x所在的活动记录。5.4设过程p和过程q的嵌套深度分别为np和nq,试证明,无论是np6、是np≥nq,本章所讨论的显示表维护方法均能正确工作。 解: 显示表中的每个元素d[i]实质上是一个栈式链表,将所有在生存期的、嵌套深度为i的活动的活动记录链起,最新被调用的活动记录在栈顶。过程调用和返回时显示表的维护仅与当前在控制栈顶的活动记录有关,而与调用者和被调用者的嵌套关系无关。因此只需证明任何一个嵌套深度为i的过程在它被调用时和返回时d[i]可以被正确维护。(1)被调用时的维护过程: ①将d[i]的值保存在新活动记录(被调用者的活动记录)的访问链中,并且 ②置d[i]指向新的活动记录(置d[i]内容为被调7、用者活动记录的sp)。(2)过程返回时的维护过程: 将被调用者活动记录访问链中的内容拷贝回d[i]。 考察调用嵌套深度为i的过程a和从过程a返回时d[i]的变化过程:设调用a之前d[i]的内容是过程b的活动记录的spb,根据显示表的内容可知,b的嵌套深度为i,且是所有嵌套深度为i的、在生存期的活动中最新被调用的。调用a之后,经过上述维护过程(1),spb被放在了a活动记录的访问链中,而d[i]的内容被更改为spa,即d[i]仍然指向嵌套深度为i的最新被调用的活动记录;从a返回时,经过上述维护过程(2),a的活动记录的访问链8、中的内容,即spb被重新放回d[i],于是当从a返回之后,d[i]还是指向嵌套深度为i的最新被调用者的活动记录。5.5有一过程A如下所示。采用静态作用域和最近嵌套原则,设A是第0层的过程。procedureAisprocedureBisproced
6、是np≥nq,本章所讨论的显示表维护方法均能正确工作。 解: 显示表中的每个元素d[i]实质上是一个栈式链表,将所有在生存期的、嵌套深度为i的活动的活动记录链起,最新被调用的活动记录在栈顶。过程调用和返回时显示表的维护仅与当前在控制栈顶的活动记录有关,而与调用者和被调用者的嵌套关系无关。因此只需证明任何一个嵌套深度为i的过程在它被调用时和返回时d[i]可以被正确维护。(1)被调用时的维护过程: ①将d[i]的值保存在新活动记录(被调用者的活动记录)的访问链中,并且 ②置d[i]指向新的活动记录(置d[i]内容为被调
7、用者活动记录的sp)。(2)过程返回时的维护过程: 将被调用者活动记录访问链中的内容拷贝回d[i]。 考察调用嵌套深度为i的过程a和从过程a返回时d[i]的变化过程:设调用a之前d[i]的内容是过程b的活动记录的spb,根据显示表的内容可知,b的嵌套深度为i,且是所有嵌套深度为i的、在生存期的活动中最新被调用的。调用a之后,经过上述维护过程(1),spb被放在了a活动记录的访问链中,而d[i]的内容被更改为spa,即d[i]仍然指向嵌套深度为i的最新被调用的活动记录;从a返回时,经过上述维护过程(2),a的活动记录的访问链
8、中的内容,即spb被重新放回d[i],于是当从a返回之后,d[i]还是指向嵌套深度为i的最新被调用者的活动记录。5.5有一过程A如下所示。采用静态作用域和最近嵌套原则,设A是第0层的过程。procedureAisprocedureBisproced
此文档下载收益归作者所有