第9章 目标代码

合集下载

Java编程基础及应用(第2版)教学课件第9章Java多线程机制

Java编程基础及应用(第2版)教学课件第9章Java多线程机制
进程是程序的一次动态执行 过程,它对应了从代码加载、执 行至执行完毕的一个完整过程, 这个过程也是进程本身从产生、 发展至消亡的过程。
现代操作系统可以同时管理 一个计算机系统中的多个进程, 即可以让计算机系统中的多个进 程轮流使用CPU资源。
§9.1.2 进程与线程
线程是比进程更小的执行 单位,一个进程在其执行过程 中,可以产生多个线程,形成 多条执行线索,每条线索,即 每个线程也有它自身的产生、 存在和消亡的过程。
例题1
§9.2.3 线程调度与优先级
处于就绪状态的线程首先进入就绪队列排队等候 CPU资源,同一时刻在就绪队列中的线程可能有多个。 Java虚拟机(JVM)中的线程调度器负责管理线程, 调度器把线程的优先级分为10个级别,分别用Thread 类中的类常量表示。
Java 调 度 器 的 任 务 是 使 高 优 先 级 的 线 程 能 始 终 运 行 , 一旦时间片有空闲,则使具有同等优先级的线程以轮流 的方式顺序使用时间片。
5.currentThread():该方法是Thread类中的类方法,可以用类名调用,该方法
返回当前正在使用CPU资源的线程。
6.interrupt() :一个占有CPU资源的线程可以让休眠的线程调用interrupt()方
法“吵醒”自己,即导致休眠的线程发生InterruptedException异常,从而结束休眠, 重新排队等待CPU资源。
例子5
例子5中有两个线程:会计和出纳,他俩共同拥有一个帐本。 他俩都可以使用saveOrTake(int amount)方法对帐本进行访问, 会计使用saveOrTake(int amount)方法时,向帐本上写入存钱记 录;出纳使用saveOrTake(int amount)方法时,向帐本写入取钱 记录。因此,当会计正在使用saveOrTake(int amount)时,出纳 被禁止使用,反之也是这样。

第9章 目标代码生成

第9章 目标代码生成

寄存器的使用准则
寄存器先行准则:尽可能把变量的值驻留到寄存器
中,尽可能用寄存器中的现行值,以减少访问内存
的次数。例:
1. (:=, 10, X) 2. (×, X, X, t1) 3. (-, X, t1, t2) 4. (:=, t2, X)
执行 1 后,把10装入到某寄存器
RX中,而不送到X的内存单元, 这样,2、3、4就可以直接从RX 中取值,而不用访问内存单元了
end GetReg
例:中间代码(三地址码): (1) t1 := z * 6 (2) x := -4 (3) if x >= 76 goto (7) (4) x := x + 4 (5) y := t1 + x (6) goto (3)
指令种类
• 赋值 MOV • 比较 CMP • ≥转移 JLE • 转移 JMP • 累加 ADD • 相乘 MUL
寄存器的分配原则是选择代价最小的寄存器,这就涉 及到代价如何计算的问题。如果申请的是空闲寄存器,则 代价自然为0,否则属于剥夺性质。当一个寄存器R被剥夺 时,R的一些占有变量的现行值可能不在内存中,而且以后 可能引用,因此要产生一些回送现行值的Store指令(ST) 和重新装入寄存器的Load指令(LD)。则R的分配代价包括:
DL:取D(Dead)或 L(Live)。如果从K+1中间
代码开始,到A重新被赋值或基本块结束都没有引
用A,则A的DL值为D;否则为L。DL值在中间代码
步骤确定。例如:
1. (+,a,b,t1) 2. (-,t1,c,t2) 3. (×,t2,b,t3) 4. (:=,t3,x)
(+,D,L,L) (-ቤተ መጻሕፍቲ ባይዱD,D,L) (×,D,D,L) (:=,D,D)

Python大数据分析与挖掘实战 第9章 地铁站点日客流量预测

