1 什么是编译
编译:将高级语言(源语言)翻译成汇编语言或机器语言(目标语言)的过程
源语言 | 目标语言 | 过程名称 |
---|---|---|
高级语言 | 机器语言 | 编译 |
汇编语言 | 机器语言 | 编译 |
高级语言 | 汇编语言 | 汇编 |
步骤
- 源程序经过预处理器(将分块的源程序聚合到一起)得到预处理的源程序
- 预处理的程序经过编译器得到汇编语言
- 汇编语言通过汇编器得到可重定位机器语言(起始位置不定,可变化)
- 可重定位机器语言通过链接器(解决外部内存地址问题,将对各可重定位代码和库文件进行链接)与加载器得到目标机器代码。
编译的步骤
词法分析,语法分析,语言分析,中间代码生成,机器无关代码优化,目标代码生成,机器相关代码的生成。
1.1 词法分析
将所有的词素都都用次法单元(token)作为输出
token:<token-name,attribute-value> (<种别码,属性值>)
标识符采用多词一码,其他类别的类型,如单词类型,关键字,常量,运算符,界限符等都采用一词一码或一型一码
例:
代码:position=inital+rate*60
position | <id,1> |
---|---|
= | <=> |
inital | <id,2> |
+ | <+> |
rate | <id,3> |
* | <*> |
60 | <60> |
得:<id,1><=><id,2><+><id,3><*><60>
1.2 语法分析
用词法分析生成的词汇单元创建语法树
1.3 语义分析
使用语法树和符号表中的信息来检查源程序是否和语言定义的语义一致,同时也手机属性信息供生成中间代码使用
1.4 中间代码生成
中间代码应选择易于生成,并且能被轻松翻译为目标机器上的语言,常用表示为三地址代码。
三地址代码:由类型汇编语言的指令序列组成,每个地址最多三个操作数,有些三地址指令运算分量少于三个。
1.5 代码优化与目标代码生成
主要进行的工作是自动识别并删除重复冗余运算,将高代价运算换低代价运算等等,目的是希望程序运行加快,暂用空间减少。
目标代码生成的重要任务是为程序使用的变量合理分配寄存器。