Pavel
Pavel
0
Обложка: Rust — это будущее JavaScript-инфраструктуры

Rust — это будущее JavaScript-инфраструктуры

Добрый день, меня зовут Павел Поляков, я Principal Engineer в каршеринг-компании SHARE NOW, в Гамбурге в Германии. А ещё я автор Telegram-канала «Хороший разработчик знает».

Сегодня я хочу поговорить о том, какое влияние Rust уже оказывает на JavaScript-тулинг и как это влияние может возрасти в будущем. Это перевод оригинальной статьи.

Rust — это будущее JavaScript-инфраструктуры

Rust — это быстрый, надёжный и эффективный по использованию памяти язык программирования. Шесть лет подряд он побеждает как наиболее любимый язык программирования в опросе на StackOverflow. Изначально он был создан Mozilla, а сейчас используется в Facebook, Apple, Amazon, Microsoft и Google для работы с инфраструктурой, шифрования, виртуализации и других низкоуровневых областях программирования.

Почему именно Rust сейчас начинает заменять важные части JavaScript-экосистемы, такие как митификация(Terser), транспиляция (Babel), форматирование (Prettier), бандлинг (webpack), линтинг (ESLint) и другие?

Что такое Rust?

Rust помогает разработчикам писать быстрое и эффективное по памяти программное обеспечение. Это современная замена Cи или C++ с фокусом на code safety и лаконичный синтаксис.

Rust достаточно отличается от JavaScript. JavaScript пытается находить переменные или объекты, которые уже не используются, и автоматически стирает их из памяти. Это называется «сборка мусора». Язык позволяет разработчику не думать о том, чтобы вручную управлять памятью.

С Rust разработчики имеют больше контроля над выделением памяти и это не так болезненно, как в C++.

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

Внедрение

Помимо компаний, которые приведены выше, Rust так же используется в популярных open-source библиотеках, таких как:

Rust просто умножил производительность в нашей команде, ставка на него — это одно из лучших решений, которые мы приняли. Его эргономика и фокус на корректности помогли нам приручить сложность нашего процесса синхронизации. Это было даже важнее чем производительность. Мы можем закодировать сложные инварианты про нашу систему и система типов с компилятором будет проверять их за нас.

Dropbox.Tech

С JavaScript в Rust

JavaScript является наиболее распространенным языком программирования, он есть на любом устройстве, где есть веб-браузер. За последние десять лет вокруг языка выросла большая экосистема:

  • Webpack: разработчики хотят склеить много JavaScript файлов в один;
  • Babel: разработчики хотят использовать современный JavaScript, но всё ещё поддерживать старые браузеры;
  • Terser: разработчики хотят генерировать максимально маленькие по размеру файлы;
  • Prettier: разработчики хотят код-форматтер, который работает без всякой конфигурации;
  • ESLint: разработчики хотят находить проблемы в своём коде до того, как он попадёт на продакшен.

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

SWC

SWC Rust — проект созданный в 2017. Это расширяемая платформа для создания следующего поколения быстрых инструментов разработчика. Платформа используется Next.js, Parcel и Deno, а также такими компаниями как Vercel, ByteDance, Tencent и Shopify.

SWC используется для компиляции, минификации, бандлинга и других задач. Платформа создана специально, чтобы её расширяли.

SWC — то, что вы вызываете, чтобы трансформировать код. Можно использовать готовые способы трансформации или разработать свои. Их выполнение происходит через инструменты более высокого уровня, например Next.js.

Deno

Deno, созданный 2018 — это простая, современная и безопасная среда исполнения для JavaScript и TypeScript, которая использует V8 и написана на Rust. Это попытка заменить Node.js, написанная создателем Node.js. Несмотря на то, что Deno был создан в 2018, он получил V1 только в мае 2020.

Линтер, форматирование кода и генерация документации, которые предоставляет Deno используют SWC.

esbuild

esbuild, созданный в январе 2020 года — это JavaScript-бандлер и минификатор, который работает в 10-100 раз быстрее, чем существующие инструменты. Написан на Go.