Python大数据分析与挖掘实战 第9章 地铁站点日客流量预测
c1c2的计算我们根据附件1附件4给出的8月11月份的数据分别进行站点日期进站和出站客流量的提取c1是表示同一天同一站点的进站人数的进行统计累加则分别提取1号31号的进站客流量c2是表示同一天同一站点的出站人数的进行统计累加则分别提取1号31号的出站客流量由于提取代码相似则我们就以8月份数据提取为例进行介绍以同样的方法也可以得出9月11月份的数据示例代码如下
3
近些年来,日益加重的城市交通拥堵问题成为制约经济发展的主要因素,因 此以地铁为代表的城市轨道交通系统得到了大力的发展。地铁相比与其他的交通方 式具有较大的优势,主要体现在运量大、污染小、省能源,并且具有快捷、方便、 安全、舒适的特点。
随着城市轨道交通网络规模的持续扩大,客流时空分布规律愈加复杂,作为 客流生成源头的进出站客流,运营管理部门需对其进行实时监测,准确把握未来短 时间内客流变化趋势,从而实时调整运营计划,对突发大客流做出及时预警和响应。 为此,高精度、小粒度的实时进出站客流量预测已成为精细化运营管理的关键。本 次案例通过郑州市2015年8月-11月各地铁闸机刷卡数据,从数据中根据刷卡类型 编号,刷卡日期两个字段提取出不同时间进站和出站状态下的数据。提取所需数据 之后预测12月1日至7日七天内各个站点的日客流量(进站和出站的总人数),为 节日安保、人流控制等提供预警支持。
行业PPT模板:/hangye/ PPT素材下载:/sucai/ PPT图表下载:/tubiao/ PPT教程: /powerpoint/ Excel 教程:www.1ppt .com/excel/ PPT课件下载:/kejian/ 试卷下载:/shiti/
Part 9 9.1 背景案例
PPT模板下载:/moban/ 节日PPT模板:/jieri/ PPT背景图片:/beijing/ 优秀PPT下载:/xiazai/ Word教程: /word/ 资料下载:/ziliao/ 范文下载:/fanwen/ 教案下载:/jiaoan/ 字体下载:/ziti/

编译原理第九章 运行时存储空间组织

编译原理第九章  运行时存储空间组织
• 简单栈区(可以带递归,但不可以嵌套定义) • 复杂栈区(可以嵌套定义, pascal)
– 堆区(new, malloc)
9.5 嵌套过程语言的栈式实现
• Pascal 的过程嵌套 嵌套层次:主程序0层 ······ 采用层数计数器,每逢Proc Begin加1,遇 Proc End则减1。
• 直接外层 • 编译器需要将过程的层数记录到符号表中
2)返回函数结果:累加器、寄存器
··· a:= 3 ··· P(a); Write(a); ···
传地址 8,8 8
举例
Procedure P(x) Begin
x:=x+5; writeln(x,a); End;
传结果 8,3 8
传值 8,3 3
举例
begin
Procedure P(x,y,z) …P(a+b,a,a)
初等类型数据采用确定“字长”,数组按列存放,边界对齐。
这样,可将过程活动单元(局部数据区)直接安排在 过程目标码之后,以便运行时访问。
9.3 Fortran静态存储分配(2)
数据区
返回地址 调用程序返回地址(调用恢复地址)
寄存器保护区 保存调用程序的寄存器运行环境
形式单元 形参
简单变量 数组 临时变量
P ->S ->Q =》R ->R
Program P; var a,x…
Top
R
procedure Q(b)
SP
var i…
R
procedure R(u,v)

var c,d…

begin… R… end {R} 链
Q
begin … R… end{Q} procedure S

第十一章目标代码生成

第十一章目标代码生成
码中访问存储单元的次数。
这两个问题直接影响代码的执行速度。
基本问题
➢代码生成器的输入 ➢目标程序 ➢选择适当的代码指令 ➢寄存器分配方案 ➢计算顺序
例:考察下面中间代码序列 G1:
T1 := A+B T2 := A- B F := T1 * T2 T1 := A- B T2 := A – C T3 := B - C T1 := T1 * T2 G := T1 * T3
T1 := E/F T2 := D + T1 T3 := G + T2 T4 := C * T3 T5 := H * T4 T6 := B + T5 T7 := A + T6 T8 := I * J T9 := T7 + T8
最优的目标代码:
LD R0, E
DIV R0, F
ADD R0, G
MUL R0, H
T3 := B-C ; T2 := A- C ; S1 := A – B ; T1 := S1 *
T2;
G := T1 * T3; S2 := A + B ; F := S2 * S1 。如前所 述按后一个中间代较好理解,这里不再重述课 本内容。
T4 := E-F LD R0, E R0 中
SUB R0, F
T5:=T3* T4 MUL R1, R0 R1中
储器中
LD R0, T2
W:=T2/T5 DIV R0, R1 R0中
储器中
ST R0, W
R0含 T4
T4 在
R1含 T5
T5 在
R0含T2 T2在R0和存
R0含W
W在
W在R0和存
第十二章并行编译基础
目标代码一般有以下三种形式:

编译原理第三版课后习题答案

编译原理第三版课后习题答案

编译原理第三版课后习题答案编译原理是计算机科学中的一门重要课程,它研究的是如何将高级程序语言转换为机器语言的过程。

而《编译原理》第三版是目前被广泛采用的教材之一。

在学习过程中,课后习题是巩固知识、提高能力的重要环节。

本文将为读者提供《编译原理》第三版课后习题的答案,希望能够帮助读者更好地理解和掌握这门课程。

