《编译原理与技术》课件-第7章.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《《编译原理与技术》课件-第7章.ppt》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译原理与技术 编译 原理 技术 课件
- 资源描述:
-
1、编译原理与技术编译原理与技术第第7章章 运行时环境运行时环境 编译原理与技术编译原理与技术2主要内容主要内容u程序运行的基本概念程序运行的基本概念 u参数传递机制参数传递机制 u静态运行时环境静态运行时环境u运行时存储空间的组织和管理运行时存储空间的组织和管理 u栈式运行时环境栈式运行时环境u堆式运行时环境堆式运行时环境 编译原理与技术编译原理与技术37.1 程序运行的基本概念程序运行的基本概念 u过程及其活动过程及其活动过程定义是把一个名字和若干语句联系起来过程定义是把一个名字和若干语句联系起来的一个声明。的一个声明。这个名字是过程名,而这些语句就是过程体。这个名字是过程名,而这些语句就是过
2、程体。返回值的过程通常称为函数,完整的程序也返回值的过程通常称为函数,完整的程序也可以看作一个过程。可以看作一个过程。在面向对象技术中,过程叫做方法或操作。在面向对象技术中,过程叫做方法或操作。本章把过程、函数、方法这样的程序单元统本章把过程、函数、方法这样的程序单元统称为过程。称为过程。编译原理与技术编译原理与技术47.1 程序运行的基本概念程序运行的基本概念u过程及其活动过程及其活动当过程名出现在程序中作为一个语句或表达当过程名出现在程序中作为一个语句或表达式使用时,就称这个过程在程序点被调用。式使用时,就称这个过程在程序点被调用。过程调用就是执行被调用过程的过程体。过程调用就是执行被调用
3、过程的过程体。出现在过程定义中的参数叫做形式参数(形出现在过程定义中的参数叫做形式参数(形参),在过程调用点取代形参的称为实在参参),在过程调用点取代形参的称为实在参数(实参)。数(实参)。编译原理与技术编译原理与技术57.1 程序运行的基本概念程序运行的基本概念program sort(input,output)var a:array 0.10 of integer;procedure readarray;var i:integer;begin for i:=1 to 9 do read(ai)end;function partition(y,z:integer):integervar i,
4、j,x,y:integer;begin.end;procrdure quicksort(m,n:integer);var i:integer;beginif(n m)then begin i=partition(m,n);quicksort(m,i 1);quicksort(i+1,n);end;end;begin a0:=9999;a10:=9999;readarray;quicksort(1,9);end;编译原理与技术编译原理与技术67.1 程序运行的基本概念程序运行的基本概念u过程的活动过程的活动过程的每次调用就引起过程体的一次执行,过程的每次调用就引起过程体的一次执行,称为过程的一次
5、活动。称为过程的一次活动。过程过程p的一个活动的生存期就是从过程体开始的一个活动的生存期就是从过程体开始执行到执行结束的时间,包括执行被执行到执行结束的时间,包括执行被P调用其调用其它所有过程所耗费的时间。它所有过程所耗费的时间。一般而言,术语一般而言,术语“生存期生存期”指的是程序执行指的是程序执行过程中若干步骤的一个连续序列。过程中若干步骤的一个连续序列。编译原理与技术编译原理与技术77.1 程序运行的基本概念程序运行的基本概念u过程的活动过程的活动任何两个过程的活动任何两个过程的活动p和和q只能存在下列关系:只能存在下列关系:l不重叠或者嵌套。过程的活动不重叠或者嵌套。过程的活动p和和q
6、不重叠,指的是它们的不重叠,指的是它们的执行时间(生存期)没有重叠;执行时间(生存期)没有重叠;l活动活动p嵌套在活动嵌套在活动q,指的是活动,指的是活动q的生存期包括了活动的生存期包括了活动p的的生存期。生存期。两个过程活动两个过程活动p和和q的关系表明,若程序的执行控制的关系表明,若程序的执行控制在退出在退出q之前进入了之前进入了p,则必须在退出,则必须在退出q之前退出之前退出p。如果同一个过程的两个不同活动如果同一个过程的两个不同活动p和和q重叠,即在该重叠,即在该过程的活动过程的活动p没有退出之前又重新另外一个活动没有退出之前又重新另外一个活动q,这样的过程称为递归过程。这样的过程称为
7、递归过程。同一个过程的不同调用产生不同的活动。同一个过程的不同调用产生不同的活动。编译原理与技术编译原理与技术87.1 程序运行的基本概念程序运行的基本概念u 活动记录活动记录过程的一次执行要用一块连续的存储区来管理过程的一次执行要用一块连续的存储区来管理需要的信息,这块存储区叫做活动记录或帧。需要的信息,这块存储区叫做活动记录或帧。返回值返回值实在参数实在参数(可选)控制链(可选)控制链(可选)访问链(可选)访问链机器状态机器状态局部数据局部数据临时数据临时数据返回值域:用于存放被调用过程返回给调用过程的值,根据不同的返回值域:用于存放被调用过程返回给调用过程的值,根据不同的参数传递机制,返
8、回值可以是数值或指向返回值地址的指针。参数传递机制,返回值可以是数值或指向返回值地址的指针。实参域:用于存放调用过程提供的实在参数,根据不同的形参和实参的传实参域:用于存放调用过程提供的实在参数,根据不同的形参和实参的传递机制,实参域可以是数值或指向实参地址的指针。递机制,实参域可以是数值或指向实参地址的指针。控制链域:指向调用者活动记录的指针,也称为动态链。控制链域:指向调用者活动记录的指针,也称为动态链。访问链域:对于像访问链域:对于像Pascal这样的语言,需要访问链来访问非局部数据;对这样的语言,需要访问链来访问非局部数据;对于于FROTRAN和和C则不需要,访问链又称静态链。则不需要
9、,访问链又称静态链。机器状态域:保存该过程调用前的机器状态信息,包括程序计数器(机器状态域:保存该过程调用前的机器状态信息,包括程序计数器(pc)的)的值以及控制从该过程返回时必须恢复的机器寄存器的值。值以及控制从该过程返回时必须恢复的机器寄存器的值。局部数据:存储用于该过程执行时的数据。局部数据:存储用于该过程执行时的数据。临时数据:保存该过程执行时临时的数据,如表达式的中间结果。临时数据:保存该过程执行时临时的数据,如表达式的中间结果。编译原理与技术编译原理与技术97.1 程序运行的基本概念程序运行的基本概念u调用序列和返回序列调用序列和返回序列调用序列,操作如调用序列,操作如 l活动记录
10、分配存储空间;活动记录分配存储空间;l计算并存储参数值;计算并存储参数值;l为调用分配并存储影响调用的存储器。为调用分配并存储影响调用的存储器。返回序列,操作如返回序列,操作如l把返回值放到调用者可以访问到的位置;把返回值放到调用者可以访问到的位置;l恢复机器状态;恢复机器状态;l调整寄存器;调整寄存器;l释放活动记录的存储。释放活动记录的存储。编译原理与技术编译原理与技术107.1 程序运行的基本概念程序运行的基本概念u活动树活动树 1.每个结点代表过程的一个活动记录(调用);每个结点代表过程的一个活动记录(调用);2.根结点代表主程序;根结点代表主程序;3.结点结点p是结点是结点q的父结点
11、,当且仅当控制流的父结点,当且仅当控制流从从p的活动进入的活动进入q的活动;的活动;4.在同一层中,结点在同一层中,结点p在结点在结点q的左边,当且的左边,当且仅当仅当p的生存期先于的生存期先于q的生存期。的生存期。编译原理与技术编译原理与技术117.1 程序运行的基本概念程序运行的基本概念例例7.1 假如执行图7.1的程序,我们可以构造出程序执行期间的所有过程的活动记录,表示整个程序运行的踪迹,如图7.3所示。树根是主程序sort的活动记录,它首先调用了readarray和quisksort(1,9),按照程序的执行顺序,readarray在quisksort(1,9)之前,即readarr
12、ay的生存期先于在quisksort(1,9),所以,结点ra在qs(1,9)的左边。qs(1,9)又调用了一次partition和两次quisksort,图中显示的结点分别是pt(1,9),qs(1,3)和qs(5,9)。注意,qs(1,3)和qs(5,9)都是递归调用,它们在quisksort(1,9)结束之前结束。sortraqs(1,9)qs(1,3)pt(1,9)qs(5,9)qs(1,0)pt(1,3)qs(2,3)qs(5,5)pt(5,9)qs(7,9)qs(7,7)pt(7,9)qs(9,9)qs(2,1)pt(2,3)qs(3,3)编译原理与技术编译原理与技术127.1 程
13、序运行的基本概念程序运行的基本概念u名字的绑定和环境名字的绑定和环境 按照程序设计语言的语义,环境表示把一个名字映射到一个存按照程序设计语言的语义,环境表示把一个名字映射到一个存储位置的函数,状态表示把存储单元映射到所保存的值的函数储位置的函数,状态表示把存储单元映射到所保存的值的函数环境把名字映射到左值,状态把左值映射到右值。环境把名字映射到左值,状态把左值映射到右值。环境和状态是有区别的:赋值改变状态,但不改变环境。例如,环境和状态是有区别的:赋值改变状态,但不改变环境。例如,和假设存储单元和假设存储单元100关联的变量关联的变量pi记录的值是记录的值是0。在赋值语句。在赋值语句pi:=3
14、.14之后,同样是关联之后,同样是关联pi的存储单元的值就变成了的存储单元的值就变成了3.14。如果环境把名字如果环境把名字x映射到存储单元映射到存储单元s,就说,就说x被绑定到被绑定到s。术语存。术语存储单元是象征性的,因为如果储单元是象征性的,因为如果x不是一个基本类型,那么不是一个基本类型,那么x的存的存储单元储单元s可能是一组存储单元。可能是一组存储单元。编译原理与技术编译原理与技术137.2 参数传递机制参数传递机制u按值调用按值调用实参在调用时刻计算得到的表达式,其值就是过程执实参在调用时刻计算得到的表达式,其值就是过程执行时形参的值。可以如下实现:行时形参的值。可以如下实现:(1
15、)把形参当作所在过程的局部变量名看待,形参的存储单)把形参当作所在过程的局部变量名看待,形参的存储单元在该过程的活动记录中;元在该过程的活动记录中;(2)调用过程计算实参,并把值放入形参的存储单元中。)调用过程计算实参,并把值放入形参的存储单元中。它的最简单形式可以解释成值参数在过程的执行中作它的最简单形式可以解释成值参数在过程的执行中作为常数值,取代了过程体中所对应的形式参数。为常数值,取代了过程体中所对应的形式参数。C语语言和言和Java语言使用按值调用,它们也是语言使用按值调用,它们也是Pascal和和Ada的缺省参数传递方法。的缺省参数传递方法。编译原理与技术编译原理与技术147.2
16、参数传递机制参数传递机制u按值调用按值调用把形参当作所在过程的局部变把形参当作所在过程的局部变量名看待,形参的存储单元在量名看待,形参的存储单元在该过程的活动记录中;该过程的活动记录中;调用过程计算实参,并把值放入调用过程计算实参,并把值放入形参的存储单元中。形参的存储单元中。被调用过程的活动记录.形参1 形参2.调用序列在调用点计算实参1的值计算实参2的值把值分别送入形参图7.5 按值调用示意图按值调用的显著特征是,按值调用的显著特征是,对形参的任何运算都不会影响调用者的实参的值。对形参的任何运算都不会影响调用者的实参的值。编译原理与技术编译原理与技术157.2 参数传递机制参数传递机制u按
17、值调用按值调用下列程序下列程序inc1不会达到它期望的效果:不会达到它期望的效果:void inc1(int x)/*不正确的程序不正确的程序*/+x;return x;在在C语言中,需要传递地址来实现上述预想的效果:语言中,需要传递地址来实现上述预想的效果:void inc1(int*x)/*正确的程序正确的程序*/+(*x);return*x;当然,希望对变量当然,希望对变量y增值时,这个函数的调用形式为增值时,这个函数的调用形式为inc1(&y),因为函数需要的是,因为函数需要的是y的地址而不是值。的地址而不是值。编译原理与技术编译原理与技术167.2 参数传递机制参数传递机制u引用调用
18、(传地址调用)引用调用(传地址调用)(1)1.如果实参是变量或具有左值的如果实参是变量或具有左值的表达式,则把该左值放入形参表达式,则把该左值放入形参的存储单元;的存储单元;2.如果实参是如果实参是3或或3a这样没有左这样没有左值的表达式,则首先把它的计算值存入到一个新的存储单元,值的表达式,则首先把它的计算值存入到一个新的存储单元,然后把这个地址传递给形参。然后把这个地址传递给形参。(2)在被调用过程的目标代码中,对形参的任何引用都是通)在被调用过程的目标代码中,对形参的任何引用都是通过形参存储的地址间接引用实参的。过形参存储的地址间接引用实参的。被调用过程的活动记录.形参1 形参2.调用序
19、列在调用点实参1的地址计算实参2的值并存入临时变量t把t的地址图7.6 引用调用示意图引用调用的显著特征是,对形参的任何运算都直接影响调用者的实参引用调用的显著特征是,对形参的任何运算都直接影响调用者的实参 编译原理与技术编译原理与技术177.2 参数传递机制参数传递机制u引用调用(传地址调用)引用调用(传地址调用)在在Pascal中,引用调用是通过在过程声明中使用关键字中,引用调用是通过在过程声明中使用关键字“var”实现的;实现的;C和和C+在过程声明中使用地址符号在过程声明中使用地址符号“&”实现参数的引用调实现参数的引用调用,例如:用,例如:void inc1(int&x)/*正确的程
20、序正确的程序*/+x;return x;这个函数可以直接调用,不必使用地址操作符:这个函数可以直接调用,不必使用地址操作符:inc1(y)就可就可以使变量以使变量y的值增加。的值增加。编译原理与技术编译原理与技术187.2 参数传递机制参数传递机制u值结果调用值结果调用(复写恢复复写恢复,复写入复写复写入复写)(1)调用过程把实参的值和实参的地址同时传给被调用过程;)调用过程把实参的值和实参的地址同时传给被调用过程;(2)被调用过程像按值调用那样使用传递给形参的值;)被调用过程像按值调用那样使用传递给形参的值;(3)把形参在被调用过程中最后的值拷贝到实参的存储单元内。)把形参在被调用过程中最后
21、的值拷贝到实参的存储单元内。被调用过程的活动记录.形参1 实参1的地址形参2调用序列在调用点计算实参1的值实参1的地址图7.7 值结果调用示意图 实参2的地址.计算实参2的值实参2的地址下列(按照C的语法格式)代码:void p(int x,int y)+x;+y;main()int a=1;p(a,a);return a;如果参数传递使用引用调用的方式,在调用p之后a的值是3;如果使用值结果调用的方式,a的值则是2。编译原理与技术编译原理与技术197.2 参数传递机制参数传递机制u换名调用换名调用实参直到在被调用的过程中作为形参实际使实参直到在被调用的过程中作为形参实际使用的时候才计算,所以
22、也叫延迟计算。用的时候才计算,所以也叫延迟计算。换名调用可以如下实现:换名调用可以如下实现:(1)在调用点,用被调用过程的体来替换调用者)在调用点,用被调用过程的体来替换调用者的调用,但是形参用对应的实参来替换。这种文的调用,但是形参用对应的实参来替换。这种文字替换方式成为宏展开或内联展开。字替换方式成为宏展开或内联展开。(2)在宏展开前,被调用过程的每个局部变量名)在宏展开前,被调用过程的每个局部变量名字被系统地重新命名可以区别的名字。字被系统地重新命名可以区别的名字。编译原理与技术编译原理与技术207.2 参数传递机制参数传递机制例如,例如,对于代码void p(int x)+x;如果出现
23、了p(ai)这样的调用,其效果就是+(ai)。所以,如果i在过程p内的变量x之前改变了值,结果将既不同于引用调用,也不同于值结果调用。编译原理与技术编译原理与技术217.2 参数传递机制参数传递机制例例7.2 考虑下列(C语法格式的)代码:int i;int a10;void p(int x)+i;+x;main()i=1;a1=1;a2=5;p(ai);采用按值调用的参数传递机制,调用过程p:尽管在过程p中改变了i的值为2,但a2的值不变;a1的值仍然为1。采用按值调用的参数传递机制,调用过程p不改变a1和a2的值。采用引用调用和值结果的参数传递机制,调用过程p的结果一样,都是把a1的值改变
24、为2,而没改变a2的值。(但是,如果采用值结果参数传递机制的另外一种实现,在复写出形参值的时候重新计算对应实参的地址,那么,调用过程p的结果把a2设置为2,保持a1的值不变。)采用换名参数传递机制,调用过程p的结果是把a2设置为6并保持a1的值不变。编译原理与技术编译原理与技术227.2 参数传递机制参数传递机制例例7.2 考虑下列(C语法格式的)代码:int i;int a10;void p(int x)+i;+x;main()i=1;a1=1;a2=5;p(ai);在这个程序中,由于i对于 p是非局部变量,无论哪种参数传递方式都在p中改变了值为2。但是,其它变量的结果随着参数传递机制的不同
25、而有差异。采用按值调用的参数传递机制,调用过程p:尽管在过程p中改变了i的值为2,但a2的值不变;语句+x的效果相当于+(a1),调用没有把改变的值送回a1,即a1的值仍然为1。采用引用调用的参数传递机制,调用过程p时把参数a1的地址传递给p的活动记录中对应的形式单元x,执行p的结果是a1 值增加1,为2。采用值结果的参数传递机制,调用过程p:把a1的值(此时为1)传给p的活动记录中对应的形式单元x,再把a1的地址传给对应x的作为地址的形式单元addr;执行p的语句之后,x的值增加1为2,它作为x的最终值通过addr送入a1内,而a2的值保持不变。采用换名的参数传递机制,调用过程p把语句+x替
展开阅读全文