- 1
- 0
- 约1.15万字
- 约 57页
- 2016-11-22 发布于天津
- 举报
第八讲运行时环境-.ppt
* 《编译原理与技术》-运行环境 * 过程嵌套定义语言中非局部名字访问 访问链的建立 在嵌套深度为np的过程X调用嵌套深度为na的过程Y: 1)np<na 此时 np = na – 1 ;即调用者X是父(即最接近的外围)过程,而被调者Y为其子过程,这时将过程Y的AR中的访问链置为X的AR的基址--对应的运行时栈的操作: push bp // 调用者(父过程)将自己的bp压入栈 * 《编译原理与技术》-运行环境 * 过程嵌套定义语言中非局部名字访问 访问链的建立 2)np≥na 这属于内层过程X调用外围过程Y;或者两个兄弟过程X、Y之间的调用(也可能是相同过程,即递归的情况)。这时由X的AR追踪访问链(np – na + 1)次,即可到达嵌套深度为(na – 1) 的过程Z的AR;显然,过程Z是过程Y的父过程,将这个Z的AR的基址填入Y的访问链域。对应运行时栈上的操作: 1)(bp + 访问链单元的偏移)? Reg //追踪1次 2)(Reg + 访问链单元的偏移)? Reg //追踪2次 … … // 追踪(np – na + 1)次 最后, push Reg //过程Z的活动记录基址入栈 * 《编译原理与技术》-运行环境 * e.g.7 嵌套的过程定义 过程的调用次序 主程序? A ? B ? C ? B1 … 过程B第一次被过程C调用时,C需追踪2次访问链才能为找到过程B1的父过程A的AR。 具体如下: * 《编译原理与技术》-运行环境 * … 控制链:bp(系统) 主程序AR e.g.7 嵌套的过程定义 运行时栈:主程序 * 《编译原理与技术》-运行环境 * … 控制链:bp(系统) 访问链:bp(main) 返回地址1 控制链:bp(main) 局部名字:i 主程序AR 过程A的AR e.g.7 嵌套的过程定义 运行时栈:主程序? A 主程序负责建立A(活动记录中)的访问链。此时该链指向主程序运行时的活动记录(why?)。此访问链的位置(或偏移)是多少? 访问链的地址表示: bp + 8 在此活动记录中的偏移为8 * 《编译原理与技术》-运行环境 * … 控制链:bp(系统) 访问链:bp(main) 返回地址1 控制链:bp(main) 访问链:bp(A) 返回地址2 控制链:bp(A) 局部名字:i 局部名字:j0 主程序AR 过程A的AR 过程B的AR e.g.7 嵌套的过程定义 运行时栈:主程序? A ? BB中语句j := i如何执行的? j := i执行如下: 取过程A的活动记录地址: (bp + 8) - R 取A中局部变量i的值: (R – 4 ) - R 将该值赋给B的局部变量j: R - (bp – 4) * 《编译原理与技术》-运行环境 * … 控制链:bp(系统) 访问链:bp(main) 返回地址1 控制链:bp(main) 访问链:bp(A) 返回地址2 控制链:bp(A) 局部名字:i 局部名字:j0 访问链:bp(B) 返回地址3 控制链:bp(B) 主程序AR 过程A的AR 过程B的AR 过程C的AR 运行时栈:主程序? A ? B ? C … 控制链:bp(系统) 访问链:bp(main) 返回地址1 控制链:bp(main) 访问链:bp(A) 返回地址2 控制链:bp(A) 局部名字:i 局部名字:j0 访问链:bp(B) 返回地址3 控制链:bp(B) 访问链:bp(A) 返回地址4 控制链:bp(C) 局部名字:j1 主程序AR 过程A的AR 过程B的AR 过程C的AR 过程B的AR 1 2 运行时栈:主程序? A ? B ? C ? B1 过程C为过程B1 建立访问链: 1: (bp+8)?R 2:(R+8)?R 3: push R * 《编译原理与技术》-运行环境 * 参数传递 实参与形参 - 存储单元(左值) - 存储内容(右值) 根据所传递的实参的“内容”,参数传递可分为: - 传值调用:传递实参的右值到形参单元; - 引用调用:传递实参的左值到形参单元; - 值-结果调用:传递实参的右值;在控制返回时将右值写回到实参相应左值单元(如果有的话); - 换名调用:传递实参的“正文”。 * 《编译原理与技术》-运行环境 * e.g.8 参数传递 procedure swap( a , b ) a, b : int; temp : int; begin temp := a ; a := b; b := temp; end. 讨论下面程序在不同参数传递方式下输出: 1) x := 10 ; y := 20; swap( x,y ); print ( x, y )
原创力文档

文档评论(0)