Dev & Code 45 min agoブックマークに追加

Andrew Healey は、Go コードの柱である `defer` キーワードを、Go で書かれた TypeScript コンパイラに直接注入します。これは、パーサー、チェッカー、エミッターを理解するための教科書的な事例です。
MicrosoftがTypeScriptコンパイラをGoで書き直すことを発表して以来(歴史的なTypeScript製tscに比べて約10倍の速度を目指す「TypeScript Native」プロジェクト)、コンパイラのソースコードは非常に魅力的な遊び場となっています。Andrew Healeyは自身のブログで、彼のフォークにGo言語の主要な使いやすさ向上機能の一つであるdeferキーワードをTypeScriptに追加する、非常に教育的な記事を発表しています。
主にJSスタック出身の方へのリマインダー:Goでは、deferは関数が呼び出された関数が戻る際に実行されるように関数をスケジュールします。これはtry { … } finally { … }と同等で、ボイラープレートなしで、クリーンアップ呼び出しが必要な呼び出しのすぐ隣に書かれます。
f, _ := os.Open("file.txt")
defer f.Close() // 関数を抜ける際に実行される
// … 残りのコード このパターンは、入れ子構造に迷うことなくリソース(ファイル、ミューテックス、接続)を解放するために広く使用されています。
記事の興味深い点は「Goのdeferが明日にもTypeScriptに来る」ということではありません( spoiler:違います)。現代的なコンパイラがキーワードを追加するときに何をするのか、段階的に追っていくことです。Healeyは以下のステップを踏みます:
deferを通常の識別子ではなく専用のトークンとして認識する。deferが文レベルで現れることができる場所を文法で決定する(文レベルではOK、式レベルではNG)。deferをJavaScriptに変換する。この場合、関数をtry/finallyでラップし、巻き戻し時に実行されるコールバックを配列に積むことになります。最後のステップが最も学びになります:Goのdeferはランタイムによって実装される真の言語機構ですが、JSにはこれに相当するものはありません。そのため、脱糖(desugaring)によってシミュレートする必要があり、パフォーマンス、例外、awaitなどのトレードオフが発生します。
Go製のTypeScriptコンパイラがオープンソースであるため、この種の演習はまさに読む価値があります:
ちなみに、Healeyのパッチはデモとして提案されており、アップストリームのPRとしてではありません。TC39はJavaScript標準にdeferを採用しておらず、MicrosoftもTypeScriptにこの種の独自拡張を推進していません。
覚えておくべきこと:tscのGoによる書き直しの真の利点は、速度だけではありません。これは、高度なTypeScriptの専門家でなくてもコードが理解できるコンパイラなのです。この種の教育的なパッチは増えていくでしょうし、それは素晴らしい学びの場となります。
本記事は人工知能により作成され、人間の編集管理のもとで校閲されています。