# typeScript 编译原理
# 版本
version 4.1.3
1.77GB 就尼玛离谱
# src目录结构
├── bin 最终给用户用的 tsc 和 tsserver 命令
├── doc 语言规范文档
├── lib 系统标准库
├── loc 错误文案翻译
├── scripts 开发项目时的一些工具脚本
├── src 源码
│ ├── compiler 编译器源码
│ └── services 语言服务,主要为 VSCode 使用,比如查找定义之类的功能
└── tests 测试文件
# 编译器
TypeScript 编译器源文件位于 src/compiler 目录下
重点文件
├── core.ts
├── sys.ts
├── types.ts
├── scanner.ts
├── parser.ts
├── utilities.ts
├── utilitiesPublic.ts
├── binder.ts
├── checker.ts
├── transformer.ts
├── transformers/
├── emitter.ts
└── program.ts
# 核心部分的架构
- 编译器
- 工具
- 工具函数 core.ts
- 文件操作 sys.ts
- 内部工具 utilities.ts
- 语法解析
- 词法分析(扫描器) scanner.ts
- 语法分析(解析器) parser.ts
- 语意分析
- 作用域分析(绑定器) binder.ts
- 类型检查(检查器) checker.ts
- 优化生成
- 代码转换 transformer.ts
- 最后生成(发射器) emitter.ts
# 流程概览
SourceCode(源码) ~~ 扫描器 ~~> Token 流
Token 流 ~~ 解析器 ~~> AST(抽象语法树)
AST ~~ 绑定器 ~~> Symbols(符号)
符号(Symbol)是 TypeScript 语义系统的主要构造块 符号是绑定的结果 符号将 AST 中的声明节点与相同实体的其他声明相连
符号和ast是检查器用来验证源代码语义
AST + 符号 ~~ 检查器 ~~> 类型验证
ast和检查器是发射器用来输出js
AST + 检查器 ~~ 发射器 ~~> JavaScript 代码