第一章:引论习题1.1:编译器和解释器有什么区别?答案:编译器将整个源程序转换为目标代码,然后一次性执行目标代码;而解释器则逐行解释源程序,并即时执行。

习题1.2:编译器的主要任务是什么?答案:编译器的主要任务是将高级程序语言转换为目标代码,包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等过程。

第二章:词法分析习题2.1:什么是词法分析?答案:词法分析是将源程序中的字符序列划分为有意义的词素(token)序列的过程。

习题2.2:请给出识别下列词素的正则表达式:(1)整数:[0-9]+(2)浮点数:[0-9]+\.[0-9]+(3)标识符:[a-zA-Z_][a-zA-Z_0-9]*第三章:语法分析习题3.1:什么是语法分析?答案:语法分析是将词法分析得到的词素序列转换为语法树的过程。

习题3.2:请给出下列文法的FIRST集和FOLLOW集:S -> aAbA -> cA | ε答案:FIRST(S) = {a}FIRST(A) = {c, ε}FOLLOW(S) = {$}FOLLOW(A) = {b}第四章:语义分析习题4.1:什么是语义分析?答案:语义分析是对源程序进行静态和动态语义检查的过程。

习题4.2:请给出下列文法的语义动作:S -> if E then S1 else S2答案:1. 计算E的值2. 如果E的值为真,则执行S1;否则执行S2。

第五章:中间代码生成习题5.1:什么是中间代码?答案:中间代码是一种介于源代码和目标代码之间的表示形式,它将源代码转换为一种更容易进行优化和转换的形式。

c程序设计 谭浩强 第9章

c程序设计 谭浩强 第9章
9
几点使用说明
第九章 9. 1预处理功能 9. 2文 件 包 含 9. 3条 件 编 译 9. 4库函数使 用方式
① 使用宏定义时所带的实参可以是常量、已被赋值 的变量名或者表达式。 例:将前面的示例程序改写为交互式输入半径值的方 式。 #define PI 3.1415926536 #define area(r) (PI*r*r) void main( ) { float r; printf("Input:r=?\n"); scanf("%f",&r); printf("Area=%f\n",area(r)); }
6
有关宏的定义和使用要注意以下几点:
第九章 9. 1预处理功能 9. 2文 件 包 含 9. 3条 件 编 译 9. 4库函数使 用方式
⑥ 如果宏定义中的字符序列过长,在一行中放不 下,可在该行末尾加续行符“\”,后随一个换 行符。 #define LONG_STRING this is a very long \ ↙ string that is used as an example ⑦ 可以用宏定义来表示数据类型。 #define MAX 100 #define ENTRY struct entrytype 在程序中可用ENTRY定义变量: ENTRY table[MAX],* p;
4
有关宏的定义和使用要注意以下几点:
第九章 9. 1预处理功能 9. 2文 件 包 含 9. 3条 件 编 译 9. 4库函数使 用方式
④ 宏定义可以嵌套。例如: #define PI 3.1415926 #define TWOPI ( 2*PI ) 在预处理后,语句 c1=TWOPI * r; 便替换成 c1=( 2 * 3.1415926 ) * r; ⑤ 宏替换只是按原来的定义“机械地”进行替 换,不管替换后的结果是对还是错。例如: #define A 3+2 那么 5/A 被替换成 5/3+2

成人自考00312政治学概论 第9章

成人自考00312政治学概论   第9章

二、资产阶级政党在国家政权中的地位和作用
➢ 资产阶级政党的根本目的:
实现、维护和巩固资产阶级统治,维护现有的政治秩序。
➢ 资产阶级政党具体的地位和作用:
• 政党政治是资产阶级民主政治的基石,是资产阶级民主 的标志。
• 资产阶级政党制度是其民主制度协调运作的工具。 • 政党政治是资本主义政治制度的自我调整机制。
美国总统制下的两党制特点: 第一,两党制主要表现在总统竞 选上。总统竞选的获胜者为执政 党,失败者为在野党。 第二,美国的两党组织结构松散, 没有严格的投票纪律。
15
16
两党制的特点
1、国内存在势均力敌长期占据本国政坛的两大政党。 2、两党处于竞争和对立状态。 3、两党制以多数代表制为基础。
当代两党制的新变化
31
四、社会主义国家的政治团体
➢ 社会主义国家政治团体的特征:
特征
①广泛的群众基础 ②比较统一、规范的组织结构形式 ③存在利益差别和不一致,但整体利益一致
➢社会主义国家政治团体的地位与作用
(1)组织功能
把分散的个体群众组织起来
(2)参政功能 采取多种方式参与国家的政治生活
作用
(3)民主监督功能
监督法律和政策的实施情况和党和 国家工作人员的履职情况
统治阶级政党的总功能是维护和巩固统治阶级 的政治统治。被统治阶级政党的总功能是反抗和 推翻统治阶级的政治统治。 政党的功能概括为如下三个方面: (1)争取群众和影响群众。一个政党拥有群众的 多少,是这个政党势力大小和强弱的重要标志。
10
(2)集中阶级意志。在资本主义国家,资产阶 级政党的竞选活动实际上就是一种统一阶级意 志的活动。在无产阶级国家,党制定路线、方 针、政策的过程,就是集中人民意志的过程。 (3)行使国家权力。政党掌握政权的方式有两 种:一是操纵议会,通过选举取得议会多数席 位;二是以本党的党员充任官吏,组织政府。

