菜单

编译器核心

相关源文件

编译器核心是 TypeScript 编译器中的核心系统,负责将 TypeScript 源代码转换为 JavaScript 输出并执行类型检查。它构成了整个编译过程的基础,从解析源代码到发出最终输出。有关类型检查的具体信息,请参阅 类型检查器,有关转换过程的信息,请参阅 转换管道

编译器核心概述

TypeScript 编译器核心为处理 TypeScript 源文件提供了必要的框架。它管理整个编译管道,协调从源代码到输出文件的流程。核心负责:

  1. 将源代码解析为抽象语法树(AST)
  2. 将标识符绑定到其声明
  3. 设置类型检查框架
  4. 管理转换管道
  5. 发出 JavaScript 输出和声明文件

来源: src/compiler/program.ts327-479 src/compiler/types.ts256-1193

核心组件

程序

Program是编译器的主要入口点。它代表了一个由源文件和编译器选项组成的完整 TypeScript 程序。Program 负责:

  • 创建和维护源文件
  • 管理编译器选项
  • 创建 TypeChecker 实例
  • 协调编译过程
  • 管理模块解析和类型定义文件
  • 提供有关程序的诊断信息

createProgram函数是创建Program实例的主要工厂方法。它接受源文件名、编译器选项和一个可选的编译器主机。

来源: src/compiler/program.ts327-479 src/compiler/program.ts1410-1530

CompilerHost

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

Scanner(分词器)是编译过程的第一个阶段。它负责:

  • 将源代码分解为 token
  • 识别关键字、标识符、运算符等
  • 处理空格和注释
  • 提供 token 的位置信息

来源: src/compiler/scanner.ts39-47 src/compiler/scanner.ts1200-1300

解析器

Parser 接收 Scanner 提供的 token,并构建抽象语法树(AST)。它负责:

  • 语法规则和语法验证
  • 创建 AST 节点
  • 语法错误的报告
  • JSDoc 注释解析
  • 声明式声明

Parser 主要在 parser.ts 中实现,并创建代表程序结构的 Node 对象树。

来源: src/compiler/parser.ts400-450 src/compiler/parser.ts500-600

Binder

Binder 负责:

  • 创建符号表
  • 将标识符引用解析到其声明
  • 设置作用域和环境
  • 处理模块导入和导出
  • 为类型检查准备 AST

Binder 通过符号创建程序不同部分之间的连接。

来源: src/compiler/binder.ts60-100 src/compiler/binder.ts400-500

类型检查器

TypeChecker 对绑定后的 AST 进行语义分析:

  • 推断和检查类型
  • 验证类型兼容性
  • 实现类型系统规则
  • 为工具提供类型信息
  • 生成语义诊断

更多详情,请参阅 类型检查器 页面。

来源: src/compiler/checker.ts1000-1200

转换管道

转换管道应用一系列转换,将 TypeScript 特定的语法转换为 JavaScript:

  • 转换 TypeScript 特定的结构(接口、类型等)
  • 将较新的 ECMAScript 功能转换为旧版本
  • 处理模块系统
  • 优化生成的代码

更多详情,请参阅 转换管道 页面。

来源: src/compiler/transformers/ts.ts1-20 src/compiler/transformers/module/module.ts1-20

Emitter

Emitter 生成最终的输出文件:

  • JavaScript (.js) 文件
  • 声明 (.d.ts) 文件
  • 源映射 (.js.map) 文件
  • 构建信息 (.tsbuildinfo) 文件

它负责处理格式化、注释以及原始 TypeScript 代码和生成的 JavaScript 之间的源映射。

来源: src/compiler/emitter.ts400-500 src/compiler/emitter.ts600-700

关键数据结构

Node & SyntaxKind

AST 由 Node 对象组成,每个对象都有一个特定的 SyntaxKind。SyntaxKind 枚举定义了 TypeScript AST 中所有可能的节点类型。

SyntaxKind 枚举包含 300 多个不同的节点类型,代表从基本标记到复杂语句和声明的各种内容。

来源: src/compiler/types.ts40-490 src/services/services.ts363-494

Symbol & SymbolTable

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

编译器提供了一个可编程 API,用于集成到其他工具中

来源: src/compiler/program.ts1410-1470

与其他系统的关系

编译器核心与 TypeScript 代码库中的多个其他系统进行交互

来源: First diagram in the provided material

作为 TypeScript 编译的基础层,编译器核心在保持性能和可扩展性的同时,实现了语言的所有高级功能。