目录
一、编译、解释与翻译阶段
-
编译方式
词法分析、语法分析、语义分析、中间代码生成、代码优化、目标生成。
-
解释方式
词法分析、语法分析、语义分析。
编译器和解释器都不可省略:词法分析、语法分析、语义分析。且顺序不可交换,即词法分析、语法分析、语义分析是必须的。即编译器方式可以在词法分析,语法分析,语义分析后生成目标代码。
-
符号表
- 不断收集、记录和使用源程序中一些相关符号的类型和特征等信息,并将其存入符号表中。
- 记录源程序中各个字符的必要信息,以辅助语义的正确性,检查和代码生成。
- 对可执行语句,则是翻译成中间代码或目标代码。
二、编译过程
-
词法分析:
输入:源程序;输出:记号流。
词法分析阶段的主要作用是分析构成程序的字符及由字符按照构造规则构成的符号是否符合程序语言的规定。
-
语法分析
输入:记号流;输出:语法树(分析树)。
语法分析阶段主要作用:对各条语句的结构进行合法性分析,分析程序中的句子结构(有无定义;括号是否成对)是否正确。(语法错误)
-
语义分析(语法树、分析树)
(检查运算能否成功、类型是否匹配)
语义分析阶段的主要作用是进行类型分析和检查,语义分析阶段可以发现程序中得所有语法错误。不能发现所有的语义错误;可以发现静态语义错误,不能发现动态语义错误,动态语义错误运行时才能发现。
-
目标代码生成
目标代码生成阶段的工作与具体的机器密切相关;寄存器的分配工作处于目标代码生成阶段。
-
中间代码生成
常见的中间代码:后缀式,三地址码,三元式,四元式,树(图)。
中间代码与具体的机器无关,(不依赖具体机器),可以将不同的高级程序语言翻译成一种中间代码,中间代码可以跨平台。
因为与具体机器无关,使用中间代码有利于进行与机器无关的优化处理和提高编译程序的可移植性。
三、正规集与正规式
A | b (字符串 A、b构成的集合,二选一)。
A*(*闭包,类似于幂,可由0或者多个构成)。
eg:
( A*b)*:A闭包;(A*b)闭包。
正规集可以用于正规式描述,用有限自动机表示。
四、小知识点
-
动态语义错误
语义分析只能检测出程序的静态语义错误,不能检测出动态的语义错误,要到程序运行时才能检测出来。(语义分析无法检测所有的语义错误!)