第九章 目标代码生成(1)

第九章  目标代码生成(1)

SYMBL[X( L )]
…L
a
yyy
b
yy
c
yy
d
yy
t1 n y y n
t2 n y n
t3 n y n
t4
nyn
t5
nyn
x
yn
9.1.3 寄存器的分配问题
寄存器操作快且指令短,如何充分利用它?
⒈ 设置描述表: RDL(R0,R1,…, Rn):
用以记录寄存器的当前状态:如 RDL.R1=x 如何为
此外还有下述 操作码 op :
逻辑 运算
LT(<),GT(>),EQ(==),LE(<=),GE(>=),NE(!=) AND(&&),OR(||),NO(!)
※ 四元式目标代码翻译示例:
【例9.1】
⑴( + a b t1 ) ⑵( - t1 d t2 )
①LD R0,a ②ADD R0,b ③SUB R0,d
※ 附有活跃信息的四元式:
⑴(+ a(y) b(y) t1(y ) ) ⑵(* a(y) t1(y) t3(y) ) ⑶(/ t1(y) t3(n ) x(y) ) ⑷(= t1(n) _ i(y ) )
Ⅲ. 基本块内活跃信息求解算法
• 支持: ⑴ 在符号表上增设一个信息项( L )
name … L
⑴(+ a( y ) b( y ) t1( y )) ⑵(- c( y ) d( y ) t2( y )) ⑶(* t1( y )t2( n )t3( y ))
⑷(- a( y ) t3( n )t4( y )) ⑸(/ t1( n ) 2 t5( y )) ⑹(+ t4( n )t5( n ) x( y ))

编译第9章

编译第9章

符号名表SNT
NAME (1)M (2)N (3)K INFORMATION 形参,整数,变量 形参,整数,变量 整数,变量
常数表CT
值(VALUE) (1) 1 (2) 4
入口名表ENT NAME INFORMATION (1)INCWAP 二目子程序,入口QT(1) /*记录入口名INCWAP的入口地址*/ 标号表LT LABLE INFORMATION (1)10 QT(4) /*记录了标号10对应的四元式序列号*/
9.2 符号的主要属性(信息)及作用
几种通常都是需要的。 • 1 符号名
– 作为标识符在表中唯一区别一般不允许重名。 – 对于重载可以通过参数类型、个数和返回值类 型来区分。 – 通常把一个标识符在符号表中的位置的整数值 称之该标识符的内部代码。
• 2 类型
– 定义一个标识符的基本类型或它的组合类型都 是符号表中表示标识符属性的重要信息。
• 3、折衷方式是根据符号属性相似程度分 类组织成若干张表,每张表中记录的符 号都有比较多的相同属性。 – 在管理复杂性和空间效率方面都取得 折中的效果。
符号表举例
编译程序按名字的不同种属分别使用许多符号表, 如常数表、变量名表、过程名表等等。 SUBROUTINE INCWAP(M,N) 10 K=M+1 M=M+4 N=K RETURN END 经编译头三阶段后所产生的主要表格有:符号名表 SNT、常数表CT、入口名表ENT、标号表LT和四 元式表QT
五、说明部分的分析与处理
• 对每个过程说明的对象(变量,常量和过程) 造名字表 –填写标பைடு நூலகம்符的所在层次、属性和分配的相 对位置。标识符的属性不同时,所需填入 的信息也不同。 –登录信息由ENTER过程完成。

程序设计语言 编译原理(第三版)第9章

程序设计语言 编译原理(第三版)第9章

TOP 32
d
31
c
30
v
29
u
28
2
27
11
SP 26 25
返回地址 17
24
d
23
c
22
v(形参)
21
u(形参)
20
2(形参个数)
19
11
18
返回地址
17
11
16
i
15
b(形参)
14 1(形参个数)
13
0
12
返回地址
11
5
10
i
9
c
8
0
7
0
6
返回地址
5
0
4
x
3
a
2
0
1
返回地址
0
0
25
9.5 嵌套过程语言的栈式实现
0
0
过程S中调 用Q时
过程P中 调用S时
23
过程Q中调用R时
TOP
24
d
23
c
22
v(形参)
21
u(形参)
20 2(形参个数)
19
11
18 返回地址
SP
17
11
16
i
15
b(形参)
14 1(形参个数)
13
0
12
返回地址
11
5
10
i
9
c
8
0
7
0
6
返回地址
5
0
4
x
3
a
2
0
1
返回地址
0
0

