> For the complete documentation index, see [llms.txt](https://artfulbits-se.gitbook.io/typescript/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://artfulbits-se.gitbook.io/typescript/overview.md).

# TypeScript Compiler Internals

Вихідні тексти компілятора TypeScript знаходяться в [`src/compiler`](https://github.com/Microsoft/TypeScript/tree/master/src/compiler).

Він складається з наступних ключових частин:

* Сканер (`scanner.ts`)
* Синтаксичний аналізатор (`parser.ts`)
* Біндер (`binder.ts`)
* Чекер (`checker.ts`)
* Випромінювач (`emitter.ts`)

Кожен з них отримує власні унікальні файли у вихідному коді. Ці частини буде описано далі у цій главі.

## Синтаксис vs. Семантика

Просто тому, що щось є *синтаксично* правильним, це не означає, що воно *семантично* правильне. Розгляньте наступний фрагмент коду на TypeScript, який, хоча *синтаксично* дійсний, але *семантично* неправильний.

```ts
var foo: number = "not a number";
```

`Semantic` означає "значення" англійською мовою. Цю концепцію корисно розуміти.

## Огляд обробки даних

Нижче наведено короткий огляд того, як складають ці ключові частини компілятора TypeScript:

```txt
SourceCode ~~ scanner ~~> Token Stream
```

```txt
Token Stream ~~ parser ~~> AST
```

```txt
AST ~~ binder ~~> Symbols
```

`Символ` є основним будівельним блоком *семантичної* системи TypeScript. Як показано, символи створюються в результаті прив'язки. Символи з'єднують вузли оголошення (nodes declaration) в абстрактному синтаксичному дереві (AST) з іншими оголошеннями, які співпрацюють для тієї ж сутності.

Символи + AST використовуються перевірювачем для *семантичної* перевірки вихідного коду.

```txt
AST + Symbols ~~ checker ~~> Type Validation
```

Коли запитується вихідний код JavaScript:

```txt
AST + Checker ~~ emitter ~~> JS
```

У компіляторі TypeScript є декілька додаткових файлів, які надають утиліти для багатьох з цих ключових частин, які ми розглянемо далі.

## Файл: Утиліти

`core.ts` : основні утиліти, що використовуються компілятором TypeScript. Кілька важливих з них:

* `let objectAllocator: ObjectAllocator` : змінна, визначена як глобальна змінна. Вона містить визначення для `getNodeConstructor` (Вузли розглядаються у `parser` / `AST`), `getSymbolConstructor` (символи розглядаються у `binder`), `getTypeConstructor` (типи розглядаються у `checker`), `getSignatureConstructor` (сигнатури - це сигнатури індексів, викликів і конструкцій).

## Файл: Основні структури даних

Файл `types.ts` містить ключові структури даних та інтерфейси, що використовуються у компіляторі. Ось деякі ключові:

* `SyntaxKind` це тип вузла AST визначається зчисленням `SyntaxKind`.
* `TypeChecker` (перевірка типу) - інтерфейс, що надається TypeChecker.
* `CompilerHost` (хост компілятора), використовується `Програмою` для взаємодії з `Системою`.
* `Node` (вузол) - вузол AST.

## Файл: System

`system.ts`. Вся взаємодія компілятора TypeScript з операційною системою відбувається через інтерфейс `System`. Як сам інтерфейс, так і його реалізації (`WScript` та `Node`) визначені у файлі `system.ts`. Ви можете думати про це як про *Операційне середовище* (OE).

Тепер, коли ви ознайомилися з основними файлами, ми можемо розглянути поняття `Program`.
