# TypeScriptコンパイラの内側

TypeScriptコンパイラのソースは、[`src/compiler`](https://github.com/Microsoft/TypeScript/tree/master/src/compiler)フォルダの下にあります。

それは以下の主要な部分に分割されます：

* Scanner(`scanner.ts`)
* Parser(`parser.ts`)
* Binder(`binder.ts`)
* checker(`checker.ts`)
* emitter(`emitter.ts`)

これらのそれぞれは、ソース内で独自のファイルを取得します。これらの部分については、この章の後半で説明します。

## BYOTS

私たちは、[Bring Your Own TypeScript(BYOTS)](https://github.com/basarat/byots)というプロジェクトを持っています。これは内部APIを公開する等によって、コンパイラのAPIを使って遊びやすくしています。あなたはこれを使用して、ローカルアプリケーションのTypeScriptのバージョンをグローバルに公開することができます。

## シンタックスとセマンティクスの違い

*文法*(シンタックス)が正しいものが\_意味\_(セマンティクス)が正しいことを意味するわけではありません。以下のTypeScriptコードを考えてみましょう。文法は有効ですが、意味は間違っています:

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

`Semantic`は英語で「意味」を意味します。このコンセプトが頭の中にあると便利です。

## 処理の概要(Processing Overview)

以下は、TypeScriptコンパイラのこれらの主要部分の構成の概要です。

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

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

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

`Symbol`はTypeScript \_semantic\_システムの主要な建設部材です。示されているように、シンボルはバインディングの結果として作成されます。シンボルは、AST内の宣言ノードを、同じエンティティに寄与する他の宣言に接続します。

Symbols + ASTは、ソースコードの意味(セマンティクス)を検証するためにチェッカーが使用するものです

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

最後にJS出力が要求されたとき：

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

TypeScriptコンパイラには、これらの主要部分にユーティリティを提供するいくつかのファイルがあります。次で説明します。

## File: Utilities

`core.ts`：TypeScriptコンパイラが使うコアユーティリティ。いくつか重要なもの：

* `let objectAllocator: ObjectAllocator`：シングルトンのグローバルとして定義された変数です。それは、`getNodeConstructor`(Nodeは`parser`/`AST`を見るときに扱います)、`getSymbolConstructor`(シンボルは`binder`のときに扱います)、`getTypeConstructor`(型は`checker`で扱います)、 `getSignatureConstructor`(シグネチャはインデックス、シグネチャの呼び出しと構成物です)。

## File： 主要なデータ構造

`types.ts`には、コンパイラ全体で使用される、主要なデータ構造とインターフェースがあります。いくつかの重要なサンプルの抜粋です：

* `SyntaxKind`

  ASTノードタイプは、`SyntaxKind`enumによって識別されます。
* `TypeChecker`

  TypeCheckerが提供するインターフェースです。
* `CompilerHost`

  これは`Program`が`System`と対話するために使用されます。
* `Node`

  ASTのノードです。

## File: System

`system.ts`です。TypeScriptコンパイラとオペレーティングシステムとのすべての対話は、`System`インターフェースを介して行われます。インターフェースとその実装( `WScript`と`Node`)は`system.ts`で定義されています。あなたはそれを\_Operating Environment\_(OE)として考えることができます。

主要なファイルの概要を知ったので、`Program`の概念を見ていきましょう。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://typescript-jp.gitbook.io/deep-dive/overview.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
