computer_knowledge_notes/Compiling-Principle/lecture1.md

2.4 KiB

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

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

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

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

  • 源代码的七十二变。

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

  • 符号表和错误处理

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

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

  • 形形色色的编译程序

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