编译原理与技术 - ustcstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end...

35
2015/9/6 《编译原理与技术》讲义 1 编译原理与技术

Upload: others

Post on 19-Apr-2020

30 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 1

编译原理与技术

Page 2: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 2

第一章 引论

什么是编译程序?

翻译程序、解释程序和汇编程序

编译程序的组成结构

编译程序的生成

相关话题

Page 3: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 3

语言翻译过程

算法描述,求某整数n的阶乘fact(n), n≥01 // n == 0

fact(n) = n * fact( n-1 ) // n! == n * (n-1)!

伪语言描述

fact(n) = if n ≤ 0 then 1 else n*fact(n-1)

Page 4: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 4

语言翻译过程

高级程序设计语言描述,(如C语言)

int fact( int n ){

if (n<= 0) return 1;else return ( n*fact(n-1));

}

Page 5: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 5

语言翻译过程

输入命令 cc foo.cc 程序 foo.c

Ansi C compiler cc

Object file

Linker/连接程序

a.out/可执行程序

库函数或其它object文件

Page 6: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 6

语言翻译过程

a.out/可执行程序

loader/装入程序

计算机输入数据 计算结果

Page 7: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 7

语言翻译过程

为何不设计直接运行高级语言的机器?

机器本身的指令系统(二进制)

语言本身扩展

Page 8: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 8

什么是编译程序?

源程序 S

(高级语言)

编译程序 C 目标程序 T

(机器语言)

初始数据

目标程序 T

运行系统

计算机

计算结果

Page 9: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 9

什么是编译程序?

源语言(程序)到目标语言(程序)的映射转换或者翻译过程

系列转换(翻译)过程

源语言S T1 … Tn 目标语言T

中间语言

Page 10: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 10

解释程序与汇编程序

均属于翻译程序

源程序 S

初始数据Interpreter/解释程序 计算结果

汇编程序 S’

汇编语言assembler/汇编程序 目标程序 T

Page 11: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 11

C函数fact的汇编语言形式.file "foo.c"

.text.globl fact

.type fact,@functionfact:

pushl%ebpmovl %esp, %ebpsubl $4, %espcmpl $0, 8(%ebp)jg .L2movl $1, -4(%ebp)jmp .L1

.L2:subl $12, %espmovl 8(%ebp), %eaxdecl %eax

pushl %eaxcall factaddl $16, %espimull 8(%ebp), %eaxmovl %eax, -4(%ebp)

.L1:movl -4(%ebp), %eaxleaveret

.Lfe1:.size fact,.Lfe1-fact.ident "GCC: (GNU) 3.2.2

20030222 (Red Hat Linux 3.2.2-5)"

Page 12: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 12

编译程序的组成结构

词法分析阶段

语法分析阶段

语义分析、中间代码生成

优化阶段

目标代码生成

Page 13: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 13

编译程序的组成结构

semantics

parser

scanner

optimizer

code generator

program

前端front end

与源语言有关

middle end后端back end

与目标机相关

Page 14: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 14

编译程序的组成结构

例子,hoo.c:main(){

float position, initial, rate;

position = initial + rate * 60;

}

Page 15: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 15

编译程序的组成结构

词法分析阶段-scanner字符流 -> 记号流

position = initial + rate * 60 字符流

scanner

id1 = id2 + id3 * 60 记号流

标识符 赋值运算符 标识符 加运算符 标识符 乘运算符 整型常量

Page 16: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 16

编译程序的组成结构

语法分析阶段-parser记号流 -> 分析树(语法树)

id1 = id2 + id3 * 60 记号流

parser

=id1

id2+

*id3 60

语法树

Page 17: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 17

编译程序的组成结构

语义分析

语义树-带有语义信息的分析树(语法树)

id1id2

+*

id3

60

=

int float

进行类型转换

Page 18: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 18

编译程序的组成结构

中间代码生成

形式多样 - 三地址码,p-code等t1 := int_to_float( 60 )t2 := id3 * t1t3 := id2 + t2id1 := t3

Page 19: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 19

编译程序的组成结构

代码优化

得到“优化”后的中间代码;也可以在最后的代码生成阶段实施“优化”

t1 := rate * 60.0 // 直接用浮点数60.0position := initial + t1 // 去除多余的

// 临时变量

较优化前,减少2条中间代码

Page 20: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 20

编译程序的组成结构

代码生成

与目标机器有密切联系,如指令选择,寄存器的使用等。

movf rate, R1mulf #60.0, R1movf initial, R2addf R2, R1movf R1, position

Page 21: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 21

编译程序的组成结构

符号表管理

名称 类型 …position float

initial floatrate float… …

编译程序中使用的符号表

Page 22: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 22

编译程序的组成结构

出错处理

程序错误分类

出错处理的目标与方法

1) if ( n <= 0 return 1; // missing “)”

2) if ( n <= 0 ) return 1 // missing “;”else return ( n * fact(n-1) );

Page 23: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 23

编译程序的组成结构

semantics

parser

scanner

optimizer

code generator

符号表管理

出错处理

Page 24: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 24

编译程序生成

手工编写

耗时,“效率”问题。

自动生成

各个阶段基本上有相应的自动生成工具,如

lex、yacc。 自展(bootstrapping)

Page 25: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 25

编译程序生成

编译程序的自展/自编译

T型图

S T

I源语言S

目标语言T

编译程序的实现语言I

Page 26: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 26

编译程序生成

编译程序的自展/自编译

我们的目标是在机器A(目标语言)上,用语言A(实现语言)构造高级语言L(源语言)的编译程序。

L A

A

Page 27: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 27

编译程序生成

编译程序的自展/自编译

Step1:我们可以考虑源语言L的子集语言S, S ⊆L。在机器A(目标语言)上,用语言A(实现语言)构造语言S的编译程序。

S A

A

Page 28: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 28

编译程序生成

编译程序的自展/自编译

Step2:在机器A(目标语言)上,用语言S(实现语言)构造语言L的编译程序。

L A

S

Page 29: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 29

编译程序生成

编译程序的自展/自编译

Step3:

L A

S S A

A

L A

A

Page 30: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 30

编译程序生成

编译程序的移植/交叉编译

考虑将A机器上语言L的编译实现移植到机器B上,即我们的目标是:

L B

B

Page 31: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 31

编译程序生成

编译程序的移植/交叉编译

我们已有的编译程序是:

L A

A

Page 32: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 32

编译程序生成

编译程序的移植/交叉编译

Step1:L B

L L A

A

L B

A

用语言L编写的语言L到语言B的编译程

借助已有的A机器上语言L的编译程序

得到机器A上(实现语言)语言L到语言B的

编译程序

Page 33: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 33

编译程序生成

编译程序的移植/交叉编译

Step2:

L B

L L B

A

L B

B

用语言L编写的语言L到语言B的编译程

新的A机器上语言L到语言B的编译程序

得到机器B上(实现语言)语言L到语言B的

编译程序

Page 34: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 34

编译程序相关的软件

预处理程序-preprocessor宏替换-macro包含文件展开-include files

汇编程序-assembler两趟扫描

解释程序-interpreter 连接程序-linker 装入程序-loader

重定位

Page 35: 编译原理与技术 - USTCstaff.ustc.edu.cn/~qlzheng/compiler/lec1.pdfprogram 前端 front end 与源语言有关 后端 middle end back end 与目标机相关 2015/9/6 《编译原理与技术》讲义

2015/9/6 《编译原理与技术》讲义 35

编译程序相关的软件

调试程序-debugger cc 编译器中 –g 选项;与-O的关系

描述程序-profiler性能分析