Open2
TypeScriptコンパイラをGoに移植する理由

ChatGPT-4oの要約
TypeScriptコンパイラのGo移植に関する有用な要約
1. Goを選択した理由
-
既存のTypeScriptコードベースとの構造的な互換性
- Goのコードスタイルが既存のTypeScriptコンパイラと類似しており、移植作業が容易。
- クラスベースではなく、関数とデータ構造中心のコードがGoと相性が良い。
- 既存コードを大幅に書き換えずにそのままポートしやすい。
-
メモリ管理のしやすさ
- 手動でメモリ管理を考慮する必要がなく、適切なメモリレイアウトを制御可能。
- GC(ガベージコレクション)の影響が少ないワークロード(バッチ処理が多く、プログラム終了時に解放される)。
-
グラフ処理(ASTの走査)への適性
- TypeScriptコンパイラではツリー構造の上下移動が多く発生。
- Goはツリーの走査が簡単で、元のJavaScriptコードと似た形で表現できる。
-
並列処理の活用
- Goの並列処理(goroutines)により、TypeScriptコンパイラの一部処理を並列化し、3倍の速度向上を実現。
2. C#やRustではなくGoを選んだ理由
-
C#を使わなかった理由
- 移植ではなく「書き直し(リライト)」が必要になってしまう。
- Roslyn(C#コンパイラ)はC#で書かれているが、それはゼロから作り直したコンパイラであり、今回のTypeScriptコンパイラのケースとは異なる。
- C#のランタイムは高性能だが、今回の要件(既存コードの移植、メモリ管理の単純化)には過剰。
-
Rustを使わなかった理由
- Rustはゼロからのリライトには適しているが、既存コードの移植には不向き。
- Rustのメモリ管理(借用システム)はTypeScriptコンパイラの設計に適応しづらく、大幅なリファクタリングが必要になる。
- Rustは学習コストが高く、チームの開発スピードを損なう可能性がある。
3. 今回の移植の目的
-
あくまで移植(ポート)であり、再設計(リライト)ではない
- 約100人年の投資がなされた既存のコードベースを維持することが最優先。
- 「TypeScriptの挙動を変えず、移植可能な範囲で最適化する」ことが目的。
-
C#/.NETを軽視しているわけではない
- Microsoftは依然としてC#/.NETに強く投資しており、社内で最も広く使われている言語。
- .NET 9のパフォーマンス向上など、MicrosoftとしてはC#のエコシステムを強化し続ける姿勢を維持。
4. 今後の展望
-
TypeScriptコンパイラの新しいGoベース版の影響
- パフォーマンスの向上(コンパイル速度10倍)。
- JSとの相互運用性(interop)は今後改善予定。
- 既存のTypeScriptツールの動作は維持しつつ、将来的に改善が可能。
-
Microsoftの技術選定の柔軟性
- 以前ならMicrosoftがGoを選ぶことは考えられなかったが、近年のオープンソースへの取り組みの一環として「最適なツールを選ぶ」方針を採用。
- C#/.NETに引き続き投資する一方で、特定のユースケースにはGoやRustなど他の言語も採用。
結論
Microsoftは技術選定において「最適なツールを選ぶ」という実践的なアプローチを取っており、今回のGo採用はTypeScriptコンパイラの移植という特殊な条件下で最も適していた。C#やRustが劣っているわけではなく、今回のユースケースには適していなかっただけであり、MicrosoftのC#/.NETへの投資は継続する。
今回の移植により、TypeScriptコンパイラの速度が10倍に向上し、今後の開発やメンテナンスがより効率的になることが期待される。