Компилятор
June 2, 2023 · View on GitHub
Исходный код компилятора TypeScript находится в папке src/compiler.
Он разделен на следующие ключевые части:
- Scanner (
scanner.ts) - Parser (
parser.ts) - Binder (
binder.ts) - Checker (
checker.ts) - Emitter (
emitter.ts)
Каждый из них получает свои уникальные файлы в исходном коде.. Эти части будут объяснены позже в этой главе.
BYOTS
У нас есть проект Bring Your Own TypeScript (BYOTS), который упрощает работу с API компилятора например раскрывая внутренние API. Вы можете использовать его в вашем локальном приложении для доступа к глобальной версии TypeScript
Синтаксис против семантики
Просто потому, что что-то синтаксически правильно, не означает, что это семантически правильно. CРассмотрим следующий фрагмент кода TypeScript, который хотя и синтаксически корректен, но семантически неверен.
var foo: number = "not a number";
Semantic означает «смысл» на английском языке. Эту концепцию полезно иметь в голове.
Processing Overview
Ниже приводится краткий обзор того, как составляются эти ключевые части компилятора TypeScript:
SourceCode ~~ scanner ~~> Token Stream
Token Stream ~~ parser ~~> AST
AST ~~ binder ~~> Symbols
Символ это основной строительный блок семантической системы TypeScript. Как показано символы создаются в результате связывания. Символы соединяют узлы объявлений в AST с другими объявлениями, относящимися к тому же объекту.
Символы + AST — это то, что используется программой проверки для семантической проверки исходного кода.
AST + Symbols ~~ checker ~~> Type Validation
Наконец, когда запрашивается вывод JS:
AST + Checker ~~ emitter ~~> JS
В компиляторе TypeScript есть несколько дополнительных файлов, которые предоставляют утилиты для многих из этих ключевых частей, которые мы рассмотрим далее.
Файл: Утилита
core.ts : основные утилиты используемые компилятором в TypeScript. Несколько важных:
let objectAllocator: ObjectAllocator: это переменная обьявленная как одноэлементная глобальная. Он предоставляет определения дляgetNodeConstructor(Узлы рассматриваются, когда мы смотрим наparser/AST),getSymbolConstructor(Символы обернуты вbinder),getTypeConstructor(Типы описаны вchecker),getSignatureConstructor(Signatures — это индекс, вызов и построение signatures).
Файл: Ключевые структуры данных
types.ts содержит ключевые структуры данных и интерфейсы, используемые компилятором. Вот выборка из нескольких ключевых:
SyntaxKindТип узла AST определяется перечислениемSyntaxKind.TypeCheckerЭто интерфейс, предоставляемый TypeChecker.CompilerHostЭто используетсяProgramдля взаимодействия сSystem.NodeУзел AST.
Файл: Система
system.ts. Все взаимодействие компилятора TypeScript с операционной системой происходит через System интерфейс.И интерфейс, и его реализации (WScript и Node) определеныsystem.ts. Вы можете думать об этом как об Операционной Среде (OС).
Теперь, когда у вас есть обзор основных файлов, мы можем рассмотреть концепцию Program.