这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
编译的概念
编译的过程就是 把某种语言的源程序,在不改变语义的条件下,转换成另一种语言程序即目标语言程序。
- 如果源代码编译后要在操作系统上运行,那目标代码就是汇编/机器代码。
- 如果编译后是在虚拟机里执行,那目标代码就可以不是汇编代码,而是一种解释器可以理解的中间形式的代码即可。
编译型语言就是提前把代码一次性转换完毕的语言,用的转换工具叫编译器,编译型语言如C、C++、Go。这些语言编写的程序一次编译可重复执行。但是编译后生成的目标文件不能跨平台,因为不同系统对可执行文件的要求不同。 而有些语言可以边执行边转化,用到哪就转化到哪,这种就是解释型语言,使用到的转化工具称为虚拟机或解释器,如python。
词法分析
词法分析就是把源代码字符串转换为词法单元(Token)的这个过程。 在词法分析的过程中会使用到了一个工具,就是确定的有限自动机DFA。 DFA是一个状态机,它的状态数量是有限的。该状态机在任何一个状态,基于输入的字符,都能做一个确定的状态转换。
语法分析
- 词法分析是识别一个个的单词,而语法分析就是在词法分析的基础上识别出程序的语法结构。这个结构是一个树状结构。这棵树叫做抽象语法树(AST)。树的每个节点或子树是一个语法单元,这个单元的构成规则叫"语法"。每个节点还可以有下级节点。
- 巴科斯范式(BNF)是描述上下文无关理论的一种具体方法,通过BNF可以实现上下文无关文法的具体化、公式化、科学化,是实现代码解析的必要条件。BNF本质上是树形分解,分解成一颗抽象语法树。
- 递归下降算法的基本思路是按照语法规则去匹配 Token 串。