AST
1、词法分析:将源代码转换成单词流,称为词法单元,每个词法单元包含一个标识符和属性值,比如变量名、数字、操作符等
2、语法分析,将词法单元流转换成抽像语法树,会产生ast,标记所构成的数据结构,表示源代码的结构和规则。
3、语义分析:在AST上执行类型检查,作用域检查等操作,以确保代码的正确性和安全性
4、代码生成:基于AST生成目标代码,包括优化代码结构、生成代码文本、进行代码压缩。
**下面是一个简单的JavaScript编译器示例代码: **
lexer
是词法分析器,将源代码转换成词法单元流;
parser
是语法分析器,将词法单元流转换成抽象语法树;
semanticAnalysis
是语义分析器,对抽象语法树进行语义分析;
codeGeneration
是代码生成器,将分析后的AST生成目标代码。
Babel
babel是一个流行的JavaScript编译器
babel包含以下几个核心内容:
- @babel/core
- @babel/parser
- @babel/traverse
- @babel/generate
- 辅助相关,type polyfill temple等
babel的预设babel-preset-env
babel除了转译code,还可以处理polyfill
babel的工作过程
- 解析(
Parsing
):首先,Babel
解析源代码(babel-parser
)并构建成抽象语法树(AST
) - 转换(
Transformation
):将转换后的AST运用指定的规则和插件修改代码(plugins/presets
) - 生成(
Generation
)最后修改后的AST生成目标代码(babel-generator -> sourcemap
)