Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Тема
Описание
Доп.

Официальные руководства и примеры

Статьи и блоги

Пример проекта

WebAssembly_Example

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

WebAssembly (WASM) — это бинарный формат, который может выполняться в браузере почти с нативной скоростью.

WASM не зависит от платформы и языка, поэтому разные языки (Rust, C, C++, AssemblyScript, Go) могут компилироваться в WASM. WASM работает в браузере, на сервере (например, WASI) и даже в embedded-устройствах. Один и тот же код можно запускать на разных платформах.

В браузере WASM работает в песочнице, безопасно и быстро.

WASM vs WebGPU. Используйте WebGPU, когда нужна производительность GPU для графики или параллельных вычислений.

КритерийRust/WASMWebGPU
Вычисления CPU✅ Отлично❌ Нет
GPU вычисления / рендер❌ Ограничено через WebGL✅ Отлично
Параллельная обработка✅ Ограничено CPU✅ Массивная на GPU
Взаимодействие с DOM✅ Через JS❌ Нет, нужен JS glue
ПримерыИгры, алгоритмы, визуализация 2D3D-графика, шейдеры, физика, нейросети

Client-side / WASM

  • cargo-web — подкоманда Cargo для компиляции и работы с клиентской частью Web (WASM).
  • leptos — full-stack, изоморфный веб-фреймворк с тонкой реактивностью для декларативного построения UI.
  • sauron — клиентский веб-фреймворк, который строго следует архитектуре Elm.
  • seed — фреймворк для создания веб-приложений на Rust.
  • stdweb — стандартная библиотека для клиентской разработки на WebAssembly.
  • tinyweb — минимальный Rust веб-фреймворк для WASM, ~800 строк кода.
  • yew — фреймворк для написания клиентских веб-приложений с компонентным подходом, похожим на React.

Сравнение клиентских WASM библиотек на Rust

БиблиотекаКомпонентная модельРеактивностьFull-stack / только клиентРазмер / простотаОсобенности
cargo-web❌ (инструмент, не фреймворк)только клиентсреднийПодкоманда Cargo для сборки и запуска WASM-кода
leptos✅ (тонкая реактивность)full-stackсреднийДекларативные UI, поддержка серверного рендеринга
sauron✅ (Elm-подобная модель)только клиентнебольшойСледует архитектуре Elm, простой поток данных
seed✅ (через Msg/Update)только клиентсреднийАрхитектура Elm, управляемый поток сообщений
stdweb❌ (низкоуровневая библиотека)только клиентнебольшойСтандартная библиотека для работы с Web API в Rust/WASM
tinyweb❌ (минимальный фреймворк)только клиенточень маленький~800 строк кода, минималистичный подход
yew✅ (через Properties/Msg)только клиентсредний / большойКомпонентный подход, похожий на React, популярный в сообществе

Краткий вывод

  • Для сложных, компонентных SPAyew, leptos, seed.
  • Для минимализма / учебных целейtinyweb, sauron.
  • Для low-level работы с WASM и DOMstdweb.
  • Для сборки и деплоя WASMcargo-web.
  • Full-stack подход с серверной поддержкойleptos.

godbolt.org - посмотреть в какой ассемблер превращается код

Утилита objdump так же покажет в какой ассемблер превращается код

$ objdump -Cd ./target/debug/hello_world

запись асемблерного кода

Hello, World!

youtube

Скопировать байты в линковщик в секцию text

File main.rs:

#![no_main]

#[link_section=".text"]
#[no_mangle]
pub static main:[u32;9] = [
    3237986353,
    3355442993,
    120950088,
    822083584,
    252621522,
    1699267333,
    745499756,
    1919899424,
    169960556
];

не создавать исполняемый файл, а сгенерировать только ассемблерный код

rustc factorial.rs -O --emit=asm