Улучшения производительности и памяти

Ранние бенчмарки портирования TypeScript на Rust обещают хорошие результаты: tsrs работает в 8 раз быстрее и использует примерно на 70% меньше памяти по сравнению с TypeScript 7.0 при использовании одинакового количества воркеров проверки типов:

График производительности tsrs vs TypeScript

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

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

По умолчанию tsrs поставляется с адаптивной конфигурацией, зависящей от типа машины, которая использует больше памяти, но работает ещё быстрее:

График производительности tsrs в адаптивном режиме

Попробуйте tsrs

TypeScript на Rust стремится быть верным портом TypeScript. Вы можете попробовать экспериментальный релиз, установив пакет tsrs из npm:

npm install tsrs
npx tsrs

Почему сейчас?

На протяжении многих лет предпринимались многочисленные попытки портировать TypeScript на другие языки. Из-за сложности вовлечённых работ успешным оказался только один портирование: перенос TypeScript от команды TypeScript с JavaScript на Go.

Однако передовые AI-модели теперь способны выполнять крупномасштабные портирования почти независимо за считанные дни. Уже видны поверхностные форки, верные порты и полностью переархитектурированные версии TypeScript на Rust или C++. Спрос на ещё более быстрый TypeScript явно есть.

Почему Rust?

Можно подумать: «Портирование TypeScript на Go от команды TypeScript уже сделало 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) и картографы контента. Во-вторых, был замечен большой успех в том, как поддерживается Vinext в синхронизации с его upstream-версией Next.js. Объяснение того, как это делается, находится в недавнем блог-посте:

Каждое утро агент просматривает изменения, получает дифференциалы и открывает проблемы отслеживания для всего, что может повлиять на Vinext. Каждую ночь матрица совместимости регенерируется по мере запуска набора тестов Next.js против Vinext. Когда один из этих тестов или проблем выявляет пробел, агенты теперь находятся в положении, когда они могут определить изменение в обоих кодовых базах, создать воспроизведение, портировать любые соответствующие тесты и предложить исправление.

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

Наконец, признано, что в данный момент существуют некоторые различия по сравнению с upstream-версией TypeScript, например, порядок печати диагностики. Целью является минимизировать эти различия к моменту публикации стабильного релиза.

Что дальше?

Cloudflare уже является домом для многих свободных и открытых инструментов Rust, которые питают экосистему JavaScript, таких как Vite, Rolldown, Oxlint и Oxfmt. Имея более 10 миллионов разработчиков, создающих на Cloudflare, компания особо заботится о том, чтобы сделать базовую цепочку инструментов разработки быстрее, более портативной и проще запускать в большем количестве мест. Хотя бы интеграция tsrs в свой стек, например, для лучшего отслеживания типов правил в Oxlint.

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