-
前端:编译器对程序代码的分析和理解过程,跟语言的语法有关,跟目标机器无关
-
词法分析(Lexical Analysis):识别词法记号(Token),基于正则文法(Regular Grammar)。工具读入正则表达式,输出有限自动机(Finite-state Automaton,FSA,or Finite Automaton)
- 可手写规则(如 GNU 的 C 编译器)
- 也可用词法分析器生成工具(如 Lex/Flex)
-
语法分析 (Syntactic Analysis / Parsing):识别程序语法结构,构造抽象语法树(Abstract Syntax Tree)
可以参考 JointJS 提供的可视化 JavaScript AST demo。
执行脚本语言的过程,就是遍历 AST 的过程(此处遍历通常是后序遍历,左->右->根)。
AST 构造完成后,会标记一些属性,例如源代码的行号。- 如何构造 AST:
- 手写递归下降算法(Recursive Descent Parsing)
- 使用工具:Yacc、Antlr、JavaCC
- 如何构造 AST:
-
语义分析(Semantic Analysis):根据语义规则进行分析判断,上下文分析、消除歧义
语义分析的部分结果,会标记在 AST 上,例如 int 等数据类型
-
-
后端:生成目标代码,跟目标机器有关
- 生成目标代码
- 对代码进行优化