编译原理概述



 介绍编译和解释基本概念,和编译的基本步骤。

一、编译和解释

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

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

  对于它们的“翻译”,则分别称之为“编译”和“解释”。

                             

         解释:解释型语言在程序运行时有一个专门的解释器,将代码翻译为机器语言,一边翻译一边执行。

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


二、编译步骤

       编译是个相当复杂的过程,我们可以大概将编译过程分为两部分:源代码的分析和目标程序的生产。而为了方便理解编译过程,我们可以按照编译的逻辑过程,一步一步来看:
                                                    

1、词法分析

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

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

2、语法分析

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

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

3、语义分析

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

4、优化

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

5、目标代码生成

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

6、出错处理

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