编译第7章运行时环境.ppt

上传人:zhu****ei 文档编号:3529965 上传时间:2019-12-17 格式:PPT 页数:35 大小:476KB
返回 下载 相关 举报
编译第7章运行时环境.ppt_第1页
第1页 / 共35页
编译第7章运行时环境.ppt_第2页
第2页 / 共35页
编译第7章运行时环境.ppt_第3页
第3页 / 共35页
点击查看更多>>
资源描述
第7章运行时环境,学习目标:掌握参数传递的机制理解完全静态运行时环境,基于栈的运行时环境和完全动态运行时环境的主要思想,目标代码,源程序,词法分析,语法分析,语义分析,中间代码优化,代码生成,目标代码优化,记号Tokens,语法树,注释树,中间代码,目标代码,词法分析,语法分析和静态语义分析是编译器中实现源语言静态分析的编译程序各阶段,这些分析仅取决于源语言的特性代码生成的任务依赖于具体的目标机器。然而同样地代码生成的一般特征在体系结构上仍保留了很大的变化,例如运行时环境,运行时环境指的是目标计算机的寄存器以及存储器的结构,用来管理存储器并保存指导执行过程所需的信息。寄存器和存储器分配是在运行阶段进行的编译阶段设计运行时环境只能间接地维护环境在程序执行期间它必须生成代码进行必要的维护操作,三种运行时环境完全静态环境基于栈的环境完全动态环境,7.1程序运行时的存储器组织7.2三种运行时环境7.3参数传递机制,7.1程序运行时的存储器组织,典型的计算机存储器可分为:寄存器区域较慢的直接编址的随机访问存储器(RAM),RAM区域还可以再分为代码区和数据区代码区代码区在执行之前是固定的,在编译时所有代码的地址都是可计算的,数据区运行阶段,代码访问的数据分配的存储区域全局/静态区栈区堆区,数据区的分类全局/静态区在执行之前,将数据固定在存储器中,包括了程序的全局和静态数据这些数据通常都在一个固定区域内并以类似的风格单独分配给代码,栈区栈区域用于其分配发生在后进先出LIFO风格中的数据堆区堆区域用于不符合LIFO协议的动态分配例如指针的分配与回收:C+的new和delete,C的malloc和free,一般的运行时存储器组织,栈和堆占有相同的区域箭头表示栈和堆的生长方向,7.2三类运行时环境,完全静态运行时环境所有的数据是静态的,且执行程序期间在存储器中保持固定适用的语言有以下特点:不允许指针或动态分配不允许递归调用过程典型的例子是FORTRAN77,例如:FORTRAN程序ProgramCNSUME/主程序段CharacterfunctionPRDUCE()/子程序段,基于栈的运行时环境当进行一个新的过程调用时,每个新的活动记录部分都分配在栈顶,当调用退出时则再次解除分配标准命令式语言(如C,Pascal)中常见的运行时环境格式,这种语言:允许递归调用每一个调用都重新分配局部变量,Programmain;全局变量定义;ProcedureR;End(R);ProcedureQ;End(Q);主程序执行体End.(main),若主程序调用Q,Q递归调用自己,在Q第二次进入运行后的存储结构为:,完全动态运行时环境完全动态运行时环境数据空间在执行时可以任意次地分配与回收。活动数据仅在对它们所有的引用都消失了才再重新分配完全动态运行时环境比基于栈的运行环境要复杂许多,因为它包含了要在执行时跟踪引用,以及在执行时任意次地找寻和重新分配存储器的不可访问区域(这种处理称为垃圾回收),堆管理和完全动态运行时环境堆管理使用分配操作和释放操作处理指针分配和重新分配,这是管理堆的手工方法,因为程序员必须编写出分配和释放存储器的明确的调用在一种需要完全动态的运行时环境的语言中,堆必须自动管理,7.3参数传递机制,过程活动记录过程或函数调用时的内存分配活动记录必须包含下面的部分,参数传递在过程调用中,参数是如何通过调用程序在跳到被调用过程的代码之前与活动记录中的位置相对应的参数的值是如何由过程代码解释依赖于源程序采用的特定参数传递机制,参数传递机制值传递(值调用)引用传递(引用调用)值结果传递(复制进-复制出)名字传递(延迟赋值),1传值,参数参数是表达式参数传递参数在调用时计算,它们的值存储在活动记录中参数对应的位置在被调用程序执行时,代码将直接访问这些最终值,结果值参数被看作是初始化的局部变量,对它的改变不会影响任何非局部变量的变化,例如/过程定义procedureSWAP(n,m:real);varj:real;beginj:=n;n:=m;m:=jend;/主程序inti;intk10;i:=5;ki:=6;SWAP(i,ki);,参数传递(add_i表示i的地址),执行了过程语句后“j:=n;n:=m;m:=j”,结果:i=5,k5=6非局部变量没有变化,2引用传递,参数参数必须与分配的地址一起变化参数传递引用传递传递的是变量的地址(存储在局部活动记录中)在调用过程中,编译程序必须将对引用参数的局部访问转为间接访问,因为局部“值”实际上是环境中的别处的地址,结果参数变成了自变量的别名(不要求复制被传递的值),在参数上发生的任何变化都会出现在自变量上,例如/过程定义procedureSWAP(n,m:real);varj:real;beginj:=n;n:=m;m:=jend;/主程序inti;intk10;i:=5;ki:=6;SWAP(i,ki);,参数传递(add_i表示i的地址),过程代码执行后“j:=n;n:=m;m:=j”,结果:i=6,k5=5,参数发生改变,3值结果传递,除了未建立真正的别名之外,这个机制得到的结果与引用传递相似参数传递在过程中复制和使用自变量的值,然后当过程退出时,再将参数的最终值复制回自变量的地址这个方法也称为复制进,复制出(或复制存储),例如/过程定义procedureSWAP(n,m:real);varj:real;beginj:=n;n:=m;m:=jend;/主程序inti;intk10;i:=5;ki:=6;SWAP(i,ki);,参数传递(add_i表示i的地址),过程代码执行后“j:=n;n:=m;m:=j”,结果:i=6,k5=5,参数发生改变,4名字传递,又称为延迟赋值名字传递的思想是直到被调用的程序真正使用了自变量之后才对这个自变量赋值参数传递在调用点上的自变量的文本被看作是它自己右边的函数,每当在被调用过程的代码中到达相应的参数名时,就要计算它,传名主程序的SWAP(i,ki)被替换为,j=i=5i=k5=6k6=j=5,结果是i=6,k6=5且k5没有改变,j:=i;i:=ki;ki:=j;,例如procedureSWAP(n,m:real);varj:real;beginj:=n;n:=m;m:=jend;,/主程序i:=5;ki:=6;SWAP(i,ki);,解释名字传递被看作是把被调用段的过程体抄到调用出现的位置,但把其中自变量名换成相应的参数名。,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!