一.什么是编译
编译就是把高级语言(源语言)翻译成汇编语言或者机器语言(目标语言)的过程。
二.编译器的结构
人工翻译:
一个英文句子想要翻译成中文,首先你要知道该句子的意思,而要知道该句子的意思,就要分析源语言。得到句子的意思,亦即系中间状态,即可根据这个意思翻译成中文。
过程说明:
要得到句子的意思,
我们首先要知道句子的结构:
一个句子的核心在于谓语动词,知道了谓语动词,就等于知道了句子的一半意思。
知道了谓语动词,我们就会想知道动作的施事者和受事者,就是知道做了什么,然后就想知道时间地点人物,最后就能知道这个句子的大概意思,而这过程就叫做语义分析。
要想得到语义,前一步要做的就是要进行语法分析,分析出句子的各个成分,识别出主谓宾。
到了语义分析的时候,就根据先前分析的主谓宾等句子结构,得到句子的意思。
要得到句子的各个成分,首先要做的是识别各个单词的词性,这个过程叫做词法分析,根据各个单词的词性,可以得出各种拼接起来的短语,即名词短语、动词短语、介词短语,为语法分析做铺垫。
归纳一下:
要想得到句子的中间状态,即意思
第一步,词法分析,得到各个单词的词性,名词、动词、冠词、介词
第二部,语法分析,根据词法分析的结果,把各个单词组合起来,得到各种名词短语、动词 短语、介词短语
第三部,语义分析,分析从语法分析得到的各个短语,得到谓语动词,再去分析其他的短语 和谓语动词的关系,得到句子的主谓宾,从而得到句子的意思,即中间状态。
编译器的结构
以上步骤(词法分析->语法分析->语义分析->中间状态),称为编译器的前端,与源语言有关,最终翻译成中间状态,中间状态相当于一座桥梁,可根据不同的机器,生成出对应机器的机器语言。
词法分析
任务:生成出统一的机内表示(token序列)
词法分析就系从左到右逐行扫描程序的字符,识别出各个单词的词性,或者讲系类型。
然后将各个识别出来的单词转成统一的机内码(token序列)表示。
token : <种别码,属性码>
语法分析
任务:得到语法分析树
语法分析器根据词法分析器得到的token序列,识别出各个短语,并构造出语法分析树。
在这里插入图片描述
语义分析
有两种语句,一种是赋值语句,另一种是动作语句
任务:
1.收集标识符的属性信息
2.语义检查
收集标识符的属性信息
通过语法分析得到的语法分析树,识别出标识符的各种属性信息,生成对应的符号表和字符串表。
符号表负责存储标识符的各类属性。
字符串表存储各个标识符。
其中符号表只存储标识符在字符串表的起始位置以及长度,
估计是更换标识符时,只用更改标识符的名字,而不用修改或再次收集其属性
语义检查
语义检测则是负责检查程序的各类语法,看是否符合语法要求。
中间代码生成
中间代码对应于人类语言的中间表示形式,用于最终翻译成各类机器语言
三地址指令和汇编的表示形式类似,第一个操作数相当于谓语动词,而后面几个操作数就相当于句子的主语,宾语,补语,定语。
编译器后端
编译器后端负责将中间表示形式,映射到目标语言。
将代码进行优化,其中优化可以分为
1.对中间形式代码的优化
2.机器代码的优化