Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
TypeScript のコンパイル
Search
Jeongmin LEE
September 13, 2025
0
4
TypeScript のコンパイル
Jeongmin LEE
September 13, 2025
Tweet
Share
More Decks by Jeongmin LEE
See All by Jeongmin LEE
【2025年新卒研修】 React・Next.js は何であるのか
gardensky511
0
100
Webレンダリング最適化の道
gardensky511
0
26
Webレンダリング技術の進化と課題
gardensky511
0
71
Promise と async/await
gardensky511
0
42
シングルな Javascript の非同期処理
gardensky511
0
170
集合で理解する Typescript
gardensky511
1
260
Javascript のデータ型 プリミティブ型・オブジェクト
gardensky511
0
160
Featured
See All Featured
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.9k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
Docker and Python
trallard
46
3.6k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3k
Agile that works and the tools we love
rasmusluckow
330
21k
What’s in a name? Adding method to the madness
productmarketing
PRO
23
3.7k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
44
2.5k
Large-scale JavaScript Application Architecture
addyosmani
513
110k
Java REST API Framework Comparison - PWX 2021
mraible
33
8.8k
Typedesign – Prime Four
hannesfritz
42
2.8k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
358
30k
Designing Experiences People Love
moore
142
24k
Transcript
TypeScript のコンパイル
職業 自己紹介 韓国人です。大学時代にはげしくアニメ オタクをやってて日本語が上手くなりま した。 フロントエンドエンジニア(2020/11 ~) React、Typescript メインでやってます
CONTENTS 1. コンピューターの言語、人の言語 2. TypeScript のコンパイル 3. ビルドとランタイムの疎結合 4. TSGO
出るってよ 5. まとめ
1. コンピューターの言語、人の言語
🖥 コンピューターにはコンピューターの言語がある
低水準言語(low-level language) コンピュータが理解しやすいように作られた言語で、一般的に機械語とアセンブリ言語を指す
低水準言語(low-level language) 機械語(machine language) CPU が直接理解し実行することができる命令からなる言語(機械向け、人が読むことは配慮していない) 2進数(昔のエンジニアはこれを書いてた)
低水準言語(low-level language) アセンブリ言語(assembly language) 機械語を多少は人が読めるようにした言語 アセンブリ言語に変換した例 mov(move)、add、ret(return)などの 自然言語が入って機械語よりはちょっとわかる 2進数
人がもっと効率的にプログラミングするために高水準言語が登場
高水準言語(High-level language) 人が理解しやすい自然言語に近づけて作られた言語 C言語の例(偶数と奇数をトータルで10回出力するプログラム)
高水準言語(High-level language) 人が理解しやすい自然言語に近づけて作られた言語 C言語の例(偶数と奇数をトータルで10回出力するプログラム) 高水準言語は読みやすく、操作が簡単 現代はほとんど高水準言語で開発している
高水準言語(High-level language) 人が理解しやすい自然言語に近づけて作られた言語 高水準言語は読みやすく、操作が簡単 現代はほとんど高水準言語で開発している ただプログラムを実行する主体は機械なので、 人が書いた高水準言語を機械がわかるように 低水準言語に翻訳してあげる必要がある C言語の例(偶数と奇数をトータルで10回出力するプログラム)
「高水準言語 → 低水準言語」の翻訳のやり方について
コンパイル(Compile) プログラム全体を翻訳してから実行する方式
コンパイル(Compile) コンパイル方式で翻訳する言語は C/C++、Rust、Go などがある C言語で書いたプログラム コンパイル方式の場合、 実行する前に翻訳(高水準→低水準)する必要がある その翻訳をしてくれるプログラムをコンパイラと言う
コンパイル(Compile) コンパイル方式で翻訳する言語は C/C++、Rust、Go などがある C言語で書いたプログラム コンパイラが翻訳してから実行する
コンパイル(Compile) コンパイル方式で翻訳する言語は C/C++、Rust、Go などがある 実行のタイミングではすべてのコードが 機械語に翻訳済みで、実行速度が速い 実行前にコンパイル必要だから初回実行 まで時間かかる(+ ビルド時間かかる) C言語で書いたプログラム
コンパイラが翻訳してから実行する
インタプリタ(Interpreter) プログラムを実行しながら1行/1ブロックずつ翻訳する方式 コンパイル方式と違って翻訳と実行が同時に行われる
インタプリタ(Interpreter) インタプリタ方式で翻訳する言語は Python、Ruby、PHP などがある Python で書いたプログラム すぐ実行できる インタプリタ方式の場合、 コードを少しずつ翻訳しながら同時に実行もする その翻訳と実行を同時に行うプログラムをインタプリタと言う
インタプリタ(Interpreter) インタプリタ方式で翻訳する言語は Python、Ruby、PHP などがある 実行前の翻訳過程が不要なので、 コードを修正してもすぐ実行できる 実行と翻訳を同時に行われるので、コンパイル 方式と比べたら実行に時間がかかることがある Python で書いたプログラム
すぐ実行できる
2. TypeScript のコンパイル
とりあえず TypeScript を書いてみよう 挨拶を出力するプログラム
コンパイルしてみよう 公式の TypeScript コンパイラー(tsc)でコンパイルする TS ファイルをコンパイル
公式の TypeScript コンパイラー(tsc)でコンパイルする この子の仕事は大きく2つある 「型チェック」 → 「JSへの変換」 コンパイルしてみよう TS ファイルをコンパイル
TypeScript コンパイラー(tsc)の仕事 確認のために型エラー出してみた (1) 型チェック まずはエンジニアが書いたコードに型エラーがないか検査する
TypeScript コンパイラー(tsc)の仕事 (1) 型チェック まずはエンジニアが書いたコードに型エラーがないか検査する 確認のために型エラー出してみた この状態で tsc を実行するとエラーを出力される
TypeScript コンパイラー(tsc)の仕事 (2) JSへの変換 TypeScript ファイルを JavaScript ファイルに変換する
❗大事なことなので2回言う❗ TypeScript コンパイラは、 TypeScript ファイルを JavaScript ファイルに変換する TypeScript コンパイラー(tsc)の仕事 (2)
JSへの変換 TypeScript ファイルを JavaScript ファイルに変換する
TypeScript ファイルを JavaScript ファイルに変換する コンパイル TypeScript コンパイラー(tsc)の仕事 (2) JSへの変換
TypeScript コンパイラー(tsc)の仕事 (2) JSへの変換 TypeScript ファイルを JavaScript ファイルに変換する コンパイル コンパイルって「高水準」→「低水準」が一般的だけど、
TypeScript のコンパイル結果はまだ高水準だよ…?
TypeScript コンパイラー(tsc)の仕事 (2) JSへの変換 TypeScript で言うコンパイルは「型チェック」+「JSへの変換」(高水準 → 低水準ではない) ChatGPT-5 に
TS のコンパイルについて聞くと頑なにトランスパイルって言ってるのが面白い *トランスパイル:プログラミング言語 → 別のプログラミング言語
じゃなんで「コンパイル」って言ってるんですか? TypeScript の公式ドキュメント わかりません。 TypeScript 公式がコンパイルって言ってるのでそうなってる気がします。
コンパイル結果を実行してみよう TS ファイルをコンパイルしたら JS ファイルが生成されたので、それを実行する node.js で実行してみる
JavaScript はインタプリタ言語ですか? 現代の JavaScript はインタプリタ&コンパイル両方やります。 元々 JavaScript はインタプリタ言語 WEBの進化が激しく、どんどんリッチなUIが登場
インタプリタだけだと実行が遅い! インタプリタで即実行しつつ、よく走る箇所は JITコンパイル(実行中にコンパイル)して性能改善 *JIT = Just in Time の略
JavaScript はインタプリタ言語ですか? 現代の JavaScript はインタプリタ&コンパイル両方やります。 元々 JavaScript はインタプリタ言語 WEBの進化が激しく、どんどんリッチなUIが登場
インタプリタだけだと実行が遅い! インタプリタで即実行しつつ、よく走る箇所は JITコンパイル(実行中にコンパイル)して性能改善 だから JS ファイルを即実行できる *JIT = Just in Time の略
こうやって TypeScript はコンパイル・実行される
+) 実行されるのは JS ファイルということに気をつけろ 実行時は型情報が全部消えるので、想定してた型と実際の型が違う場合もすぐ気付けないことがある API返り値に型をつける 現実世界の型は違った そして予期せぬ動きになる
+) 実行されるのは JS ファイルということに気をつけろ 実行時は型情報が全部消えるので、想定してた型と実際の型が違う場合もすぐ気付けないことがある API返り値に型をつける 現実世界の型は違った そして予期せぬ動きになる Rust、Kotlinなど他の言語は期待してた型と違う 時点でエラーをスローするからすぐ気づくらしい
*)TS でもスキーマ検証すれば同じことはできる
3. ビルドとランタイムの疎結合
順番を考えてみよう BuildTime RunTime (1) 開発する (2) ビルドする (3) 実行する *ビルド:コードを実行可能な形式に変換する作業
特異点がある BuildTime RunTime (1) 開発する (2) ビルドする (3) 実行する *ビルド:コードを実行可能な形式に変換する作業
実行時は JS ファイルさえあれはOK! TypeScript とか型とかそんなの知らない ビルドの時に何が起きようがどうでもいい
特異点がある BuildTime RunTime (1) 開発する (2) ビルドする (3) 実行する *ビルド:コードを実行可能な形式に変換する作業
実行時は JS ファイルさえあれはOK! TypeScript とか型とかそんなの知らない ビルドの時に何が起きようがどうでもいい この場合ビルドタイムとランタイムが 疎結合(Loose Coupling)だと言える *)疎結合:部品同士の依存が弱く独立している状態
ツールを入れ替え可能 トランスパイル(TS→JS)段階では最終的に JS が作られればOKなので、 公式のコンパイラー(tsc)使わずに別のツール使うことができる ビルドタイムとランタイムの疎結合で何が起きるのか この段階で tsc を使っても、他のツール(SWC、esbuildなど)使っても ランタイムは
JS ファイルさえあれば気にしない
トランスパイル(TS→JS)段階では最終的に JS が作られればOKなので、 公式のコンパイラー(tsc)使わずに別のツール使うことができる ツールを入れ替え可能 ビルドタイムとランタイムの疎結合で何が起きるのか なぜ公式じゃない他のツールを使うのか、 その大きな理由の一つは tsc が遅い
トランスパイル(TS→JS)段階では最終的に JS が作られればOKなので、 公式のコンパイラー(tsc)使わずに別のツール使うことができる ツールを入れ替え可能 ビルドタイムとランタイムの疎結合で何が起きるのか しかし、正確な型チェックができるのは tsc だけ …なのでツールが混在し、使い勝手が微妙になる
「型チェック(tsc)」+「トランスパイル(別のツール)」 なぜ公式じゃない他のツールを使うのか、 その大きな理由の一つは tsc が遅い
4. TSGO 出るってよ
tsc は遅い TypeScript 公式のコンパイラー(tsc)は TypeScript で書かれている。そいつが遅い。 Compiler (TypeScript 制)
2025年3月11日 Microsoft が TypeScript のコンパイラを GO に移植して10倍早くすると発表 (ムネアツ)
Compiler (TypeScript 制) →(Go 制) ここが10倍早くなる
正式リリースはまだ でも2025年5月22日にプレビューが公開されたので、それで試せる
TSGO がリリースされたら嬉しいこと (1) 型チェック&トランスパイルが爆速 開発が快適・CI時間もへる(大規模プロジェクトほど嬉しい) (2) 言語サービスも高速化 エディタの赤波線・補完・ジャンプ・リネーム等のレスポンス改善 (3) 公式だけで完結しやすい
「型チェックは tsc、JS変換は別ツール」の二段構えを一本化できる
TSGO がリリースされたら嬉しいこと (1) 型チェック&トランスパイルが爆速 開発が快適・CI時間もへる(大規模プロジェクトほど嬉しい) (2) 言語サービスも高速化 エディタの赤波線・補完・ジャンプ・リネーム等のレスポンス改善 (3) 公式だけで完結しやすい
「型チェックは tsc、JS変換は別ツール」の二段構えを一本化できる まじで早く正式リリースしてほしい、、(切実)
5. まとめ
➔ コンピューターは低水準言語を使うが、人は高水準言語で開発する ➔ 高水準言語 → 低水準言語の変換方法にはコンパイル方式、インタプリタ方式がある ➔ TypeScript のコンパイラは「型チェック」と「JSへの変換」をする ➔
TypeScript はビルドタイムとランタイムが疎結合 ➔ tsc (TypeScript 制のコンパイラ)は遅いが、TSGOが出るらしいので楽しみ まとめ
ご清聴ありがとうございました