Разработка & Кодинг yesterdayВ закладки

Эндрю Хили внедряет ключевое слово `defer` — основной элемент кода Go — непосредственно в компилятор TypeScript, который теперь написан на Go. Это наглядный пример для понимания парсера, чеккера и эмиттера.
С тех пор как Microsoft объявила о переписывании компилятора TypeScript на Go (проект «TypeScript Native», который обещает ~10-кратное ускорение по сравнению с историческим tsc на TypeScript), исходный код компилятора стал отличной площадкой для экспериментов. Эндрю Хили публикует на своём блоге очень поучительную статью, где добавляет в своём форке ключевое слово defer — один из столпов эргономики языка Go — в TypeScript.
Напоминание для тех, кто пришёл в основном из JS-стэка: в Go defer планирует выполнение функции на момент возврата из объемлющей функции. Это эквивалент try { … } finally { … } без boilerplate, с вызовом очистки, написанным рядом с тем вызовом, который его сделал необходимым:
f, _ := os.Open("file.txt")
defer f.Close() // выполнится при выходе из функции
// … остальной код Этот паттерн широко используется для освобождения ресурсов (файлы, мьютексы, соединения) без погружения в вложенные структуры.
Интерес статьи не в том, что «defer от Go скоро появится в TypeScript» (спойлер: нет). Речь о том, чтобы пошагово проследить, что делает современный компилятор, когда добавляется новое ключевое слово. Хили проходит через:
defer как отдельного токена, а не обычного идентификатора.defer может появляться в грамматике (на уровне statement — да; в выражениях — нет).defer в JavaScript, что в его случае сводится к обёртыванию объемлющей функции в try/finally и добавлению отложенных колбэков в массив, который выполняется при unwind.Именно последний этап даёт больше всего знаний: defer в Go — это настоящий механизм языка (реализованный рантаймом), тогда как в JS ничего подобного нет — его приходится имитировать через desugaring, со всеми вытекающими компромиссами (производительность, исключения, await и т. д.).
Поскольку компилятор TypeScript на Go открыт, такие упражнения — идеальное чтиво, чтобы:
Отметим, что патч Хили предлагается в качестве демо, а не как PR в основной репозиторий — TC39 никогда не включал defer в стандарт JavaScript, а Microsoft не продвигает проприетарные расширения такого рода в TypeScript.
Ключевой вывод: настоящая выгода от переписывания tsc на Go заключается не только в скорости — это компилятор, код которого наконец-то стал доступен для понимания читателю, не являющемуся экспертом в продвинутом TypeScript. Подобные педагогические патчи будут множиться, и это отличная школа.
Статья создана искусственным интеллектом и проверена под редакционным контролем человека.