typeScript 的源码学习笔记

167 阅读2分钟

编译器主要分了三条线路:

  • 源代码 -> 扫描器 -> token流 -> 解析器 -> AST ->绑定器 -> Symbol(符号)
  • AST -> 检查器 ~~ Symbol(符号) -> 类型检查
  • AST -> 检查器 ~~ 发射器 -> js代码

一、扫描器 (scanner.ts)

扫描流程分析

二、解析器 (parser.ts)

解析流程分析

三、绑定器 (binder.ts)

绑定流程分析

四、检查器 (checker.ts)

检查流程分析

五、发射器 (emitter.ts)

发射流程分析

小结

typeScript 编译器的主要工作流程如下:

词法分析:词法分析器(Lexer)将源码分解为一系列词法单元,称为令牌(Token)。词法分析器使用正则表达式和有限状态机来识别不同类型的令牌,如关键字、标识符、运算符和分隔符等。

语法分析:语法分析器(Parser)根据语法规则解析令牌序列,构建抽象语法树(AST)。语法分析器使用语法规则定义的产生式来逐步解析令牌,生成 AST。语法分析器通常使用递归下降或者LR分析等算法。

语义分析:语义分析阶段对生成的 AST 进行进一步的处理和分析。这一阶段主要包括类型检查、作用域分析、符号解析等。类型检查阶段通过类型推断和类型检查规则验证代码的类型正确性。作用域分析阶段确定标识符的可见范围和解析顺序。符号解析阶段建立符号表,用于跟踪变量、函数和类型的定义和引用。

转换与优化:在 AST 上进行转换和优化的过程。转换包括将高级语言特性转换为等效的低级语法表示,如箭头函数转换为普通函数等。优化阶段可以包括消除冗余代码、常量折叠、内联函数等优化操作,以提升代码执行效率和性能。

代码生成:代码生成阶段将经过转换和优化后的 AST 转换为目标代码。这一过程可以包括将 AST 转换为中间表示(IR),然后根据中间表示生成目标代码。代码生成阶段需要考虑目标平台的特定约束和规则,生成对应平台可执行的代码。

输出:最后一步是将生成的目标代码输出到相应的目标,例如输出为文件、命令行输出或者直接运行在浏览器中等。