Я пытаюсь создать инструмент для сборки который:

  • отлично работает в тепличных условиях и обычных сценариях (бандлинг JavaScript, TypeScript и, возможно, CSS);
  • обнуляет ожидания комьюнити о том, что значит, для инструмента для сборки для JavaScript, работать быстро.

Мне кажется, что текущие инструменты слишком медленные.

Эван, , создатель esbuild

Создание инструментов для JavaScript на таких «системных» языках программирования как Go и Rust было необычным, пока не появился esbuild. Мне кажется, что он своим примером подстегнул интерес сообщества к тому, чтобы сделать инструменты для разработчиков ещё быстрее.

Эван выбрал Go:

Версия на Rust, наверное, показала бы похожую скорость, при должных усилиях. Но, в целом, мне было более приятно работать с Go. Это мой сайдпроект и мне должно быть весело работать над ним.

Эван, , создатель esbuild

Некоторые спорят, что Rust показал бы ещё лучшую производительность. Оба языка помогли Эвану достигнуть первоначальной цели — повлиять на сообщество.

Даже с базовыми оптимизациями, Rust смог бы превзойти вылизанную Go версию. Это яркое свидетельство того, как просто писать эффективные программы на Rust, по сравнению с глубокой оптимизацией, которую мы вынуждены делать в случае с Go.

Rome

Rome, созданный в августе 2020 — это линтер, компилятор, бандлер, тест-раннер и многое другое для JavaScript, TypeScrip, HTML, JSON, Markdown и CSS. Цель этого инструмента — заменить и объединить все существующее разнообразие инструментов для фронтэнд-разработки. Rome создал Sebastian, который также является создателем Babel.

Почему Babel пришлось переписать?

Чтобы внести в Babel модификации, которые позволили бы ему стать надёжной базой для других инструментов, потребовалось бы изменить практически всё. Архитектура Babel основывается на решениях которые я принял в 2014, когда я только узнавал что такое парсеры, AST и компиляторы.

Sebastian

Rome написан на TypeScript и выполняется на Node.js. Но сейчас ведётся работа по переписыванию проекта с использованием Rust. Будет использован RSLint парсер и собственная система по обходу AST (abstract syntax tree).

NAPI

Node.js интегрируется с Rust лучше, чем с любыми другими низкоуровневыми языками.

napi-rs позволяет вам разрабатывать прекомпилированные Node.js расширения на Rust. Фреймворк представляет готовые решения для кросс-компиляции и публикации готовых бинарных файлов в npm, без необходимости выполнять node-gyp или postinstall-скрипты.

Вы можете написать Rust-модуль, который будет напрямую вызван с Node.js без необходимости создавать дополнительный процесс, как делает esbuild.

Rust + WebAssembly

WebAssembly (WASM) — это низкоуровневый язык в который можно скомпилировать Rust. Он работает в браузере и может взаимодействовать с JavaScript. WebAssembly поддерживает большинство современных браузеров.

WASM определённо намного быстрее чем JavaScript, но всё ещё несравним с нативными языками. В наших тестах Parcel на WASM работает в 10-20 раз медленнее, по сравнению с тем, когда он скомпилирован в нативный бинарник.

Devon Govett

Пока WASM не является идеальным решением, но он всё равно может помочь разработчикам делать быстрые продукты. Команда Rust уверена, что они делают качественную и эффективную реализацию WASM. Для разработчиков это значит, что вы можете получить плюс к производительности, если пишите на Rust и компилируете для веба (в WASM).

Некоторые библиотеки доступны уже сейчас:

Эти веб-фреймворки, написанные на Rust=, компилируются в WASM. Они не пытаются заменить JavaScript, а работают вместе с ним. Мы ещё не в конце пути, но уже сейчас интересно наблюдать, как Rust подбирается к вебу с двух сторон: он делает текущие инструменты JavaScript быстрее и позволяет работать над перспективными идеями, как компиляция в WASM.

Везде Rust.

А почему не Rust?

