第1周-编译原理-3月6日

编译程序

一言以蔽之,源代码进,目标代码出。

  1. 前端:第一阶段源代码进,语法树出(分析源代码的语法结构,并且用一棵语法树表达出来)
  2. 后端:第二阶段为综合,包括中间代码生成和目标代码生成(语法树进,目标代码出;根据这棵语法树,产生目标代码

  • 前端
  1. 词法分析(识别出源代码中的一个一个的 token)
    词法分析的工具是正则表达式有限状态自动机。利用它们
    来匹配源代码串中的每个部分,把源代码串切成一小段一小
    段,每小段视作一个独立意义的词法单元,称为一个token.
    每个token是个二元组,由单词和语义值二部分组成。
    (把源代码想成一句英语句子,识别出一个句子中每一个英文字母,组成英文单词[token] 并弄清楚每个英文单词的意思)

    Ps:词法分析是从左到右吗?是的。
  2. 语法分析
    语法分析的工具是上下文无关文法。利用上下文无关文法把
    从词法分析得到的一个个token做成语法树。具体的产生语法
    树的方法有多种,但是大体上分为两类:自顶向下和自底向
    上产生语法树。大多数方法产生的语法解析树中有多余的信
    息,需要进一步做成抽象语法树(Abstract Syntax Tree,简称
    为AST),以方便后续动作。
    (把一串 token 的语法结构理清楚,然后把理清楚的语法结构用一颗语法树表达出来)

    Ps:优先级如何计算:按照加减乘除的优先级运算
  3. 语义分析(遍历这棵语法树,借助我们保存源代码符号表,检查这棵语法树,是否有语义)
    语法树有了,但还不知道它是否合语义,就把它交给语义分
    析。进行例如类型检查变量声明检查等。检查方法是借助
    符号表来遍历该语法树,如果发现了错误,准确详细地报告
    错误信息,以帮助程序员改正。
    (板凳爬上墙-很明显无语意;壁虎爬上墙-有语意)
  • 后端
  1. 中间代码生成(把任何语言翻译成中间代码,根据目标CPU的不同,再把中间代码翻译成目标语言[可以交叉编译])
    通过了语义分析,程序在形式,上是确保没错了,那就进行中
    间代码生成,以便下一-步方便地生成目标代码。之所以要做
    这一步,是为了减少翻译的工作量。假设源代码语言有x种,
    目标代码语言有y种,如果直接从源代码生成目标代码,就需
    要编写x*y种算法来完成这个直接的翻译工作;而先转为统一
    的中间代码后,需要编写的算法数量为x+y种。生成中间代码
    的方法还是遍历语法树,为语法树的各个节点指定产生规则
    以使在遍历到各个节点时根据指定的产生规则生成正确的
    代码。
  2. 目标代码生成器
THE END