第9章因特网控制报文协议(ICMP)

第9章因特网控制报文协议(ICMP)

改变路由的概念如下图所示。主机A打算向主机B发送 改变路由的概念如下图所示。主机A打算向主机B 数据报。路由器R2显然是最有效的路由选择,但是主机A 数据报。路由器R2显然是最有效的路由选择,但是主机A R2显然是最有效的路由选择 没有选择路由器R2 数据报被发送到路由器R1而不是R2 R2。 R1而不是R2。 没有选择路由器R2。数据报被发送到路由器R1而不是R2。 R1在查找路由表后发现分组应当走R2。它把分组发送到R2 在查找路由表后发现分组应当走R2 R2, R1在查找路由表后发现分组应当走R2。它把分组发送到R2, 并同时向主机A发送改变路由报文。主机A 并同时向主机A发送改变路由报文。主机A的路由表这时就 被更新了。 被更新了。
下图给出了改变路由报文的格式。合适的目标的IP IP地 下图给出了改变路由报文的格式。合适的目标的IP地 址在第二行给出。 址在第二行给出。 代码0 对特定网络路由的改变。 代码0。对特定网络路由的改变。 代码1 对特定主机路由的改变。 代码1。对特定主机路由的改变。 代码2 基于指明的服务类型对特定网络路由的改变。 代码2。基于指明的服务类型对特定网络路由的改变。 代码3 基于指明的服务类型对特定主机路由的改变。 代码3。基于指明的服务类型对特定主机路由的改变。
代码9 代码9。与目的网络的通 信从管理上是禁止的。 信从管理上是禁止的。 代码10 10。 代码10。与目地主机的通 信从管理上是禁止的。 信从管理上是禁止的。 代码11 11。 代码11。对指明的服务类 网络不可达。 型,网络不可达。 代码12 12。 代码12。对知名的服务类 主机不可达。 型,主机不可达。 代码13 主机不可达, 13。 代码13。主机不可达,因 为管理机构放置了一个过 滤器在它上面。 滤器在它上面。 代码14 主机不可达, 14。 代码14。主机不可达,因 为主机的优先级被破坏了。 为主机的优先级被破坏了。 代码15 主机不可达, 15。 代码15。主机不可达,因 为它的优先级被删了。 为它的优先级被删了。

编译原理简明教程(第2版)[冯秀芳,崔冬华,段富][电子教案] 第14章

编译原理简明教程(第2版)[冯秀芳,崔冬华,段富][电子教案] 第14章

14.3
面向对象的动态存储分配
14.3.1 对象的存储区管理方式
对象的存储管理采用了3种模型:静态存储区管理、栈式存 储区管理、堆式存储区管理。 在静态模型中,程序装入或开始执行时为所有对象一次分配 所有空间,一个实体在整个软件运行过程中最多只能与一个运 行时对象联系。 在栈式模型中,一个实体在运行时可以相继与多个对象联系, 它以先进后出的方式分配和释放对象。 在堆式模式中,存储分配是完全动态的,对象通过显式的请 求动态创建,堆式模型最具有通用性,它是面向对象的计算所 需要的。
14.1.1 面向对象语言的基本特征
1. 对象之间通过消息相互通信
2. 封装 3. 继承 4. 多态性
14.1 概述
14.1.2 类和成员的属性构造
声明类的文法规则:
(1) dec→classdec (2) classdec→ class class_id {memberspec}| class class_id : class_id {memberspec} (3) memberspec→ memberdec memberspec | memberdec (4) memberdec→accessspec : type var ;| accessspec:funcdec; (5) accessspec→private | protected | public (6) type→comtype|classtype (7) classtype→ID (8) var→ID|ObjDef (9) funcdec→type ID (paramlist); | type ID (paramlist) funcbody; |ID (paramlist);|ID (paramlist) procbody;

第9章 宏定义1

第9章 宏定义1

