* 编译程序做的工作是把一种语言翻译成另一种语言。

  个人认为，编译器面对的是两个事：**语言**和**自动机**。编译原理讲解的也是两个事：**设计**语言和**实现**自动机。**词法分析**讲解的是设计正则语言和有限自动机。**语法分析**讲解的是设计上下文无关语言和下推自动机。 **语法制导**和**中间代码生成**讲解的也是设计上下文无关方法和下推自动机。上下文无关语言从结构上看应该是树形结构，所以用在语法分析阶段用来推导抽象语法树，在中间代码阶段生成中间代码。正则语言从结构上看是线性结构，所以在词法分析阶段用来分析同样是线性结构的源代码。

* 编译过程分为分析和综合两个阶段。

  分析就是把线性结构转换成非线性结构，结构上变复杂了，但对于处理复杂性来说反而变简单了。综合就是把非线性结构再转换成线性结构。对应到编译程序，前端(Front End)完成的是分析的工作，后端(Back End)完成的是综合的工作。中端(Middle End)完成的是中间代码的生成与优化，即有分析也有综合。

* 源代码的七十二变。

  源代码刚开始是字符流，经过**词法分析**变成了单词流，经过**语法分析**变成了抽象语法树，经过**语义分析**变成了中间代码，中间代码经过**中间代码的生成与优化**变成了另一种中间代码，经过**目标代码生成**变成目标代码，目标代码还可以进行**目标代码优化**变成优化的目标代码。

* 符号表和错误处理

  1. 符号表管理和错误处理遍布于编译的整个过程
  2. 符号表看起来就是抽象语法树上添加了属性，每个结点都是一个符号表。
  3. 错误处理要报告出错信息，而且期望能报告尽可能多的错误，而不是在找到一处错误就停止。

* 抽象语法树

  源代码的逻辑结构是树形结构，把这个树形结构表示出来就是抽象语法树。

* 形形色色的编译程序

  我更喜欢把它们都叫做编译程序，因为它们都完成的是把一种语言翻译成另一种语言的工作。它们是：解释器(Interpreter)，预处理程序(Preprocessor)，编译器(Compiler)，汇编器(Assembler)，装入和链接程序(Loader and Linker)，调试程序(Debugger)。