Cloudflare и VoidZero теперь сотрудничают с Максом Швенком из Owner.com над tsrs — портом компилятора TypeScript на Rust. Мы ведём эту работу в тесном взаимодействии с командой TypeScript и развиваем tsrs в рамках инструментальной цепочки компилятора Oxc для JavaScript.
Наша цель — помочь разработчикам тратить меньше времени на ожидание проверки кода и больше — на создание продуктов. Ускорение TypeScript и повышение эффективности использования памяти также помогает сделать полноценные среды разработки доступными в большем числе мест, включая непосредственно браузер.
Чтобы внести ясность: мы не создаём форк TypeScript. Мы считаем, что команда TypeScript должна сохранять полный контроль над дизайном и направлением развития языка. Они поддерживали долгосрочное видение, одновременно направляя внедрение TypeScript во всём сообществе JavaScript. Мы не хотим это менять.
Команда TypeScript может быстро двигаться по многим вопросам, но для некоторых функций они могут годами намеренно изучать варианты и создавать прототипы, прежде чем выбрать правильную реализацию. Порту на Rust необходимо внимательно следовать этим решениям, иначе он в конечном итоге развалится и станет несовместимым. Мы должны строго сохранять язык TypeScript на основе его оригинальной реализации — и только команда TypeScript должна нести ответственность за определение того, как это выглядит.
Улучшения производительности и памяти
Ранние бенчмарки нашего порта TypeScript на Rust многообещающи: tsrs до 8 раз быстрее и использует примерно на 70% меньше памяти по сравнению с TypeScript 7.0 при использовании того же количества рабочих процессов проверки типов:
Как видите, следующая версия TypeScript уже приносит множество улучшений производительности, делая TypeScript 7.1 beta до 2.5 раз быстрее, чем TypeScript 7.0. Некоторые из этих оптимизаций были перенесены из tsrs, и мы надеемся найти ещё больше.
Возможно, вы видели недавние бенчмарки различных портов TypeScript с разными заявлениями о производительности, часто из-за использования более крупных типов машин и других опций по сравнению с настройками TypeScript по умолчанию. Мы работали с командой TypeScript, чтобы убедиться, что приведённые выше бенчмарки сравнивают одинаковую конфигурацию.
По умолчанию tsrs поставляется с адаптивной конфигурацией, зависящей от типа машины, которая использует больше памяти, но работает ещё быстрее:
Попробуйте tsrs
Проект TypeScript in Rust представляет собой точный порт TypeScript. Попробовать экспериментальную версию можно, установив пакет tsrs из npm:
npm install tsrs npx tsrs Почему сейчас?
За годы мы наблюдали множество попыток портировать TypeScript на другие языки. Из-за сложности задачи успешным оказался лишь один порт: перенос TypeScript командой TypeScript с JavaScript на Go.
Однако передовые AI-модели теперь способны выполнять масштабные портирования практически автономно за считанные дни. Мы уже видели slopforks, точные порты и полностью переработанные версии 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 вы также можете безопасно запускать эти среды на стороне клиента в браузере, на встроенном устройстве или в IoT-приложении.
Как будет поддерживаться порт tsrs?
Для начала мы вместе с Theo Browne объединяем tsc-rs и tsrs в единый пакет, который будет поддерживать все возможности TypeScript, включая Language Server Protocol (LSP) и content mappers. Во-вторых, мы добились больших успехов в том, как поддерживаем Vinext в синхронизации с его upstream-версией Next.js. Мы рассказали, как это делаем, в недавней записи блога:
Каждое утро агент проверяет изменения, получает диффы и открывает tracking-issues для всего, что может повлиять на Vinext. Каждую ночь матрица совместимости перегенерируется, поскольку мы прогоняем набор тестов Next.js против Vinext. Когда один из этих тестов или issues выявляет пробел, агенты теперь могут определить изменение в обеих кодовых базах, собрать воспроизведение, перенести соответствующие тесты и предложить исправление.
Мы применим тот же процесс к TypeScript, уделяя предельное внимание тому, чтобы не допустить расхождений в поведении с upstream-версией TypeScript. Когда мы находим улучшения производительности, мы попытаемся внести их обратно в кодовую базу TypeScript Go, чтобы выиграли все.
Наконец, мы признаём, что сейчас есть некоторые отличия от upstream-версии TypeScript, например порядок вывода диагностик. Мы стремимся свести эти отличия к минимуму к моменту публикации стабильного релиза.
Что дальше?
Cloudflare уже является домом для многих бесплатных и открытых Rust-инструментов, которые питают экосистему JavaScript, таких как Vite, Rolldown, Oxlint и Oxfmt. Поскольку более 10 миллионов разработчиков создают решения на Cloudflare, мы очень заботимся о том, чтобы сделать базовый инструментарий разработчика быстрее, более портируемым и простым для запуска в большем числе сред. Мы рады экспериментировать с более глубокими интеграциями tsrs в наш стек, например для типозависимых правил линтинга в Oxlint.
Как и с Vinext, наша цель — развивать tsrs как хорошо поддерживаемый и здоровый open source проект, не мешая самому TypeScript. Команда Oxc уже начала рефакторинг кодовой базы, чтобы сделать её быстрее, снизить потребление памяти и повысить поддерживаемость. Мы знаем, что команда TypeScript относится к этому серьёзно — они экспериментируют с улучшениями памяти и производительности для tsc. Мы рады сотрудничать с командой TypeScript и сообществом JavaScript, чтобы вместе создавать лучшие и самые быстрые реализации TypeScript.