typescript-go を試す

TypeScript が Go で完全にリライトされることがアナウンスされた:

コードはすでに公開されているため誰でも試すことができる。ここでは Anders Hejlsberg がデモをしている VS Code のコンパイルをおこなってみる。リポジトリは以下:
デモ動画は以下:

Go のバージョンは
Go 1.24 or higher
とのことなので、手元のマシンの Go を最新の 1.24.1 に上げておく:
$ go version
go version go1.24.1 darwin/arm64

README に沿って進めていく。まずはリポジトリのダウンロードから(サブモジュールも合わせてクローンする。全部で 2.5 GB くらいダウンロードするため少し時間が掛かる):
git clone --recurse-submodules https://github.com/microsoft/typescript-go.git

プロジェクトに cd し依存関係をインストールする:
$ cd typescript-go
$ npm ci

プロジェクトをビルドする。typescript-go ではタスクランナーとして hereby が使われており、build コマンドなどを hereby を通じて実行できる(hereby を迂回して直接 Go のツールでビルドすることも可能な模様)。以下のようにビルドをおこなう:
npm run build
ビルドが完了すると、built/local/tsgo
に実行可能ファイルが生成されている:
$ file built/local/tsgo
built/local/tsgo: Mach-O 64-bit executable arm64

続いて、デモと同様に VS Code をコンパイルしてみる。まずはリポジトリをクローンする:
git clone https://github.com/microsoft/vscode.git

プロジェクトに cd し依存関係をインストールする:
$ cd vscode
$ npm i

デモと同様のコマンドを実行してみる。まずは通常の tsc を使用する:
$ cd src
$ npx tsc -b -f --diagnostics
Files: 4775
Lines: 1509848
Identifiers: 2522543
Symbols: 3261378
Types: 1096837
Instantiations: 1720767
Memory used: 3458634K
I/O read: 0.72s
I/O write: 1.14s
Parse time: 5.12s
Bind time: 2.64s
Check time: 39.18s
Emit time: 19.14s
Total time: 66.08s
ほぼ動画と同様の Total time となった。

続いて tsgo を実行してみるが、エラーとなる...
$ tsgo
panic: interface conversion: ast.nodeData is *ast.NamedExports, not *ast.NamedImports
# 略

野生の勘で typescript-go のバージョンを少し戻してみる。具体的には昨日の 75cdc6ad0ea0ab43aa23a3da512293f3b7d7ba97
のコミットにてビルドをおこない、再度得られたバイナリにて vscode のコンパイルを実行する。今度はちゃんと動いた:
tsgo
Files: 4775
Types: 1643623
Parse time: 1.179s
Bind time: 0.170s
Check time: 3.621s
Emit time: 19.236s
Total time: 24.205s
Memory used: 2994719K
Memory allocs: 28465446

なぜか 10x faster にはならず 3x faster 程度の結果となってしまった。数字をざっくり見るに、Emit time のみなぜか tsc と変わらずで、ここが足を引っ張ってしまっている模様。他は確かに 5-10x faster になっている:
tsc | tsgo | |
---|---|---|
Parse time | 5.12s | 1.179s |
Bind time | 2.64s | 0.170s |
Check time | 39.18s | 3.621s |
Emit time | 19.14s | 19.236s |

正直これらの diagnostics の正確な意味を理解しておらず、Emit time がなぜ遅いのかについてはすぐにはわからなそうなため、一旦ここで切り上げることとする。とりあえずは tsgo を実行するところまで行けたので嬉しい、久しぶりに興奮した。