Cloudflare и VoidZero представили tsrs: порт TypeScript на Rust

Cloudflare и VoidZero представили tsrs: порт TypeScript на Rust

Cloudflare и VoidZero объявили о проекте tsrs: это порт компилятора TypeScript на Rust. Над ним работают вместе с Максом Шваенком (Max Schwenk) из Owner.com, в тесном сотрудничестве с командой TypeScript. Проект развивается как часть тулчейна Oxc для JavaScript-компиляторов. Экспериментальный выпуск уже доступен в npm: установить пакет tsrs можно командой npm install tsrs, запустить, npx tsrs.

Авторы подчёркивают, что это не форк TypeScript. По их словам, команда TypeScript должна полностью контролировать дизайн и развитие языка, а порт на Rust обязан близко следовать её решениям, иначе со временем он развалится и станет несовместимым. Цель tsrs, быть верным портом TypeScript.

По ранним замерам авторов, tsrs работает до 8 раз быстрее и использует примерно на 70% меньше памяти, чем TypeScript 7.0, при одинаковом числе воркеров проверки типов. TypeScript 7.1 beta, по тем же данным, уже до 2,5 раза быстрее TypeScript 7.0; часть оптимизаций перенесена в него из tsrs. Авторы пишут, что замеры сделаны в конфигурации, согласованной с командой TypeScript и совпадающей с настройками TypeScript по умолчанию, тогда как в других недавних сравнениях портов часто берут более мощные машины и иные параметры. По умолчанию tsrs поставляется с адаптивной конфигурацией, зависящей от типа машины: она расходует больше памяти, но работает ещё быстрее.

Почему сейчас: попыток перенести TypeScript на другие языки было много, но успешной, по словам авторов, стала лишь одна, порт самой команды TypeScript с JavaScript на Go. Теперь же передовые модели ИИ способны выполнять крупные порты почти самостоятельно за несколько дней, и появились «slopforks» (небрежные форки), аккуратные порты и полностью переработанные версии TypeScript на Rust или C++. Авторы делают вывод, что спрос на ещё более быстрый TypeScript очевиден.

Почему Rust, если порт на Go уже ускорил TypeScript в 10 раз по сравнению с прежней версией на TypeScript (так авторы формулируют возможное возражение): дело не только в скорости. Rust лучше подходит для WebAssembly (Wasm): при компиляции Go-программы в Wasm приходится компилировать вместе с ней сборщик мусора Go, а модель управления памятью в Rust упрощает взаимодействие памяти между гостем Wasm и хостом. Несколько недель назад Cloudflare объявила о поддержке нативного Rust в Workers через новую цель Emscripten для wasm-bindgen. Малый расход памяти позволяет запускать в Workers целые системы сборки и развёртывания и работать с агентами: полный инструментарий разработки можно запускать в изолированной среде на Cloudflare, а через Wasm, безопасно в браузере, на встроенном устройстве или в IoT-приложении.

План сопровождения: во-первых, Cloudflare работает с Тео Брауном (Theo Browne) над объединением tsc-rs и tsrs в один пакет, поддерживающий все возможности TypeScript, включая Language Server Protocol (LSP) и контент-мапперы. Во-вторых, будет применён процесс синхронизации с upstream, который уже используется для Vinext и Next.js: агент каждое утро разбирает изменения и открывает задачи, а каждую ночь пересоздаётся матрица совместимости по тестам Next.js. Для TypeScript обещают предельную аккуратность, чтобы не вносить расхождений в поведении, а улучшения производительности стараться возвращать в кодовую базу TypeScript на Go. Сейчас различия с оригиналом есть, например в порядке вывода диагностик; к стабильному выпуску их хотят свести к минимуму.

Дальше Cloudflare планирует экспериментировать с более глубокой интеграцией tsrs в свой стек, например для правил линтинга с учётом типов в Oxlint. Команда Oxc уже начала рефакторинг кодовой базы, чтобы ускорить её, снизить расход памяти и сделать поддерживаемой. Авторы добавляют, что команда TypeScript относится к теме серьёзно и экспериментирует с улучшениями памяти и производительности для tsc.

