编译原理第8章
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2
在程序的执行过程中,程序中数据的存取是通过对 应的存贮单元进行的。
在早期的计算机上,这个存贮管理工作是由程 序员自己来完成的。在程序执行以前,首先要将用机 器语言或汇编语言编写的程序输送到内存的某个指定 区域中,并预先给变量和数据分配相应的内存地址。
在有了高级语言之后,程序员不必直接和内存 地址打交道,程序中使用的存贮单元都由逻辑变量(标 识符)来表示,他们对应的内存地址都是由编译程序在 编译时或由其生成的目标程序运行时进行分配。程序 执行时,源程序中同样的名字可以指示目标机器中不 同的数据对象,本章即考察名字与数据对象的对应关 系。所以,对编译程序来说,存贮的组织及管理是一 个复杂而又十分重要的问题。 编译程序根据如何组织运行环境而生成目标代码。
• 简单变量: (以字节为单位)
– char:1,可以分配在任何地址。 – integer,short:2,对齐到2(即从能被2或4整除的
地址开始分配) – long : 4,对齐到4 – float: 4至16,对齐到相应字节数 – double(双精度型):8,对齐到8 – booleans: 1位,但常设为1个字节 • 指针:unsigned integers • 一维数组:一块连续的存储区 • 多维数组:一块连续的存储区,按行存放 • 结构(记录):把所有域(field)存放在一块存储区 • 对象:类的实例变量象结构的域一样存放在一块连续 的存储区,但方法(成员函数)不存在该对象里
即使在一个程序中每一个名字只被说明一次,同一个名 字在运行时刻仍可能代表不同的数据目标。 一个名字的说明是静态的概念,名字的联编是名字的说 明的动态副本。
7
•引进两个函数,environment(环境) state (状态) – environment把名字映射到一个存储单元上(Lvalue左-值)。 – state把存储单元映射到那里所存放的值上,即把 一个L-value(左-值)映射为一个 R-value(右-值)。如 下图所示。
environmen t
state
名字
存储单元
值
L-value
R-value
存储分配
程序运行
从名字到值的两个阶段映射
8
例如: PROGRAM swap; VAR x,y,t:real; BEGIN read(x,y); t:=x;x:=y;y:=t; END.
环境是:{(x,Mx),(y,My),(t,Mt)} Mx,My,Mz是x,y,z分配的存储地址。
3
本章内容
•序
•源语言中的一些问题
•存储组织—如何组织不同作用域变量的存储
•运行时刻存储分配策略—编译程序对目标程 序运行时的组织(设计运行环境和分配存储)
•非局部名字的访问
•参数传递
•符号表
4
序
源 计算环境 映射运行时的环境
程 序
计算
目标代码
源程序中的名字(常量,变量)目标 机存储空间。它受命于源程序的执行 语义。
6
名字与存储的绑定(数据空间的分配)P217
名字的联编(Bindings of Names),亦称汇集 • 是指把源程序中的数据名字映射到目标机存储单元的
过程。也称为数据空间的分配,称为名字x的一个联编。
• 标识符与数据目标的对应关系 –变量名 ── 数据存储单元地址 –过程名、函数名 ── 程序段入口地址
设x,y,z初值为5.1、2.3、0,则相应状态为 {(Mx,5.1)},{(My,2.3)},{(Mt,0)},执行程序 后:{(Mx,2.3)},{(My,5.1)}, {(Mt,5.1)} 总结:环境是由说明部分决定。
赋值语句仅能改变状态。
9
术语
静态:如果一个名字的性质通过说明语句或 隐或显规则而定义,则称这种性质是“静态 ”确定的。 动态:如果名字的性质只有在程序运行时才 能知道,则称这种性质为“动态”确定的。
– 字节数计算,通过类型计算空间需求 – 填写变量的地址(供引用)
– 动态绑定:运行时指定(具体地址/相对地
址),即名字的性质只有在程序运行时才能知 道。 • 如:参数、C++ 的引用变量
12
过程和函数的绑定
▪ 为过程指定程序代码段地址 ▪ 静态绑定:编译时指定相对地址,适用于
多数各种函数、过程。
第八章
目标程序运行时 的存储组织
1
•前面几章的讨论,主要集中在编译程序的前端,即研
究对源语言静态分析的各个阶段的原理、方法与技术
,上述分析过程主要取决于源语言的特性,对生成的
目标程序而言,能否正常运行,还与支持目标程序运
行时环境密切相关。
•运行时环境主要指的是目标计算机的寄存器及存储器
的结构,用来管理存储器并保存执行过程所需的信息
。即代码生成前如何安排目标机资源。因此,涉及到
与目标机、目标语言及操作系统相关的特性。
•编译程序必须组织与分配目标程序运行时的数据空间
。
•运行阶段的存储组织与分配是指编译程序在编译阶段
负责为源程序中出现的用户定义的变量与常量、临时
工作单元、过程或函数调用时需要的连接单元与返回
地址等组织好在运行阶段的存储空间。
5
•过程
一个过程定义就是一个说明,其最简单的形式
就是把一个标识符和一个语句联系起来。标识
符是过程的名字,语句是过程体。函数是指带
返回值的过程,可以作为过程来处理。
当过程名出现在可执行语句中时,这个过程便 在这一点被调用。过程调用的基本思想是执行 过程体,它也可以发生在表达式中。
过程定义中可以包含形式参数,与之相应的是实 在参数。我们可以把它们传递给被调用过程, 在过程体中用实参代替形参。
• 词法分析:在符号表建立过程的表项 • 过程体的语义分析
—构造目标代码,统计目标代码长度 —填写过程的入Байду номын сангаас地址(供引用) – 如:一般的函数、子例程
▪ 动态绑定:运行时指定
• 函数名作为形式参数。
13
静态概念 过程定义 名字说明 说明的作用域
动态对应 过程的活动 名字的绑定 绑定的生存期
14
数据表示(固定长度,直接或间接表示)
10
绑定的时机与策略
• 绑定的相关问题
–变量和过程的作用域,决定绑定的有效期
• 语言定义的标识符的生存期决定最终绑定 的时机
– 全局变量:全程有效——程序装入时 – 局部变量:分段有效——进入过程或分程序
时
11
变量名的绑定
– 静态绑定:编译时指定(相对地址), 即一
个名字的性质通过说明语句或隐或显规则而 定义,适用于多数各种变量名。 • 词法分析:在符号表建立变量的表项 • 说明语句的语义分析