Open2

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

catatsuycatatsuy

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倍に向上し、今後の開発やメンテナンスがより効率的になることが期待される。