Rust кажется очень перспективным инструментом разработки, в том числе, применимым для разработки web-приложений. Rust позволяет генерировать компактные и быстрые нативные приложения. Забегая чуть вперёд, можно утверждать, что исполняемый файл (exe) для Windows x64-86, с примитивной реализацией web-сервера занимает всего 1,5 Мб и стартует быстрее, чем за секунду.
Rust часто сравнивают с языком программирования Go, но у этих языков разные цели и области применения. "Gophers value simplicity, Rustaceans value safety". Оба языка являются компилируемыми, но в Go используется Garbage Collector. Производительность и надёжность кода у Rust выше. Соответственно, ключевые области применения Rust: mission critical code и приложения, требующие максимальной вычислительной эффективности.
На Rust был переписан репозитарий npm и DNS-сервера от Cloudflare. Отмечается, что Rust-приложения обладают отличной предсказуемостью операций выделения памяти, чем не могут похвастаться приложения на Go, Java, JavaScript и платформы .NET.
Ещё одна важная возможность Rust - использование inline asm, что позволяет создавать супер-эффективные (в контексте расхода вычислительных ресурсов) приложения:
use std::arch::asm;
let mut x: u64 = 4;
unsafe {
asm!(
"mov {tmp}, {x}",
"shl {tmp}, 1",
"shl {x}, 2",
"add {x}, {tmp}",
x = inpot(reg) x,
tmp = out(reg) _,
);
}
assert_eq!(x, 4 * 6);
Также следует отметить статью Microsoft seeks Rust developers to rewrite core C# code by Richard Speed, в которой указывается, что Microsoft ищет специалистов для переписывания части инфраструктуры с C# на Rust (январь 2024 года). Требования к соискателям буквально следующие: "guiding technical direction, design and implementation of Rust component libraries, SDKs, and re-implementation of existing global scale C# based services to Rust". Справедливости ради, объявление о вакансии было размещено в Чехии и связано с переработкой облачных сервисов, для которых время поднятия контейнера - критически важная метрика, т.е. в данном случае, конечно же нет разговора об отказе от использования C#, но совершенно чётко указана ниша, в которой Rust значительно превосходит C#.
На конференции Open Source Summit 2023 Japan, Линус Торвальдс, выступая в keynotes, сообщил, что Rust пока ещё не доказал, что это "следующая большая вещь", но в 2024 году в Linux появятся драйвера, написанные на Rust. Торвальдс не пишет код на Rust, но читает его и может принимать решения о включении Rust-кода в Linux.
Приблизительно в том же направлении движется Google, который Google Spends $1 Million to Make Rust, C+ ‘Interoperable’ - это статья от 5 февраля 2024 года.
Беглый анализ Tutorial-ов позволил сделать заключение о том, что одной из наиболее популярных библиотек для разработки backend является Rocket.
Размер собираемого web-проекта (папка target) может составлять более 2,5Гб, что предполагает вместительный накопитель - как минимум в 512Гб. Особенно серьёзно этот аспект может влиять на сервера сборок с большим количеством проектов.
Для информации, размер папки "target" для web-проектов:
- с использованием Rocket 0.4 (Debug): 1164Мб
- с использованием Rocket 0.5 (Debug+Release): 2675Мб
Время загрузки зависимостей может составлять минуты, компиляция - десятки секунд.
В соответствии с conventions для имени проекта с Rust-кодом используется underscore names. Соответственно, стартовый проект был назван rust_web_server. Шаблонный код проекта на Rust был сгенерирован командой:
cargo new rust_web_server --bin
Флаг --bin
указывает, что cargo должен сгенерировать binary-based project.
Описание дополнительных команд CLI доступно по ссылке.
После генерации проекта сразу же возникает несколько чудес, которые могут причинить небольшие ментальные травмы, если эти чудеса сразу же не задавить. Во-первых, может потребовааться переключение Rust на nightly-версию, если рекомендуемый пример кода не работает. Часть синтаксических возможностей компилятора доступна только в nightly-версии.
В модели разработки языка Rust есть три канала выпуска (правила выпуска): ночной (Nightly), бета (Beta) и стабильный (Stable). Для большинства разработчиков подходит Stable-канал выпуска. Однако, если нужны некоторые экспериментальные возможности, может потребоваться выбрать Beta, или Nightly-канал. Выбор Beta-канала чаще всего обусловлен необходимостью понимания расхождений кодовой базы и новой версии языка и это канал используется на CI/CD.
Переход на ночной канал выпуска можно выполнить следующим образом:
rustup override set nightly
Проверочная команда:
cargo version
Более подробная информация о необходимости использования Nightly-версии компилятора с Rocket доступна здесь.
Вторая проблема - добиться когерентности между примером кода и устанавливаемой версией Rocket. При автоматическом добавлении зависимости командой cargo add rocket
была установлена версия Rocket 0.4.11. Чтобы увидеть версию, следует открыть файл "Cargo.toml", в котором есть раздел зависимостей:
[dependencies]
rocket = "0.4.11"
Стартовый пример приложения рекомендуется брать из раздела сайта Rocket, посвящённого конкретной версии продукта. Например, для Rocket 0.4 пример нужно брать именно из раздела версии 0.4.
Пример с которого ознакомление с Rocket начал я был таким (Rocket 0.4):
#![feature(proc_macro_hygiene, decl_macro)]
#[macro_use] extern crate rocket;
#[get("/hello/<name>/<age>")]
fn hello(name: String, age: u8) -> String {
format!("Hello, {} year old named {}!", age, name)
}
fn main() {
rocket::ignite().mount("/", routes![hello]).launch();
}
Сборка и запуск приложения осуществляются в Command Prompt (не PowerShell) следующими командами:
cd .\rust_web_server\
cargo build --release
cargo run
После запуска приложения к нему можно подключиться по URL: http://localhost:8000/hello/max/49
Сравнение версий Rocket приведено по ссылке 0.4.11 vs 0.5.0-rc2.
- SergioBenitez/Rocket - официальный репозитарий библиотеки Rocket, который также содержит примеры кода
- Creating a Web Service API Using Rust Rocket by Joseph Talon. Свежая статья, в которой используется Rocket 0.5.0-rc.2. Поскольку, по cargo установил 0.4.11, пример не собрался - не был найден атрибут #[launch]
- Building web apps with Rust using the Rocket framework by Ebenezer Don. В примере кода использовался Rocket 0.4.5 близкий к тому, что устанавливает Cargo
- Creating a Rust Web App with Rocket and Diesel by Raimi Karim. Diesel - это ORM и Query Builder для Rust
Следует заметить, что Rocket имеет build-in поддержку баз данных, таких как Postgres, MySQL, SQLite, Redis, Memcache. См. официальную документацию. В качестве облачной базы данных предлагается использовать SurrealDB
Rust подходит для разработки ПО для микроконтроллеров. Об этом, в частности, написана статья Rust on an STM32 microcontroller by Marco Amann.
- Tokio - управляемая по сообщениям (event-driven), не блокирующая платформа ввода/вывода (non-blocking I/O platform) для разработки асинхронных приложений ввода/вывода (back-end). Высокая популярность Tokio связана именно с асинхронностью. В базовых библиотеках Rust есть свой собственный web-сервер, но он не является асинхронным и очень сильно проигрывает в производительности, при сравнении с Tokio
- Serde - framework для сериализации/десериализации данных, например, JSON. Рекомендуется для ознакомления статья Кратко про Serde в Rust by artem badcasedaily1.
Один из продвигаемых на Medium фреймворков называется Yew. Рекомендуется к прочтению статья Exploring Yew, the rust-based frontend framework as a React Developer by Demola Malomo.
Slint - ещё один Framework для разработки Desktop-приложений на Rust.
Ключевая статья: Rust on an STM32 microcontroller by Marco Amann.
Установка кросс-компиляторов для Rust осуществляется таким образом:
rustup update
rustup component add llvm-tools-preview
rustup target add thumbv7em-none-eabihf
cargo install cargo-binutils cargo-embed cargo-flash cargo-expand
Также можно почитать о пректе Slint - это Framework для разработки GUI-приложений для Embedded-устройств. Бывшие разработчики Qt из Trolltech сделали новый Framework, который работает даже на микроконтроллерах с 256 Кб ОЗУ.
Рекомендуется для ознакомления автор - Dotan Nahum. Начать исследование темы покрытия кода тестами можно со статьи How to do code coverage in Rust.