编译原理与技术讲义.ppt

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

=
id1
+
进行类型 转换
id2
*
id3
int float
60
2020/10/20
《编译原理与技术》讲义
17
编译程序的组成结构
中间代码生成 形式多样 - 三地址码,p-code等 t1 := int_to_float( 60 ) t2 := id3 * t1 t3 := id2 + t2 id1 := t3
均属于翻译程序
源程序 S 初始数据
Interpreter/解释程序
计算结果
汇编程序 S’ 汇编语言
assembler/汇编程序
目标程序 T
2020/10/20
《编译原理与技术》讲义
10
C函数fact的汇编语言形式
.file "foo.c" .text
.globl fact .type fact,@function
编译原理与技术
2020/10/20
《编译原理与技术》讲义
1
第一章 引论
什么是编译程序? 翻译程序、解释程序和汇编程序 编译程序的组成结构 编译程序的生成 相关话题
2020/10/20
《编译原理与技术》讲义
2
语言翻译过程
算法描述,求某整数n的阶乘fact(n), n≥0 1 // n == 0
2020/10/20
《编译原理与技术》讲义
11
编译程序的组成结构
词法分析阶段 语法分析阶段 语义分析、中间代码生成 优化阶段 目标代码生成
2020/10/20
《编译原理与技术》讲义
12
编译程序的组成结构
后端
back end 与目标机相关
program
scanner parser semantics
}
2020/10/20
《编译原理与技术》讲义
14
编译程序的组成结构
词法分析阶段-scanner 字符流 -> 记号流
position = initial + rate * 60
scanner
字符流
id1 = id2 + id3 * 60 记号流
标识符 赋值运算符 标识符 加运算符 标识符 乘运算符 整型常量
2020/10/20
《编译原理与技术》讲义
15
编译程序的组成结构
语法分析阶段-parser 记号流 -> 分析树(语法树)
id1 = id2 + id3 * 60 记号流
parser
2020/10/20
= id1
+
语法树Leabharlann Baidu
id2
*
id3
60
《编译原理与技术》讲义
16
编译程序的组成结构
语义分析 语义树-带有语义信息的分析树(语法树)
fact: pushl %ebp movl %esp, %ebp subl $4, %esp cmpl $0, 8(%ebp) jg .L2 movl $1, -4(%ebp) jmp .L1
.L2: subl $12, %esp movl 8(%ebp), %eax decl %eax
pushl %eax call fact addl $16, %esp imull 8(%ebp), %eax movl %eax, -4(%ebp) .L1: movl -4(%ebp), %eax leave ret .Lfe1: .size fact,.Lfe1-fact .ident "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"
目标程序 T (机器语言)
初始数据
2020/10/20
目标程序 T 运行系统 计算机
计算结果
《编译原理与技术》讲义
8
什么是编译程序?
源语言(程序)到目标语言(程序)的映射 转换或者翻译过程
系列转换(翻译)过程
源语言S
T1

Tn
中间语言
目标语言T
2020/10/20
《编译原理与技术》讲义
9
解释程序与汇编程序
optimizer code generator
前端 front end 与源语言有关
middle end
2020/10/20
《编译原理与技术》讲义
13
编译程序的组成结构
例子,hoo.c: main() { float position, initial, rate;
position = initial + rate * 60;
《编译原理与技术》讲义
20
编译程序的组成结构
符号表管理
名称 类型

position float
initial float
rate float
2020/10/20
《编译原理与技术》讲义
18
编译程序的组成结构
代码优化 得到“优化”后的中间代码;也可以在最后 的代码生成阶段实施“优化”
t1 := rate * 60.0
// 直接用浮点数60.0
position := initial + t1 // 去除多余的
// 临时变量
较优化前,减少2条中间代码
输入数据
a.out/可执行程序 loader/装入程序
计算机
计算结果
2020/10/20
《编译原理与技术》讲义
6
语言翻译过程
为何不设计直接运行高级语言的机器? ✓机器本身的指令系统(二进制) ✓语言本身扩展
2020/10/20
《编译原理与技术》讲义
7
什么是编译程序?
源程序 S (高级语言)
编译程序 C
fact(n) = n * fact( n-1 ) // n! == n * (n-1)!
伪语言描述 fact(n) = if n ≤ 0 then 1 else n*fact(n-1)
2020/10/20
《编译原理与技术》讲义
3
语言翻译过程
高级程序设计语言描述,(如C语言) int fact( int n ) { if (n<= 0) return 1; else return ( n*fact(n-1)); }
2020/10/20
《编译原理与技术》讲义
4
语言翻译过程
输入命令 cc foo.c
c 程序 foo.c
库函数或 其它 object文 件
Ansi C compiler cc Object file
Linker/连接程序
a.out/可执行程序
2020/10/20
《编译原理与技术》讲义
5
语言翻译过程
2020/10/20
《编译原理与技术》讲义
19
编译程序的组成结构
代码生成 与目标机器有密切联系,如指令选择,寄存 器的使用等。
movf rate, R1 mulf #60.0, R1 movf initial, R2 addf R2, R1 movf R1, position
2020/10/20
相关文档
最新文档