Представляем tsrs: порт TypeScript на Rust
- Cloudflare, VoidZero и Max Schwenk из Owner.com разрабатывают tsrs — порт TypeScript на Rust в составе Oxc, сотрудничая с командой TypeScript.
- В первых тестах tsrs работает до 8 раз быстрее и использует примерно на 70% меньше памяти, чем TypeScript 7.0, при одинаковом числе процессов проверки типов.
- Экспериментальную версию можно установить через npm; разработчики планируют объединить tsrs и tsc-rs с поддержкой LSP и преобразователей содержимого.
Почему это важно: Rust и WebAssembly позволяют запускать полноценные изолированные среды разработки в браузере и других местах, где это прежде было невозможно.
Cloudflare и VoidZero теперь работают вместе с Max Schwenk из Owner.com над tsrs — портом компилятора TypeScript на Rust. Мы ведём эту работу в тесном сотрудничестве с командой TypeScript и развиваем tsrs в рамках набора инструментов компилятора JavaScript Oxc.
Наша цель — помочь разработчикам тратить меньше времени на ожидание проверки кода и больше — на создание программ. Ускорение TypeScript и снижение потребления памяти также помогут сделать полноценные среды разработки доступными в большем числе мест, в том числе прямо в браузере.
Уточним: мы не форкаем TypeScript. Мы считаем, что команда TypeScript должна полностью контролировать дизайн и развитие языка. Она придерживается долгосрочного видения и одновременно направляет распространение TypeScript в сообществе JavaScript. Мы не хотим ничего менять.
Команда TypeScript может довольно быстро работать над многими задачами, но при разработке некоторых функций она может годами изучать варианты и создавать прототипы, прежде чем выбрать подходящую реализацию. Порт на Rust должен точно следовать этим решениям, иначе со временем он перестанет работать и станет несовместимым. Мы обязаны строго сохранять язык TypeScript в соответствии с его исходной реализацией, а решение о том, как именно это должно выглядеть, должно оставаться исключительно за командой TypeScript.
Повышение производительности и снижение потребления памяти
Первые результаты тестирования нашего порта TypeScript на Rust выглядят многообещающе: tsrs работает до 8 раз быстрее и использует примерно на 70% меньше памяти, чем TypeScript 7.0, при одинаковом количестве рабочих процессов проверки типов:

Как видно, следующая версия TypeScript уже включает множество улучшений производительности: бета-версия TypeScript 7.1 работает до 2,5 раза быстрее TypeScript 7.0. Некоторые из этих оптимизаций были внесены в основной проект из tsrs, и мы надеемся найти новые.
Возможно, вы видели недавние результаты тестирования разных портов TypeScript, сопровождаемые заявлениями о производительности. Часто они обусловлены использованием более мощных машин и настроек, отличающихся от параметров TypeScript по умолчанию. Мы работали с командой TypeScript, чтобы убедиться, что приведённые выше результаты получены при сравнении одинаковых конфигураций.
По умолчанию tsrs использует адаптивную конфигурацию, зависящую от типа машины: она требует больше памяти, но обеспечивает ещё более высокую скорость:

Попробуйте tsrs
Цель TypeScript на Rust — создать точный порт TypeScript. Вы можете попробовать экспериментальную версию, установив пакет tsrs из npm:
npm install tsrs
npx tsrsПочему сейчас?
За прошедшие годы мы видели множество попыток портировать TypeScript на другие языки. Из-за сложности задачи успешной оказалась лишь одна: порт TypeScript с JavaScript на Go, созданный самой командой TypeScript.
Однако теперь передовые модели ИИ способны почти самостоятельно выполнять масштабные портирования за считаные дни. Мы уже видели небрежные форки, точные порты и полностью переосмысленные версии TypeScript на Rust и C++. Очевидно, что спрос на ещё более быстрый TypeScript существует.
Почему Rust?
Возможно, вы думаете: «Порт TypeScript на Go уже ускорил TypeScript в 10 раз и значительно снизил потребление памяти по сравнению с предыдущей версией, написанной на TypeScript. Разве этого недостаточно?»
Но дело не только в скорости. Rust даёт уникальные преимущества, например возможность запуска в WebAssembly. Связка Rust и Wasm всегда была сильной стороной Rust, и одна из причин кроется в основах дизайна языка. При компиляции программы на Go в Wasm вместе с ней приходится компилировать и сборщик мусора Go. Модель управления памятью Rust, напротив, позволяет легко взаимодействовать с памятью между гостевой и хостовой средами WebAssembly. Именно это делает Rust гораздо более подходящим для WebAssembly: он эффективно использует память.
Cloudflare Workers уже давно поддерживает Wasm. Всего несколько недель назад мы объявили о поддержке нативного Rust в Workers благодаря новой цели Emscripten для wasm-bindgen. Когда в Workers в тесном цикле выполняются целые системы сборки и развёртывания ПО, преимущества малого объёма занимаемой памяти быстро становятся очевидны. Благодаря этому такие задачи можно выполнять настолько эффективно, что теперь полностью изолированные среды разработки можно запускать там, где раньше это было невозможно.
В сочетании с агентами это открывает новые возможности: теперь можно запускать полный набор инструментов разработки в полностью изолированной среде на Cloudflare. А благодаря Wasm эти среды также можно безопасно запускать на стороне клиента — в браузере, на встроенном устройстве или в приложении для интернета вещей.
Как будет поддерживаться порт tsrs?
Во-первых, мы работаем с Theo Browne над объединением tsc-rs и tsrs в один пакет, поддерживающий все возможности TypeScript, включая Language Server Protocol (LSP) и преобразователи содержимого. Во-вторых, мы добились больших успехов, поддерживая Vinext в актуальном состоянии относительно исходного проекта Next.js. О том, как мы это делаем, мы рассказали в недавней публикации в блоге:
Каждое утро агент проверяет изменения, получает различия между версиями и создаёт задачи для отслеживания всего, что может повлиять на Vinext. Каждую ночь мы заново формируем матрицу совместимости, запуская набор тестов Next.js для Vinext. Если тест или задача выявляют пробел, агенты могут обнаружить соответствующее изменение в обеих кодовых базах, подготовить пример для воспроизведения проблемы, перенести нужные тесты и предложить исправление.
Мы применим тот же процесс к TypeScript и будем предельно внимательно следить за тем, чтобы не допустить расхождений в поведении с исходной версией TypeScript. Если мы обнаружим улучшения производительности, то постараемся внести их в кодовую базу TypeScript на Go, чтобы выиграли все.
Наконец, мы понимаем, что сейчас есть некоторые отличия от исходной версии TypeScript — например, порядок вывода диагностических сообщений. К моменту выпуска стабильной версии мы стремимся свести эти различия к минимуму.
Что дальше?
Cloudflare уже стал домом для множества бесплатных инструментов с открытым исходным кодом на Rust, которые лежат в основе экосистемы JavaScript, таких как Vite, Rolldown, Oxlint и Oxfmt. Более 10 миллионов разработчиков создают проекты на Cloudflare, и для нас очень важно сделать базовый набор инструментов разработки быстрее, более переносимым и пригодным для запуска в большем числе сред. Мы с энтузиазмом изучаем возможности более глубокой интеграции tsrs в наш стек — например, для правил линтинга в Oxlint, учитывающих типы.
Как и в случае с Vinext, наша цель — развивать tsrs как здоровый проект с открытым исходным кодом и качественной поддержкой, не мешая развитию самого TypeScript. Команда Oxc уже приступила к переработке кодовой базы, чтобы ускорить её, снизить потребление памяти и упростить поддержку. Мы знаем, что команда TypeScript серьёзно относится к этой задаче и экспериментирует с улучшением использования памяти и производительности tsc. Мы рады сотрудничать с командой TypeScript и сообществом JavaScript, чтобы вместе создать лучшие и самые быстрые реализации TypeScript.