Потому что у Rust крутая кривая обучения. Потому что с Rust вы работаете с абстракциями более низкого уровня, чем те, к которым привыкли современные веб-разработчики.

Как только вы начинаете работать с нативным кодом (через Rust, Go, Zig или другие низкоуровневые языки программирования), важнее становятся алгоритмы и структуры данных, а не сам язык программирования. Это не «серебряная пуля».

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

Tom MacWright

Использование Rust в веб-сообществе всё ещё встречается нечасто. Его пока не внедряют. широко. И изучение Rust само по себе является барьером, для разработки инструментов для JavaScript. Но несмотря на это, разработчики говорят, что лучше они получат быстрый инструмент, в который будет сложнее вносить изменения. Быстрые программы побеждают.

Сейчай сложно найти Rust-библиотеку или фреймворк для многих обычных задач (таких, как аутентификация, базы данных, платежные системы и многие другие). Но я думаю, что как только Rust и WASM достигнут широкого распространения эта проблема решится сама по себе. Мы нуждаемся в текущих JavaScript-решениях, которые помогают нам решать эти проблемы. Эти решения можно постепенно улучшать, с точки зрения производительности.

Будущее инструментов JavaScript

Я уверен, что Rust — это будущее инструментов для JavaScript. Next.js 12 уже начал трансформацию, чтобы полностью заменить Babel (транспиляция) и Terser (минификация) на SWC. Почему?

  • Расширяемость. SWC может быть использован как Crate внутри Next.js без необходимости делать форк-библиотеки или как-то обходить ограничения в архитектуре.
  • Производительность. Мы смогли достичь ускорения обновления в 3 раза и ускорения сборки проекта в 5 раз, когда переключились на SWC. Другие оптимизации ещё в работе.
  • WebAssembly. Поддержка WASM в Rust является важнейшей. Потому что множество платформ поддерживают WASM, а значит Next.js можно будет запускать везде.
  • Сообщество. Rust сообщество и экосистема являются удивительными и они продолжают рост.

Не только Next.js адоптирует SWC, а ещё:

  • Deno. Линтер, форматирование кода и генерирование документации используют SWC;
  • dprint использует SWC. Это код форматтер, который работает в 30 раз быстрее Prettier;
  • Parcel увеличил производительность сборки в 10 раз с помощью SWC.

Parcel использует SWC как библиотеку. До этого мы использовали парсер Babel и специальные трансформации, которые писали на JavaScript. Сейчас мы используем парсер SWC и специальные трансформации на Rust. Такие, как реализация хоистинга области видимости, сборка зависимостей и другие. Это похоже на то как Deno построен на SWC.

Devon Govett

Для Rust всё только начинается. Пару важных моментов всё ещё нужно решить:

  • Плагины. Написание плагинов на Rust очень затруднено для многих JavaScript разработчиков. В то же время, если сделать доступной написание плагинов на JavaScript, то можно лишиться всех преимуществ производительности. Хорошее решение ещё не нашли. В идеале, в будущем можно будет объединить и JavaScript и Rust. Если вы хотите написать плагин на JavaScript — пожалуйста, но вы потеряете в скорости. Нужна хорошая производительность? Тогда используйте API Rust для плагинов.
  • Бандлинг. Есть интересные разработки в этом направлении — swcpack , это SWC замена для Webpack. Инструмент ещё разрабатывается, но выглядит перспективно.
  • WebAssembly. Как упоминалось выше, идея писать на Rust и компилировать в WebAssembly очень заманчива. Но есть над чем работать.

Несмотря на всё это, я уверен, что Rust продолжить оказывать большое влияние на JavaScript экосистему в ближайшие 1-2 года. Представьте мир, где все инструменты сборки, которые используются в Next.js, переписаны на Rust и работают значительно быстрее. Тогда Next.js сможет распространяться как статический бинарник, который вы сможете скачать с NPM.

Это и есть мир в котором я хочу жить (и разрабатывать).

А ещё…

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

А для любителей картинок и историй есть Instagram.

Спасибо ?