Goの`defer`をTypeScriptコンパイラに追加:Goで書かれたコンパイラにおける教育的なパッチ

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

Goの`defer`をTypeScriptコンパイラに追加:Goで書かれたコンパイラにおける教育的なパッチ
イラスト : Momiji Shirogane

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は以下のステップを踏みます:

  1. スキャナー(字句解析器) - deferを通常の識別子ではなく専用のトークンとして認識する。
  2. パーサー - deferが文レベルで現れることができる場所を文法で決定する(文レベルではOK、式レベルではNG)。
  3. チェッカー(型チェッカー) - deferされるものは関数呼び出しであることを確認する。
  4. エミッター - deferをJavaScriptに変換する。この場合、関数をtry/finallyでラップし、巻き戻し時に実行されるコールバックを配列に積むことになります。

最後のステップが最も学びになります:Goのdeferはランタイムによって実装される真の言語機構ですが、JSにはこれに相当するものはありません。そのため、脱糖(desugaring)によってシミュレートする必要があり、パフォーマンス、例外、awaitなどのトレードオフが発生します。

なぜこれが私たちにとって興味深いのか

Go製のTypeScriptコンパイラがオープンソースであるため、この種の演習はまさに読む価値があります:

  • 真のモダンコンパイラのアーキテクチャ(大学のおもちゃではない)を理解する。
  • ターゲット言語(JS)が必要なプリミティブを持っていない場合、翻訳の選択肢がどのように制約されるかを見る。
  • AST → 型チェック → エミッションの流れに慣れる。表面的な部分(tsc)はすでに知っているプロジェクト上で。

ちなみに、Healeyのパッチはデモとして提案されており、アップストリームのPRとしてではありません。TC39はJavaScript標準にdeferを採用しておらず、MicrosoftもTypeScriptにこの種の独自拡張を推進していません。

覚えておくべきこと:tscのGoによる書き直しの真の利点は、速度だけではありません。これは、高度なTypeScriptの専門家でなくてもコードが理解できるコンパイラなのです。この種の教育的なパッチは増えていくでしょうし、それは素晴らしい学びの場となります。

リソース

本記事は人工知能により作成され、人間の編集管理のもとで校閲されています。

編集部について
この記事は役に立ちましたか?

7 人がこの記事を評価しました

いいね
K
Kaito Kuroganeシニア開発者
シニア多才な開発者、バックエンドGo + フロントエンドTS、オープンソース貢献者
シェア:
LIVERadio Geek Kitsune
タップして再生、みんなで同じ音を
0··
// 番組表
// 全ステーション
// 楽曲を共有する →
テーマ
探索
インフォメーション