Оказывается, компилятор typescript переписали на Go
Выбор Go был обусловлен несколькими ключевыми факторами:
Структурная совместимость с существующим кодом — Go позволил сохранить структуру и семантику оригинального кода на JavaScript/TypeScript. Это критично, так как команда планирует поддерживать обе кодовые базы параллельно, и близкое сходство упрощает перенос изменений между ними.
Простота портирования, а не переписывания — команда рассматривала процесс как порт существующего компилятора, а не создание его с нуля. Идиоматический код на Go оказался очень похож на паттерны программирования в существующей кодовой базе TypeScript.
Сбалансированное управление памятью — Go отлично контролирует расположение и выделение памяти (как на уровне объектов, так и полей), не заставляя при этом постоянно думать об управлении памятью. Наличие сборщика мусора в данном случае не создаёт проблем, так как компилятор не имеет строгих ограничений по задержкам.
Эффективная работа с графовыми структурами — компилятор TypeScript интенсивно использует обработку графов и обход деревьев, а Go делает такие операции эргономичными.
Производительность — переписанный на Go компилятор показал 10-кратное ускорение по сравнению с оригинальной версией.
Как отмечает Андерс Хейлсберг (ведущий разработчик TypeScript), команда рассматривала и другие языки, включая C# и Rust, но Go оказался оптимальным выбором для данной конкретной задачи. Другие языки (например, Rust) потребовали бы фундаментального переосмысления управления памятью, мутации данных и общей архитектуры, что не соответствовало цели порта с сохранением существующего поведения.
🫥 Cross Join
⠀
Post #454
3.27K