编译第7章运行时环境.ppt_第1页
编译第7章运行时环境.ppt_第2页
编译第7章运行时环境.ppt_第3页
编译第7章运行时环境.ppt_第4页
编译第7章运行时环境.ppt_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论