TypeScript Compiler Internals

Last updated 2 months ago

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のバージョンをグローバルに公開することができます。

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

文法(シンタックス)が正しいものが意味(セマンティクス)が正しいことを意味するわけではありません。以下の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ノードタイプは、SyntaxKindenumによって識別されます。

  • TypeChecker

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

  • CompilerHost

    これはProgramSystemと対話するために使用されます。

  • Node

    ASTのノードです。

File: System

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

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