- 1、本文档共43页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第七章 运行环境 标识符与数据目标的关系 变量名 ── 数据存储单元地址 过程名、函数名 ── 程序段地址 相关问题 变量和过程的作用域 过程调用的实现方法 7.1 绑定的完成 何时进行空间分配: 全局变量:程序装入时 局部变量:进入过程或分程序时 变量名的绑定 静态绑定:编译时指定(相对地址) 如:多数变量名 动态绑定:运行时指定 如:C++ 的引用变量 过程和函数的绑定 为过程指定程序代码段地址 静态绑定 编译时指定相对地址 如:多数各种函数、子例程 动态绑定 运行时指定 如:虚函数(C++)、Java 变量的静态绑定 词法分析 在符号表建立变量的表项 说明语句的语义分析 通过类型计算空间需求 填写变量的地址(供引用) 过程的静态绑定 词法分析 在符号表建立过程的表项 过程体的语义分析 统计目标代码长度 填写过程的地址(供引用) 7.2 存储组织 目标程序数据空间的典型分配 静态存储分配 特点 编译时刻确定存储位置 访问效率高 主要用途 子程序的目标代码段 全局数据目标(全局变量) 栈式存储分配 用途 过程的局部环境 (活动记录) 特点 嵌套调用次序 先进后出 生存期限于本次调用 自动释放 过程调用的活动记录 相关的语义处理 过程说明的翻译 计算实在参数、返回值的空间 过程体的翻译 计算局部变量、临时变量的空间 堆式存储分配 用于动态数据结构 存储空间的动态分配和释放 实现方法: 将内存空间分为若干块,根据用户要求分配 无法满足时,调用无用单元收集程序将被释放的块收集起来重新分配 7.3 说明语句的翻译 高级语言中的说明语句 变量的数据类型、作用域 过程和函数的原型、作用域 常数的标识、记录的结构 类型 内部类型(built-in) 用户定义类型 类型的作用 引入数据抽象、隐蔽数据的基本表示 从二进制位串抽象为整数、实数、记录等 形成不同的程序设计风格 规定可用的运算 类型检查(强类型、弱类型) 数据精度控制 规定存储单元尺寸,优化空间管理 变量说明的翻译 在符号表中填写变量的属性 类型、相对地址、作用域等 相对地址 全局变量表示为静态数据区的偏移值 局部变量表示为局部数据域(活动记录的部分)的偏移值 例 7-1:存储布局 real x[ 8 ]; integer i, j; 名字 相对地址 x 0 i 64 j 68 设计翻译方案 类型描述符 T 的属性 type 类型 width 占用的字节数 语义过程 insert:设置变量的类型和地址 array:计算数组类型 全局量 off:已分配空间尺寸(字节数) 说明语句的翻译模式 P → { off := 0 } D D → D ; D D → id : T { insert( id.entry, T.type, off ); off := off + T.width } T → integer { T.type := integer; T.width := 4 } T → real { T.type := real; T.width := 8 } T → array[ num ] of T1 { T.type := array( num.val, T1.type ); T.width := num.val * T1.width } T → ^T1 { T.type := pointer( T1.type ); T.width := 4 } 例 7-2:x:real; i:integer 的翻译 insert(x,real,0) insert(i,integer,8) 7.4 组合数据类型的翻译 同质数据结构 多维数组、枚举 异质数据结构 记录、结构、联合 抽象数据类型 类、模块 功能与实现 操作 元素的引用、维护;结构的引用、维护 描述 说明方法、引用方法 实现的分类 静态:语句的翻译 动态:过程调用、内存管理 数组说明的翻译 空间分配 首地址、空间尺寸 表格管理 维数、下标上界、下标下界 存放方式 按行存放、按列存放 数组元素的引用 数组元素的翻译 完成上下界检查 生成代码完成参照相对地址的计算 目标 x := y[i] 和 x[i] := y i 是相对地址,不是数组下标 记录说明的翻译 空间分配 设置首地址、各元素的相对地址 大于所需的空间 (对齐) 例: struct Node { float x, y;
文档评论(0)