陈斌彬的技术博客

Stay foolish,stay hungry

编译原理

编译和翻译

计算机不能直接理解 高级语言 ,只能直接理解 机器语言 ,所以必须要把高级语言“翻译”成机器语言,计算机才能执行高级语言编写的程序。

我们可以粗略地把编程语言分为两类: 编译型语言 和 解释型语言(常用的C/C++,Pascal和最近流行的Go语言都是编译型语言,而Python、Ruby等则是解释型语言) 。

对于它们的“翻译”,则分别称之为“编译”和“解释”。 img 解释:解释型语言在程序运行时有一个专门的解释器,将代码翻译为机器语言,一边翻译一边执行。

编译:而编译型语言写的程序,在执行之前都必须有一个“编译”的过程,将源码编译为机器语言的文件(比如windows下的exe文件),运行的时候直接运行编译后的文件。

编译步骤

img

1、词法分析

编译器将源码看作一个很长的字符串,首先对它进行从左到右的扫描,然后对其做初步分析,识别出代码中的单词(称作Token),分为基本字、标识符、常数、运算符和界符等,方便编译的后续步骤。

在该过程中如果发现不符合词法规则的token,将做出错处理。

2、语法分析

语法分析是对词法分析得到的单词流,按语法规则做进一步的分析,识别出语法单位,如表达式、短语、子句、句子和程序等,从而形成一颗“语法树”。

在该过程中如果发现不符合语法规则的单词流,将做出错处理。

3、语义分析

经过词法分析和语法分析,程序如果没有错误,就可以按照语义要求对其进行“翻译”,形成被称为“四元式”的中间代码。

4、优化

语义分析生成的中间代码不依赖于实际的硬件,便于优化和移植,针对实际状况做一些等效变换,使程序占用内存更小,执行更快。

5、目标代码生成

根据优化后的中间代码,可生成有效的目标代码。而通常编译器将其翻译为汇编代码,此时还需要将汇编代码经汇编器汇编为目标机器的机器语言。

6、出错处理

编译的各个阶段都有可能发现源码中的错误,尤其是语法分析阶段可能会发现大量的错误,因此编译器需要做出错处理,报告错误类型及错误位置等信息。