编译器概念介绍

  • 编译器与解释器
  • 词法分析器概念
  • 语法分析与语法树概念
  • 语义分析与计算概念

编译器与解释器

编译器与解释器他们之间的区别和联系

编译器解释器
输入整份源码输入单条指令
输出目标语言代码输出指令解释执行后结果
同一份代码只需编译一次每次运行时均需解释
全量检查源码后异常提醒逐行解释后异常提醒
不执行输出代码执行每条指令输出

一个典型的编译过程,他所包含的几个核心步骤:

  1. 词法分析 ,把所有输入的关键字拆分出来,然后把各类关键字的token类型标记。
  2. 语法分析 ,把关键字的数组,解析成为语法树。
  3. 语义计算 ,对树进行遍历,把代码的运行结果求出来。

词法分析器

我们输入一个源代码文本,很长很长的字符串,包含各种缩进、注释等代码。词法分析器通过处理,去除不必要的空白和注释,返回 token 的标记数组。

  • 输入
    • 源码字符串文本
    • 带注释、空白等无关内容
    • var x = 123
  • 输出
    • 有序的 Tokens 数组
    • 去除空白与注释
    • ['var', 'x', '=', '123']

语法分析与语法树

在我们上一部分的词法分析中拿到了一个 tokens 数组,每个元素是一个 token 。这个 token 至少包含两个字段,一个是类型,另一个是内容。很多个这样的token组合在一起就是完整的源码。这个token 的数组,实际上是一个扁平的结构,这个扁平的结构最终会被我们处理成抽象的语法树。

  • 输入
    • Tokens 数组
  • 输出
    • 抽象语法树 AST(Abstract Syntax Tree)

语义分析与计算

  • 输入
    • AST 语法树
  • 输出
    • 目标代码