编译器核心是 TypeScript 编译器中的核心系统,负责将 TypeScript 源代码转换为 JavaScript 输出并执行类型检查。它构成了整个编译过程的基础,从解析源代码到发出最终输出。有关类型检查的具体信息,请参阅 类型检查器,有关转换过程的信息,请参阅 转换管道。
TypeScript 编译器核心为处理 TypeScript 源文件提供了必要的框架。它管理整个编译管道,协调从源代码到输出文件的流程。核心负责:
来源: src/compiler/program.ts327-479 src/compiler/types.ts256-1193
Program是编译器的主要入口点。它代表了一个由源文件和编译器选项组成的完整 TypeScript 程序。Program 负责:
createProgram函数是创建Program实例的主要工厂方法。它接受源文件名、编译器选项和一个可选的编译器主机。
来源: src/compiler/program.ts327-479 src/compiler/program.ts1410-1530
CompilerHost在编译器和环境之间提供了一个抽象层。它负责文件系统操作和环境特定的功能:
通过调整主机实现,这种抽象允许编译器在不同的环境(Node.js、浏览器等)中工作。
来源: src/compiler/program.ts1410-1470 src/compiler/types.ts3115-3140
TypeScript 编译过程遵循管道架构,源代码流经各个阶段:
来源: src/compiler/parser.ts400-450 src/compiler/scanner.ts38-50 src/compiler/binder.ts60-100 src/compiler/checker.ts1000-1200 src/compiler/emitter.ts400-500
Scanner(分词器)是编译过程的第一个阶段。它负责:
来源: src/compiler/scanner.ts39-47 src/compiler/scanner.ts1200-1300
Parser 接收 Scanner 提供的 token,并构建抽象语法树(AST)。它负责:
Parser 主要在 parser.ts 中实现,并创建代表程序结构的 Node 对象树。
来源: src/compiler/parser.ts400-450 src/compiler/parser.ts500-600
Binder 负责:
Binder 通过符号创建程序不同部分之间的连接。
来源: src/compiler/binder.ts60-100 src/compiler/binder.ts400-500
TypeChecker 对绑定后的 AST 进行语义分析:
更多详情,请参阅 类型检查器 页面。
来源: src/compiler/checker.ts1000-1200
转换管道应用一系列转换,将 TypeScript 特定的语法转换为 JavaScript:
更多详情,请参阅 转换管道 页面。
来源: src/compiler/transformers/ts.ts1-20 src/compiler/transformers/module/module.ts1-20
Emitter 生成最终的输出文件:
它负责处理格式化、注释以及原始 TypeScript 代码和生成的 JavaScript 之间的源映射。
来源: src/compiler/emitter.ts400-500 src/compiler/emitter.ts600-700
AST 由 Node 对象组成,每个对象都有一个特定的 SyntaxKind。SyntaxKind 枚举定义了 TypeScript AST 中所有可能的节点类型。
SyntaxKind 枚举包含 300 多个不同的节点类型,代表从基本标记到复杂语句和声明的各种内容。
来源: src/compiler/types.ts40-490 src/services/services.ts363-494
Symbols 代表 TypeScript 中的命名实体,并将声明与其用法关联起来
符号表将名称映射到符号,并在绑定和类型检查期间用于名称解析。
来源: src/services/services.ts655-795 src/compiler/core.ts638-646
类型系统建立在 Type 接口之上,具有各种专门的实现
| 类型类别 | 描述 | 示例 |
|---|---|---|
| 基本类型 | 基本内置类型 | string, number, boolean |
| 对象类型 | 带属性的类型 | 对象字面量、类、接口 |
| 联合类型 | 表示多种可能性的类型 | string | number |
| 交叉类型 | 组合多种类型的类型 | T & U |
| 类型参数 | 泛型类型变量 | Array<T> 中的 T |
| 索引类型 | 索引访问的类型 | keyof T, T[K] |
| 条件类型 | 基于条件的类型 | T extends U ? X : Y |
来源: src/compiler/types.ts1000-1100 src/compiler/checker.ts1000-1200
CompilerOptions 接口定义了编译器的可配置方面
这些选项可以通过 tsconfig.json 文件或以编程方式提供。
来源: src/compiler/commandLineParser.ts127-140 src/compiler/types.ts5770-6100
编译器核心提供了几个扩展和自定义的入口点
自定义转换器可以注入到转换管道中以修改 AST
来源: src/compiler/types.ts5590-5600
编译器可以通过语言服务插件进行扩展,这些插件为编辑器和 IDE 添加功能。
来源: src/services/types.ts72-90
编译器提供了一个可编程 API,用于集成到其他工具中
来源: src/compiler/program.ts1410-1470
编译器核心与 TypeScript 代码库中的多个其他系统进行交互
来源: First diagram in the provided material
作为 TypeScript 编译的基础层,编译器核心在保持性能和可扩展性的同时,实现了语言的所有高级功能。