说明:
4): 文件包含可用双撇号,也可用尖括号。 它们的区别是: 尖括号:系统到存放c库函数头文件的目录中寻找要 包含的文件 双撇号:系统先在用户当前目录中寻找,找不到再 按尖括号的方式寻找。 5):被包含的文件与其所在的文件在预编译后已变成同一 文件
条件编译:
1):一般情况下,源程序中所有的行都参加编译。但是有时希望对其 中一部分内容只在满足一定条件才进行编译,也就是对一部分内容 指定编译的条件,这就是“条件编译”。 2):表达形式: #ifdef 标识符 程序段1 #else 程序段2 #endif #ifndef 标识符 程序段1 #else 程序段2 #endif #if 表达式 程序段1 #else 程序段2 #endif
例9.5、用宏代表输出格式
#define PR printf #define NL "\n" #define D "%D" #define D1 D NL #define D2 D D NL #define D3 D D D NL #define D4 D D D D NL #define S "%S" main() {int a,B,C,D; char string[]="CHINA"; 1 a=1;B=2;C=3;D=4; 12 PR(D1,a); PR(D2,a,B); 123 PR(D3,a,B,C); 1234 PR(D4,a,B,C,D); CHINA PR(S,string); }
预处理的命令有以下几个特点: 1.预处理命令均以#开头,结尾不加分号; 2.预处理命令可以放在程序中任何位置,作用 范围从定义处到文件结尾。
宏定义:
1:不带参数的宏定义 1) 用一个指定的标识符来代替一个字符串 2) 它的一般形式: #define 标识符 字符串 3) 作用:把标识符定义为字符串。在进行编译预处理时,• 译 编 系统就能够把程序中出现的标识符,一律用字符串去替换,然后 再对替换处理后的源程序进行编译。

《C++程序设计》电子教案第9章 多态性和虚函数

《C++程序设计》电子教案第9章  多态性和虚函数

