Open13

typescript-go を試す

Shinya FujinoShinya Fujino

Go のバージョンは

Go 1.24 or higher

とのことなので、手元のマシンの Go を最新の 1.24.1 に上げておく:

$ go version
go version go1.24.1 darwin/arm64
Shinya FujinoShinya Fujino

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

git clone --recurse-submodules https://github.com/microsoft/typescript-go.git
Shinya FujinoShinya Fujino

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

$ cd typescript-go
$ npm ci
Shinya FujinoShinya Fujino

プロジェクトをビルドする。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
Shinya FujinoShinya Fujino

続いて、デモと同様に VS Code をコンパイルしてみる。まずはリポジトリをクローンする:

git clone https://github.com/microsoft/vscode.git
Shinya FujinoShinya Fujino

デモと同様のコマンドを実行してみる。まずは通常の 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 となった。

Shinya FujinoShinya Fujino

続いて tsgo を実行してみるが、エラーとなる...

$ tsgo
panic: interface conversion: ast.nodeData is *ast.NamedExports, not *ast.NamedImports

# 略
Shinya FujinoShinya Fujino

野生の勘で 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
Shinya FujinoShinya Fujino

なぜか 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
Shinya FujinoShinya Fujino

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