一、编译、解释程序【回顾】
目的:高级程序设计语言(汇编语言、高级语言)—【翻译】—>机器语言
1-1、编译方式
将高级语言书写的源程序——>目标程序(汇编语言、机器语言)
包含的工作阶段:词法分析、语法分析、语义分析、中间代码生成(可省)、代码优化(可省)、目标代码生成。
词法分析、语法分析、语义分析、目标代码生成
1-2、解释方式
包含的工作阶段:词法分析、语法分析、语义分析。
【注意】:
编译器、解释器都不可省略词法分析、语法分析、语义分析!!!且顺序不可交换!!!
1-3、真题
真题1:
真题2:
真题3:
真题4:
二、符号表
2-1、符号表的作用
不断收集、记录和使用源程序中一些相关符号的类型和特征等信息,并将其存入符号表中。
记录源程序中各个字符的必要信息,以辅助语义的正确性检查和代码生成。
2-2、真题
真题1:
真题2:
真题3:
真题4:
三、编译器的工作阶段
3-1、词法分析 (考的较少)
编译器的工作阶段,第一阶段
输入:源程序
输出:记号流
词法分析过程,依据的是语言的词法规则。把源程序看做一个字符串进行分析。
任务:对源程序从前到后(从左到右)逐个字符地扫描,从中识别出一个个“单词”符号。
示例:
词法分析阶段的主要作用是,分析构成程序的字符及由字符按照构造规则构成的符号是否符合程序语言的规定。
3-2、语法分析
输入:记号流
输出:语法树(分析树)
作用:确定整个输入串是否构成一个语法上的正确的程序。
可以发现程序中的所有语法错误。
如:括号不匹配,结尾缺少分号......
词法分析、语法分析,本质上都是对源程序的结构进行分析。
3-3、语义分析
输入: 语法树(分析树)
作用:进行类型分析和检查。可以发现静态语义错误。
静态语义错误:
在运行之前就能发现的错误。
如:整数取余运算,只能对整型数据进行运算,若其运算对象中有浮点数,就认为是类型不匹配的错误。
不能发现动态语义错误,动态语义错误,运行时才能发现!!!
所以,语义分析阶段,不能发现程序中的所有语义错误。
3-4、目标代码生成阶段(了解)
生成编译器工作的最后一个阶段。
任务:把中间代码变换成特定机器上的绝对指令代码。这个阶段的工作与具体的机器密切相关。
寄存器的分配工作处于目标代码的生成阶段。
3-5、真题
真题1:
真题2:
真题3:
真题4:
真题5:
真题6:
真题7:
真题8:
真题9:
真题10:
词法分析:扫描字符,识别单词
真题11:
真题12:
3-6、中间代码的生成
中间代码的共同特征:与具体的机器无关。
可以将不同的高级程序语言翻译成同一种中间代码。
中间代码可以跨平台。
因为中间代码与具体的机器无关,所以,使用中间代码有利于进行与机器无关的优化处理和提高变异程序的可移植性。
3-6-1、常见的中间代码:
- 后缀式
- 三地址码
- 三元式
- 四元式
- 树、图
3-6-2、真题
真题1:
真题2:
真题3:
真题4:
真题5:
真题6:
四、动态的语义错误
语义分析只能检测出程序的静态语义错误,不能检测出动态的语义错误。
动态的语义错误要到程序运行时才能检测出来。
比如:
除数为0.
循环条件错误导致死循环。
4-1、真题
真题1:
真题2:
语义错误:
- 静态语义错误(语义分析阶段检测出来)
- 动态语义错误
编译阶段:检测所有的语法错误。
真题3:
真题4:
真题5: