Microsoft переписывает компилятор TypeScript на языке Go

Андерс Хейлсберг (Anders Hejlsberg), главный архитектор языка TypeScript, в своё время создавший языки C#, Delphi и Turbo Pascal, представил проект по созданию нового компилятора для TypeScript – typescript-go (tsgo), разрабатываемый на языке Go. Как и старый компилятор новый проект распространяется под лицензией Apache 2.0.

Исходный компилятор TypeScript написан на языке TypeScript и транслируется в JavaScript, что создаёт проблемы с масштабированием при использовании в очень больших проектах. Разработчикам приходится мириться с большими задержками при загрузке и проверке кода в интегрированных средах разработки, и жертвовать удобством разработки в пользу сокращения задержек, отключая в редакторах возможности для проверки кода. В экосистеме также назрела потребность в инструментарии командной строки, позволяющем быстро собирать код для проверки его работоспособности.

Предполагается, что создание нативного компилятора и инструментария для TypeScript существенно увеличит скорость сборки, уменьшит потребление памяти и сократит время запуска редакторов кода. Высокая производительность инструментария сделает более удобным процесс разработки в современных редакторах кода, позволит добиться быстрой проверки кода всего проекта, даст возможность реализовать более продвинутые техники рефакторинга и анализа кода, включение которых раньше было слишком затратно в плане потребления ресурсов.

По оценке разработчиков TypeScript, новый инструментарий позволит добиться сокращения времени сборки на порядок. В текущем виде новый вариант компилятора tsc обрабатывает кодовую базу проекта VS Code за 7.5 секунд, в то время как старому компилятору для этой операции требовалось 77.8 секунд. В случае с кодовой базой Playwright загрузка сократилась с 11.1 до 1.1 сек., TypeORM – с 17.5 до 1.3 сек., date-fns с 6.5 до 0.7 сек., tRPC с 5.5 до 0.6 сек., а rxjs c 1.1 до 0.1 сек.

Разработка нового компилятора ведётся с октября 2024 года командой из 9 сотрудников Microsoft. На текущем этапе для тестирования уже доступен рабочий прототип. Предварительную версию инструментария командной строки с новой реализацией tsc, поддерживающей проверку типов, планируют опубликовать до середины года. Выпуск первой полнофункциональной версии, способной собирать проекты и предоставлять LSP-сервисы для сред разработки, намечен к концу года.

Ветка TypeScript 6.x продолжит поставляться со старым компилятором и будет включать отдельные изменения для подготовки к миграции на новую реализацию. Первым выпуском, переведённым на новый инструментарий, станет TypeScript 7. Какое-то время кодовые базы TypeScript 6.x и TypeScript 7.x будут параллельно сопровождаться и сосуществовать, пока ветка TypeScript 7 не достигнет зрелого состояния, готового полностью заменить старый инструментарий.

Перед началом работы над проектом разработчики изучили возможность использования различных языков программирования и поэкспериментировали с прототипами на разных языках. В итоге для создания нового компилятора был выбран язык Go, как оптимальный вариант для выполнения работы по переписыванию кодовой базы старого компилятора. Язык Go близок с TypeScript по семантике и структуре кода, что позволяет сохранить при портировании существующие шаблоны. Использование Go упрощает перенос изменений между кодовыми базами и снижает трудоёмкость задачи по сопровождению старого и нового вариантов бок о бок.

Язык Go обеспечивает хорошую производительность, развивается с оглядкой на многопоточное программирование и эффективную работу на многоядерных системах, имеет встроенные средства защиты от проблем при работе с памятью. Ценой безопасной работы с памятью является сборщик мусора, который может приводить к появлению задержек во время работы, но для компилятора появление таких задержек не имеет значения.

В качестве варианта рассматривались и другие языки, такие как Rust, но они слишком сильно концептуально отличаются от TypeScript и при их использовании портирование превратилось бы в разработку компилятора с нуля, при которой было бы трудно добиться полной совместимости со старым компилятором, пришлось бы заново решать уже решённые в старой кодовой базе проблемы и проект потребовал бы значительно больше времени и ресурсов.

Язык TypeScript расширяет возможности JavaScript, оставаясь полностью обратно совместимым, что упрощает перевод на TypeScript существующих приложений. Итоговое приложение на TypeScript компилируется в обычный JavaScript, который можно выполнить в любом современном web-браузере или использовать c платформами Node.js, Bun и Deno. От JavaScript язык TypeScript отличается средствами для явного определения типов, а также поддержкой использования полноценных классов и модулей. Статическая типизация позволяет избежать многих ошибок в процессе разработки, даёт возможность задействовать дополнительные техники оптимизации, упрощает отладку, делает код более читаемым и простым для доработки и сопровождения.

Release. Ссылка here.