编译 第7章 运行时环境[精选].ppt

  1. 1、本文档共35页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第 7 章 运行时环境 学习目标: 掌握 参数传递的机制 理解 完全静态运行时环境,基于栈的运行时环境和完全动态运行时环境的主要思想 词法分析, 语法分析和静态语义分析 是编译器中实现源语言静态分析的编译程序各阶段,这些分析仅取决于源语言的特性 代码生成 的任务依赖于具体的目标机器。 然而同样地代码生成的一般特征在体系结构上仍保留了很大的变化, 例如 运行时环境 运行时环境 指的是目标计算机的寄存器以及存储器的结构,用来管理存储器并保存指导执行过程所需的信息。 寄存器和存储器分配是在运行阶段进行的 编译阶段设计运行时环境只能间接地维护环境 在程序执行期间它必须生成代码进行必要的维护操作 三种运行时环境 完全静态环境 基于栈的环境 完全动态环境 7.1 程序运行时的存储器组织 7.2 三种运行时环境 7.3 参数传递机制 7.1 程序运行时的存储器组织 典型的计算机存储器可分为: 寄存器区域 较慢的直接编址的随机访问存储器 (RAM) RAM 区域还可以再分为代码区和数据区 代码区 代码区在执行之前是固定的,在编译时所有代码的地址都是可计算的 数据区 运行阶段,代码访问的数据分配的存储区域 全局/静态区 栈区 堆区 数据区的分类 全局/静态区 在执行之前,将数据固定在存储器中,包括了程序的全局和静态数据 这些数据通常都在一个固定区域内并以类似的风格单独分配给代码 栈区 栈区域用于其分配发生在后进先出LIFO风格中的数据 堆区 堆区域用于不符合LIFO协议的动态分配 例如指针的分配与回收: C++的new 和 delete ,C的 malloc 和 free 一般的运行时存储器组织 7.2 三类运行时环境 完全静态运行时环境 所有的数据是静态的,且执行程序期间在存储器中保持固定 适用的语言有以下特点: 不允许指针或动态分配 不允许递归调用过程 典型的例子是FORTRAN77 基于栈的运行时环境 当进行一个新的过程调用时,每个新的活动记录部分都分配在栈顶,当调用退出时则再次解除分配 标准命令式语言(如C,Pascal)中常见的运行时环境格式,这种语言: 允许递归调用 每一个调用都重新分配局部变量 完全动态运行时环境 完全动态运行时环境 数据空间在执行时可以任意次地分配与回收。 活动数据仅在对它们所有的引用都消失了才再重新分配 完全动态运行时环境比基于栈的运行环境要复杂许多,因为它包含了要在执行时跟踪引用,以及在执行时任意次地找寻和重新分配存储器的不可访问区域(这种处理称为垃圾回收) 堆管理和完全动态运行时环境 堆管理使用 分配操作和释放操作处理指针分配和重新分配, 这是管理堆的手工方法,因为程序员必须编写出分配和释放存储器的明确的调用 在一种需要完全动态的运行时环境的语言中,堆必须自动管理 7.3 参数传递机制 过程活动记录 过程或函数调用时的内存分配 活动记录必须包含下面的部分 参数传递 在过程调用中,参数是如何通过调用程序在跳到被调用过程的代码之前与活动记录中的位置相对应的 参数的值是如何由过程代码解释依赖于源程序采用的特定 参数传递机制 参数传递机制 值传递 (值调用) 引用传递 (引用调用) 值结果传递 (复制进-复制出) 名字传递 (延迟赋值) 1 传值 参数 参数是表达式 参数传递 参数在调用时计算,它们的值存储在活动记录中参数对应的位置 在被调用程序执行时,代码将直接访问这些最终值 结果 值参数被看作是初始化的局部变量,对它的改变不会影响任何非局部变量的变化 2 引用传递 参数 参数必须与分配的地址一起变化 参数传递 引用传递传递的是变量的地址(存储在局部活动记录中) 在调用过程中,编译程序必须将对引用参数的局部访问转为间接访问,因为局部“值”实际上是环境中的别处的地址 结果 参数变成了自变量的别名 (不要求复制被传递的值), 在参数上发生的任何变化都会出现在自变量上 3 值结果传递 除了未建立真正的别名之外,这个机制得到的结果与引用传递相似 参数传递 在过程中复制和使用自变量的值, 然后当过程退出时,再将参数的最终值复制回自变量的地址 这个方法也称为 复制进,复制出 (或 复制存储) 4 名字传递 又称为 延迟赋值 名字传递的思想是直到被调用的程序真正使用了自变量之后才对这个自变量赋值 参数传递 在调用点上的自变量的文本被看作是它自己右边的函数,每当在被调用过程的代码中到达相应的参数名时,就要计算它 解释 名字传递被看作是把被调用段的过程体抄到调用出现的位置,但把其中自变量名换成相应的参数名。 例如 //过程定义 procedure SWAP(n, m: real); var j: real; begin j:=n; n:=m; m:=

文档评论(0)

dart003 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档