Ключевые факты

  • tsrs, порт компилятора TypeScript на Rust от Cloudflare и VoidZero совместно с Максом Шваенком из Owner.com; делается в сотрудничестве с командой TypeScript и входит в тулчейн Oxc.
  • По ранним замерам авторов, tsrs до 8 раз быстрее и использует примерно на 70% меньше памяти, чем TypeScript 7.0, при том же числе воркеров проверки типов; TypeScript 7.1 beta, до 2,5 раза быстрее 7.0.
  • Это не форк: развитием языка по-прежнему управляет команда TypeScript, а порт должен близко следовать её решениям.
  • Экспериментальный выпуск доступен в npm (npm install tsrs); есть расхождения с оригиналом, например в порядке вывода диагностик, их обещают свести к минимуму к стабильному выпуску.
  • Аргумент в пользу Rust, WebAssembly: нет необходимости тащить сборщик мусора, как у Go, поэтому инструментарий проще запускать в браузере, Workers и на встроенных устройствах.

Почему это важно

TypeScript, основа огромной части JavaScript-разработки, а проверка типов в больших проектах занимает заметное время и память. Порт команды TypeScript на Go, по формулировке самих авторов, уже сделал компилятор в 10 раз быстрее прежней версии на TypeScript. Теперь крупный игрок инфраструктуры, Cloudflare, и команда Oxc/VoidZero предлагают следующий шаг, реализацию на Rust, которая по их замерам ещё быстрее и экономнее по памяти. Отдельный акцент, запуск в WebAssembly: это позволяет держать полный цикл разработки в браузере или в изолированной среде. Заметен и контекст: авторы прямо говорят, что ИИ-модели теперь способны выполнять крупные порты почти самостоятельно за несколько дней, из-за чего появилось много таких проектов.

Кому это важно

Разработчикам на TypeScript, у которых проверка типов в больших репозиториях и CI занимает много времени или памяти. Авторам инструментов для JavaScript-экосистемы (линтеры, языковые серверы, сборщики): Cloudflare говорит об интеграции tsrs, например, в правила линтинга с учётом типов в Oxlint. Тем, кто делает облачные среды разработки и агентные системы: малый расход памяти и работа через Wasm позволяют запускать тулчейн в песочнице, в браузере или на встроенных устройствах.

Как это применить

Экспериментальный выпуск можно попробовать уже сейчас: npm install tsrs, затем npx tsrs. Релиз именно экспериментальный, поэтому разумно сравнивать его вывод с обычным tsc на своём проекте, а не заменять им рабочий процесс сборки. Стоит учесть известные расхождения с оригиналом, например порядок вывода диагностик. По умолчанию tsrs использует адаптивную конфигурацию в зависимости от типа машины: она быстрее, но расходует больше памяти, чем та, с которой авторы приводят основные цифры. Лицензия, номер версии и ссылка на репозиторий в тексте анонса не указаны.

Можно ли доверять

Источник, официальный блог Cloudflare, то есть заявление самих авторов проекта, а не независимая проверка. Цифры (до 8 раз быстрее, примерно на 70% меньше памяти относительно TypeScript 7.0) названы «ранними замерами»; в тексте нет описания машины, проекта для замеров и числа воркеров, графики в пересказ не входят. Авторы утверждают, что конфигурация согласована с командой TypeScript, но самой команды TypeScript в тексте не цитируют. Формулировка «до 8 раз» означает максимум, а не типичный результат. Ускорение TypeScript 7.1 beta до 2,5 раза также приведено авторами tsrs.

Риски и подводные камни

Проект экспериментальный, и сами авторы признают расхождения с оригиналом; их цель, свести различия к минимуму лишь к стабильному выпуску, а срок стабильного выпуска не назван. Главный долгосрочный риск, который авторы описывают сами, порт может разойтись с TypeScript, если не следовать решениям его команды: для этого предлагается автоматизированная синхронизация с upstream на основе агентов, как для Vinext и Next.js. Остаётся и вопрос разделения усилий в экосистеме: Cloudflare собирается объединять tsc-rs и tsrs в один пакет, а команда TypeScript, как пишут авторы, параллельно экспериментирует с улучшениями памяти и производительности для tsc. Наконец, проект развивают Cloudflare, VoidZero и Макс Шваенк в рамках тулчейна Oxc, что стоит учитывать при выборе зависимости.

«Чтобы было ясно: мы не делаем форк TypeScript.»

— авторы анонса, блог Cloudflare