非局部数据的访问(无嵌套过程) 没有歆套过程时的数据访问 C语言中,每个函数能够访问的变量 函数的局部变量:相对地址已知,且存放在当前活 动记录内, top sp指针加上相对地址即可访问 全局变量:在静态区,地址在编译时刻可知 很容易将C语言的函数作为参数进行传递 参数中只需包括函数代码的开始地址。 在函数中访冋非局部变量的模式很简单,不需要考 虑过程是如何激活的
非局部数据的访问(无嵌套过程) • 没有嵌套过程时的数据访问 – C语言中,每个函数能够访问的变量 • 函数的局部变量:相对地址已知,且存放在当前活 动记录内,top_sp指针加上相对地址即可访问 • 全局变量:在静态区,地址在编译时刻可知 – 很容易将C语言的函数作为参数进行传递 • 参数中只需包括函数代码的开始地址。 • 在函数中访问非局部变量的模式很简单,不需要考 虑过程是如何激活的
非局部数据的访问(嵌套声明过程) · PASCAL中,如果过程A的声明中包含了过程B的声 归,那么B可以使用在A中声明的变量。 ·当B的代码运行时,如果它使用的是A中的变量。那 么这个变量指向运行栈中最上层的同名变量 但是,我们不能通过嵌套层次直接得到A的活动记 录的相对位置。必须通过访问链访同 void AO 当A调用C.C又调用B时 X,y, A的活动记录 void BO C的活动记录 t b x=b+y B的活动记录 当A直接调用B时 void COBo: 1 A的活动记录 CO B0: B的活动记录
非局部数据的访问(嵌套声明过程) • PASCAL中,如果过程A的声明中包含了过程B的声 明,那么B可以使用在A中声明的变量。 • 当B的代码运行时,如果它使用的是A中的变量。那 么这个变量指向运行栈中最上层的同名变量。 • 但是,我们不能通过嵌套层次直接得到A的活动记 录的相对位置。必须通过访问链访问 void A() { int x,y; void B() { int b; x = b+y; } void C(){B();} C(); B(); } A的活动记录 C的活动记录 B的活动记录 当A调用C,C又调用B时: 当A直接调用B时: A的活动记录 B的活动记录
嵌套深度 ·嵌套深度是正文概念,可以根据源程序静态地确定 不内嵌于任何其他过程中的过程。嵌套深度为1 嵌套在深度为的过程中的过程,深度为i+1. 深度为1 1)fun sort(inputFile, outputFile) let sort val a =array (11,0); 深度为2 23456 fun readArray( inputFile)=……; readArray, exchange fun exchange(i, J) quicksort 7) fun quicksort(m, n) 深度为3 let partition Va1W=…; 9) fu tion(y, z) 11 V…… partition.. quicksort readArray… quicks
嵌套深度 • 嵌套深度是正文概念,可以根据源程序静态地确定 – 不内嵌于任何其他过程中的过程,嵌套深度为1 – 嵌套在深度为i的过程中的过程,深度为i+1. 深度为1 sort 深度为2 readArray,exchange, quicksort 深度为3 partition