返回本节
9.1.3 派生类指针
指向基类和派生类的指针是相关的。 例如: A * p ; // 指向类型 A 的对象的指针 A A_obj ; // 类型 A 的对象 B B_obj ; // 类型 B 的对象 p = & A_obj ; // p 指向类型 A 的对象 p = & B_obj ; // p 指向类型 B 的对象,它是 A 的派生类
((B_class *)p)->show_phone( ); // 用基类指针访问公有派生类的特定成员,必须进行类型转换 } 此程序的运行结果为: Zhang San Li Si
0731_12345678 0731_12345678
例9-9:写出下面的程序的执行结果。 #include <iostream.h> class Student { public: Student(int xx) { x=xx; } virtual float calcTuition( ); protected: int x; }; float Student::calcTuition() { return float(x*x);
main ( ) { A_class *p; //对象指针 A_class A_obj; //对象 B_class * bp; B_class B_obj; p=&A_obj; //P指针指向基类对象,调用基类成员函数 p->put_name("Zhang San"); p=& B_obj; //P指针指向派生类对象,调用继承自基类的成 员函数 p->put_name("Li Si"); A_obj.show_name( ); B_obj.show_name( ); bp=&B_obj; bp->put_phone("0731_12345678"); bp->show_phone( );

程序设计语言与编译原理_第九章语义分析和中间代码生成

程序设计语言与编译原理_第九章语义分析和中间代码生成
• 中间语言(复杂性界于源语言和目标语言 之间)的好处:
– 便于进行与机器无关的代码优化工作 – 易于移植 – 使编译程序的结构在逻辑上更为简单明确
Compiler
Compiler
源语言 Front End 中间语 Back End 目标语
程序
言程序
言程序
10
程序设计语言与编译
• 常用的中间语言:
找包含它的最小switch、while或for语句方可找到
转向点,否则出错。
(3) 一致性检查
如在相同作用域中标识符只能说明一次、
case语句的标号不能相同、函数调用参数个数要相同
等。
程序设计语言与编译
常见的语义错误
声明和使用相关的语义错误 –标识符没有声明; –重复声明;
如何检查? –每当遇到新声明的标识符,查符号表
– 后缀式,逆波兰表示 – 图表示: DAG、抽象语法树 – 三地址代码
• 三元式 • 四元式 • 间接三元式
11
程序设计语言与编译
四元式形式: (op,ARG1,ARG2,RESULT) op—运算符 ARG1—第一运算量 ARG2—第二运算量 RESULT—结果
程序设计语言与编译 如: A:=-B*(C+D)
形如x:=y op z的赋值语句,op为二目算术
算符或逻辑算符;
赋值语句x:=op y,op为一元算符,如一元
减uminus, not, 移位及转换算符(如将定点 数转换为浮点数);
赋值语句x:=y;
无条件转移语句 goto L;
16
程序设计语言与编译
条件转移语句 if x relop y goto L 或 if a goto
» 如果当前有效的所有标识符中有相同名字的,则 是重复声明错误;

编译原理运行时存储空间组织

编译原理运行时存储空间组织

(12) procedure quicksort(m, n:integer);
(13) var i:integer;
(14) begin
(15) if (n>m) then begin
(16) i:=partition(m, n );
(17) (18) (19)
quicksort(m, i-1 ); quicksort(i+1, n ) end;
对任何局部变量X 的引用可表示为变 址访问:
dx[SP] dx: 变量X相对于 活动记录起点的 地址,在编译时可 确定。
每个过程的活动记录内容(嵌套语言)
TOP→ 临时单元 内情向量 局部变量 形式单元
2 静态链 1 动态链 SP→ 0 返回地址
q 连接数据
Ø 返回地址 Ø 动 态 链 : 指 向 调 用 该过程前的最新活动 记录地址的指针。 Ø 静 态 链 : 指 向 静 态 直接外层最新活动记 录地址的指针,用来 访问非局部数据。
v 一个目标程序运行所需的存储空间包括:
l 存放目标代码的空间 l 存放数据项目的空间 l 存放程序运行的控制或连接数据所需单元(控制
栈)
v 运行时存储空间划分:
目标代码(Code) 静态数据
(Static Data) 栈(Stack) ↓ ↑ 堆(Heap)
9.2.2 活动记录
v 假定语言的特点为:允许过程递归调用、允许过程含 有可变数组,但过程定义不允许嵌套,如C语言。
l 过程是否允许递归? l 当控制从一个过程的活动返回时,对局部名
称的值如何处理? l 过程是否允许引用非局部名称? l 过程调用时如何传递参数;过程是否可以做
为参数被传递和做为结果被返回? l 存储空间可否在程序控制下进行动态分配? l 存储空间是否必须显式地释放?
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

9.2
假想计算机模型
具体设计一个代码生成器需要考虑机 器结构、系统指令格式等方面的问题。 由于计算机体系结构和操作系统的多样 性,我们在这里不做具体介绍,仅仅以 一个假想的计算机模型为例,简单讨论 代码生成的基本原理。 假想计算机的指令格式见P162
9.3
简单代码生成器
简单代码生成器功能 依次把四元式变换成目标代码, 依次把四元式变换成目标代码 , 并在一个基本块内考虑如何充分利用 寄存器。 寄存器。 在设计代码生成器时,为考虑充分 利用寄存器,我们须要考虑下面两点:
我们根据上述算法得到待用信息链和活 跃信息链如下:
活跃信息 待用信息 初值 待用信息链 初值 活跃信息链 F (3) F F L F F (2) (1) L L L F (1) L L F (2) L L F (4) (3) F F L L F F (4) F F L F F F L F
T A B C U V D
见表1
9.3
简单代码生成器
(2) 从基本块出口到基本块入口由 由 后向前依次处理各四元式。对每个四 后向前 元式 i: A=B op C,依次执行如下骤 ① 把符号表中变量A的待用信息和活 跃信息附加到四元式i上; ② 把符号表中变量A的待用信息栏和 活跃信息栏分别置为“非待用”和 “非活跃”;
见后 见表2
返回3 返回2 返回1
9.3
简单代码生成器
待用信息和活跃信息在四元式上的标记 如下: ⑴ ⑵ ⑶ ⑷ T⑶L=A⑵L-BFL U⑶L=AFL-CFL V⑷L=TFF+U⑷L DFL=VFF+UFF
返回2 返回3
9.3
简单代码生成器
在代码生成中进行寄存器分配, 我们需随时掌握各寄存器的使用情况
3. 建立寄存器描述数组RVALUE,动态 寄存器描述数组RVALUE RVALUE,
2. 待装配的机器语言模块,当需 要执行时,由连接装配程序把它们与另 外一些运行子程序连接起来,组合成可 执行的机器语言代码。 3. 汇编语言程序,必须通过汇编 程序汇编成可执行的机器语言代码。
9.1 概述
二. 设计代码生成器时要着重考 虑目标代码的质量 衡量目标代码的质量 1.存储空间: 生成的目标代码短。 2.执行效率: 充分利用寄存器,减少 访问存储单元的次数。
地记录各寄存器的分配状况 { }
空闲
RVALUE[R]= { A } 分配给某变量A { A,B } 分配给变量A,B
9.3
简单代码生成器
变量地址描述数组AVALUE AVALUE, 4. 建立变量地址描述数组AVALUE,动 态地记录各变量现行值的存放位置 {R} AVALUE[A]= { A } { A,R }
9.3

简单代码生成器
A在(i)定值 A在(j)引用
: (i) A=T1 : : (j) T2 =A OP X
(j)为四元式(i)变量A的待用信息
9.3
简单代码生成器
(2) 活跃变量 基本块中所有的非临时变量均看 作基本块出口之后的活跃变量,临时 变量根据其在基本块出口之后是否被 引用来确定它是否为活跃变量。
修改寄存器使用信息 和地址描述信息
9.3
⑴ ⑵ ⑶ ⑷
简单代码生成器
LD R0, A SUB R0, B LD R1, A SUB R1, C ADD R0, R1 ADD R0, R1
T=A-B U=A-C V=T+U D=V+U
9.4 代码生成器的自动生成技术
现阶段代码生成器的自动生成器主 要采用由形式描述进行驱动的技术 采用由形式描述进行驱动的技术,这 采用由形式描述进行驱动的技术 种技术把目标机的每条指令的形式描述 每条指令的形式描述 作为输入,将表示计算的中间语言代码 与这种描述进行匹配 进行匹配来产生相应的指令。 进行匹配
本章小结
(2) 活跃变量 基本块中所有的非临时变量均看 作基本块出口之后的活跃变量,临时 变量根据其在基本块出口之后是否被 引用来确定它是否为活跃变量。
9.3
简单代码生成器
1. 给出寄存器的分配原则 (1)把基本块内还要使用的变量的值 尽可能地保存在寄存器中; (2)在基本块内,把不再使用的变量 所占用的寄存器及时释放掉; (3)当到基本块出口时,将变量的值 存放在内存中。
9.3
简单代码生成器
当翻译一个四元式如A=B op C时, 我们需要知道在基本块中还有哪些四元 式要对变量A、B、C进行引用。 2. 建立每个变量的待用信息和活跃信息 (1)待ห้องสมุดไป่ตู้信息
A的现行值在寄存器R中 A的现行值在内存中 A的现行值既在寄存器R 中又在内存中
9.3
简单代码生成器
有了上述对寄存器和地址的描述, 我们可以给出一个简单代码生成算法。
调用函数GETREG(i:A=B op C) 得到存放A的现行值的寄存器R 取变量B和C的现行值的存放位置B’和C’ B’⇐AVALUE[B] C’⇐AVALUE[C] Y B’=R? 生成目标代码 OP R, C’ 生成目标代码 LD R, B’ OP R, C’ N
本章小结
2. 目标代码的形式 (1)能够立即执行的机器语言代码 (2)待装配的机器语言模块 (3)汇编语言代码
本章小结
3. 目标代码生成需要考虑的基本问题 (1) 如何使生成的目标代码最短; (2) 如何充分利用计算机的寄存器, 减少目标代码中访问存储单元的次 数。
本章小结
4. 待用信息和活跃信息的概念 (1) 待用信息 : (i) A=T1 A在(i)定值 : : A在(j)引用 (j) T2 =A OP X (j)为四元式(i)变量A的待用信息
9.1 概述
一. 目标代码生成的任务
中 间 代 码 程 序
代 码 生 成 器
目 标 代 码 程 序
9.1 概述
代码生成器的输入除中间代码外 还包括符号表中的信息,生成的目标 代码一般有如下三种形式 1. 能够立即执行的机器语言代码, 它们通常存放在固定的存储区中,编译 后可直接执行。
9.1 概述
9.4 代码生成器的自动生成技术
形式描述技术的主要优点是:把 实现者从选择计算给定构造的代码中 解放出来,实现者只需要以形式化描 实现者只需要以形式化描 述每条目标指令的精确意义,生成器 述每条目标指令的精确意义 将自动地查询机器描述,找出为完成 所需的计算的指令或指令串。
本章小结
1. 目标代码生成的任务 代码生成一般是在语法分析后的 中间代码级上进行,其功能是将中间 代码转换为目标代码。
9.3
简单代码生成器
(3) 计算变量待用信息和活跃信息 的算法: 输入:基本块及其入口语句号和 出口语句号 输出:附加待用信息和活跃信息 的基本块
9.3
简单代码生成器
算法的步骤 假设变量的符号表内有待用信息和 活跃信息栏 (1) 将符号表中每个变量的待用 信息栏初始化 初始化为“非待用”,对活 初始化 跃信息栏则根据该变量在基本块出 口之后是否活跃,将该栏中的信息 置为“活跃”或“非活跃”。
第9章 目标代码生成
编译程序最后一个阶段是目标代码生 成。它通常在语义分析后或者优化后的中 间代码上进行,并将中间代码转化为等价 的目标代码。
本章主要介绍 简单代码生成器的设计和构造方法
9.1 概述
我们知道,编译程序的最终目的是 将源程序翻译成等价的目标程序,为了 达到此目的,编译程序除了对源程序进 行词法分析、语法分析和语义分析外, 还必需将语义分析后或者优化后的中间 代码转换为等价的目标代码。
9.3
简单代码生成器
③ 把符号表中变量B和C的待用信息 和活跃信息附加到四元式i上; ④ 把符号表中B和C的待用信息置为i, 活跃信息置为“活跃”。 注意,以上①、②、③、④次序不能 注意 颠倒。
见表3 见后
9.3
变 量 名
简单代码生成器
⑴ ⑵ ⑶ ⑷ T=A-B U=A-C V=T+U D=V+U
相关文档
最新文档