раздел 23
Rust
Системный Rust по лесенке блоков: от владения, трейтов и модульной системы через биты и машинный уровень, Rustonomicon и макросы к трём проектам (эмулятор учебного процессора с HAL, эмулятор NES, сетевой игровой движок со своим протоколом), async изнутри, атомикам на уровне книги Мары Бос и Rust в браузере через WebAssembly. Безопасность памяти без сборщика мусора, нулевые абстракции. Сверху пристыкован подкластер Functional DDD на Rust (доменные типы, Decider, event store на Postgres, CQRS-проекции) на сквозном домене бронирования отеля и отдельный урок про внедрение зависимостей (трейты, экстракторы axum, системы bevy и регистрация до main). Дальше раздел Web3 на Rust.
Начать разделРаздел открыт для всех. Войди, чтобы отмечать пройденные уроки, вести заметки и решать задачи в редакторе. войти
Уроки раздела
- Зачем Rust. rustup, cargo и первая программа
- Базовые типы и поток управления: разбираемся без стресса
- Владение: move, Copy, drop и RAII
- Заимствование, ссылки и срезы
- Структуры и методы
- Перечисления и pattern matching
- Коллекции и строки
- Обработка ошибок: Result, ? и свои типы
- Дженерики и ограничения
- Что такое трейт
- Стандартные трейты
- Трейт-объекты и диспетчеризация
- Итераторы и замыкания
- Модули, крейты и видимость
- Cargo, workspaces и архитектура проекта
- Экосистема: serde, clap, tokio и docs.rs
- Идиоматичный и защищённый Rust
- Биты, байты и endianness
- Целые числа и дополнительный код
- Вещественные числа и IEEE-754
- Машинный уровень: ассемблер и дизассемблер
- Раскладка в памяти и repr
- Кодируем битики: bit reader, varint, zigzag
- Умные указатели и внутренняя мутабельность
- Связный список тремя способами
- Лайфтаймы вглубь
- Вариантность
- DST и толстые указатели
- Маркерные трейты
- Unsafe Rust
- Дженерики на максималках
- Декларативные макросы
- Гигиена и паттерны макросов
- Процедурные макросы: derive
- Attribute-like и function-like макросы
- Архитектура эмулятора
- Состояние процессора и шина
- Декодирование инструкций
- MMIO и прерывания
- HAL как набор трейтов
- Отладчик и тестирование
- Архитектура NES
- Ядро 6502
- Картридж и мапперы
- PPU и фон
- Спрайты
- APU и звук
- Сборка и запуск игры
- Async-десахаринг: машина состояний
- Pin и самоссылающиеся структуры
- Свой исполнитель
- Tokio изнутри
- Отмена и select!
- Stream и каналы
- Потоки, Send и Sync: что обещают эти трейты
- Разделяемое состояние: Arc, Mutex и RwLock
- Атомики и порядки памяти
- Строим примитивы синхронизации
- Lock-free: структуры без замков
- Аппаратная модель: кэши, MESI и false sharing
- Сокеты с нуля: TCP, UDP и байты на проводе
- Проектируем игровой протокол: varint, биты и дельты
- Сериализация: кодек, порядок байт и граница доверия
- Сервер на tokio: авторитетный тик, рассылка, backpressure
- Netcode: предсказание, реконсиляция, лаг-компенсация
- Надёжность поверх UDP: acks, переотправка, перегрузка
- Что такое WebAssembly: стековая машина и линейная память
- Мост Rust и JS: wasm-bindgen, срезы без копий и колбэки
- Эмулятор в браузере: кадр в canvas, ввод и звук
- Мощь и пределы WASM: бенчмарк, размер, SIMD, потоки
- Капстоун: переиспользуемый движок виджетов и крючок для Web3
- Доменные типы на Rust: newtype, TryFrom, приватные поля
- Decider на Rust: decide, evolve, replay и явное время
- Event store на Postgres: sqlx, транзакция, оптимистичная блокировка
- Async-проекции и CQRS на Rust: broadcast, tokio, watch
- Внедрение зависимостей в Rust: трейты, axum, bevy и жизнь до main
- Тип одного варианта: компоненты пути
- Функциональный интерфейс через владение
Темы и кластеры
Язык, владение, типы
- Базовые типы и поток управленияСкаляры (целые, float, bool, char), составные (кортежи, массивы), mutability и shadowing, выражение против инструкции, ветвления и циклы, функции.есть урок
- Владение: move, Copy и dropПеремещение против Copy, drop и RAII, стек против кучи, передача владения в функции. Ресурс это не только память, но и файл, сокет, блокировка.есть урок
- Зачем Rust, тулчейн и первая программаБезопасность памяти без сборщика мусора и нулевые абстракции. rustup, cargo, clippy, rustfmt, rust-analyzer. Первая программа и владение на пальцах.есть урок
- Структуры и методыИменованные и кортежные структуры, impl, методы и ассоциированные функции, self/&self/&mut self, конструкторы и паттерн билдера.есть урок
- Заимствование, ссылки и срезыОбщие &T и эксклюзивные &mut T, правила borrow checker, non-lexical lifetimes, срезы строк и массивов. Висячих ссылок не существует по построению.есть урок
- Коллекции и строкиVec, HashMap, BTreeMap, HashSet, VecDeque, String против &str, владение в коллекциях, Cow как тизер, выбор структуры по задаче.есть урок
- Обработка ошибокpanic против Result, оператор ?, свои типы ошибок через thiserror, anyhow на границе приложения, конверсия ошибок, когда паниковать допустимо.есть урок
- Перечисления и pattern matchingДанные в вариантах, Option и Result, match как исчерпывающий разбор, if let, let else, slice patterns. Невозможные состояния невыразимы.есть урок
Трейты, дженерики, итераторы
- Дженерики и ограниченияПараметры типов, where, ограничения трейтами, мономорфизация и её цена, дженерик-функции, структуры и методы, turbofish.есть урок
- Что такое трейтПоведение с законами, impl Trait for Type, методы по умолчанию, trait bounds, impl Trait в аргументах и возврате, blanket impl, derive. Чем трейт отличается от наследования и интерфейса.есть урок
- ИтераторыТрейты Iterator и IntoIterator, ленивые адаптеры, свой итератор, замыкания Fn/FnMut/FnOnce, итератор как трейт в действии, цена против цикла.есть урок
- Стандартные трейтыDisplay и Debug, From и TryFrom, Default, Clone и Copy, Eq/Ord/Hash, Index, перегрузка операторов, Deref и deref coercion, Drop и RAII.есть урок
- Трейт-объекты и диспетчеризацияdyn, vtable, толстые указатели, type erasure, object safety, статическая мономорфизация против динамической диспетчеризации, когда какой.есть урок
Модули, проекты, идиомы
- Модули, крейты, видимостьДерево модулей и пути, pub, use и re-export, крейт против модуля, std/core/alloc, prelude, разбиение кода на файлы, граница API через экспорт.есть урок
- Тур по экосистемеserde, clap, anyhow и thiserror, rayon, reqwest, tokio, axum/actix, sqlx/diesel. Как читать docs.rs, выбирать крейт и не игнорировать нестандартные библиотеки.есть урок
- Cargo и архитектура проектаCargo.toml, профили, workspaces, разбиение на lib плюс bin, feature flags, semver, как выглядит типичный Rust-проект, слоистая архитектура.есть урок
- Функциональный интерфейс через владениеПоглощающий self сохраняет контроль вызывающей стороны и позволяет менять единственную версию изнутри. Снимки, повторное использование буфера, аффинность и пределы чистоты.есть урок
- Идиоматичный и защищённый RustCow и conditional allocation, mem::take вместо лишнего clone, slice patterns, enum вместо bool-параметров, must_use, non_exhaustive, sealed-конструкторы, TryFrom вместо хрупкого From, исчерпывающий match.есть урок
- Тип для отдельного варианта enumУзкие типы для Component::Normal и ParentDir сохраняют результат разбора. Заимствование вместо лишнего копирования, безопасная сигнатура join и границы гарантий о путях.есть урок
Биты и машина
- Представление информацииБиты, байты, endianness, to_le_bytes и to_be_bytes, побитовые операции, маски, сдвиги, трюки с битами.есть урок
- Целые и дополнительный кодДополнительный код, знак и беззнак, переполнение и его семантика, wrapping/checked/saturating/overflowing, расширение и усечение.есть урок
- Вещественные числаIEEE-754, знак, экспонента, мантисса, денормали, NaN и бесконечности, потеря точности, f32 против f64, тотальный порядок и сравнение.есть урок
- Кодируем битикиBit reader и bit writer, varint и zigzag, упаковка флагов и битовых полей, сериализация на байтах, основа будущего протокола.есть урок
- Машинный уровеньx86-64 ассемблер, читаем дизассемблер через godbolt и cargo-asm, стековые кадры, соглашение о вызовах, во что превращается цикл и match.есть урок
- Раскладка в памятиСтек против кучи, layout структур и enum, repr(C)/packed/transparent, выравнивание и padding, size_of и align_of, niche-оптимизация.есть урок
Глубокий core
- Умные указатели и внутренняя мутабельностьBox, Rc, RefCell, Cell, Cow, когда нужна interior mutability, Weak и разрыв циклов Rc, цена подсчёта ссылок.есть урок
- Лайфтаймы вглубьПодтипизация времён жизни, elision, static, borrow checker как граф ограничений, ловушки с возвратом ссылок, лайфтаймы в структурах.есть урок
- Маркерные трейтыSend, Sync, Sized, Copy, Unpin, auto-трейты и негативные impl, PhantomData как инструмент моделирования инвариантов, что каждый гарантирует.есть урок
- Связный список тремя способамиБезопасный на Box, разделяемый на Rc и RefCell, и unsafe на сырых указателях. Учебник too-many-lists как повод подружиться с borrow checker.есть урок
- DST и толстые указателиstr и [T], unsized coercion, раскладка толстого указателя (данные плюс метаданные), ?Sized, связь с object safety.есть урок
- ВариантностьКовариантность, контравариантность, инвариантность, почему &mut T инвариантен, роль PhantomData, как это связано с безопасностью.есть урок
- Дженерики на максималкахАссоциированные типы против дженерик-трейтов, GAT, const generics, HRTB и for<a>, проблема выражения и её цена, type-level паттерны.есть урок
- Unsafe RustСырые указатели, неопределённое поведение, правила алиасинга и Stacked/Tree Borrows, MaybeUninit, контракт безопасной обёртки, miri, FFI-граница.есть урок
Макросы
- Гигиена и паттерныГигиена макросов и захват переменных, передача идентификаторов, рекурсивные макросы, отладка через cargo expand, ограничения и когда декларативный макрос оправдан.есть урок
- Декларативные макросыmacro_rules!, матчеры ($x:expr, :ident, :ty, :tt), повторения, несколько правил, во что разворачивается println!, токенизация и token trees, AST против token trees.есть урок
- Процедурные макросы: deriveКрейт proc-macro и TokenStream, syn и quote, парсинг DeriveInput, генерация impl, свой derive, как устроен serde::Serialize под капотом.есть урок
- Attribute-like и function-like макросыproc_macro_attribute и proc_macro, helper-атрибуты, span и сообщения об ошибках, как работают tokio::main и derive из clap, экосистема proc-macro2.есть урок
Проект 1 · эмулятор CPU и HAL
- Отладчик и тестированиеДизассемблер, пошаговый отладчик, точки останова, дамп состояния, цикл-точность и golden-трейсы, как тестировать эмулятор.есть урок
- Архитектура эмулятораЧто такое эмуляция, уровни точности, интерпретация против динамической рекомпиляции, цикл fetch-decode-execute, проектируем учебную ISA bcpu.есть урок
- Декодирование инструкцийРежимы адресации, таблица опкодов, диспетчеризация, ALU на битах, флаги по результату операции.есть урок
- Состояние процессора и шинаРегистры, флаги, программный счётчик, стек, абстракция Bus как трейт, разделение CPU и памяти.есть урок
- HAL как набор трейтовGPIO, таймер, UART как абстракции, тестовые заглушки против реальной периферии, generic-драйвер поверх HAL, разделение механизма и политики.есть урок
- MMIO и прерыванияMemory-mapped I/O и периферия, регистры устройств, таймеры, прерывания и их вектора, тактирование и цикл-бюджет.есть урок
Проект 2 · эмулятор NES
- Архитектура NES6502, PPU, APU, картридж и мапперы, шина и зеркалирование, формат iNES, обзор проекта.есть урок
- Картридж и мапперыiNES и NES 2.0, PRG и CHR ROM, переключение банков, NROM, MMC1, UxROM, абстракция маппера как трейт.есть урок
- Сборка и запуск игрыКонтроллеры, кадровый тайминг, синхронизация CPU, PPU и APU, запуск реальной игры, профилирование и оптимизация горячего цикла.есть урок
- Ядро 6502Полный набор официальных опкодов, флаги, режимы адресации, такты, страничные переходы, прохождение nestest до зелёного.есть урок
- APU и звукКаналы pulse, triangle, noise, DMC, envelope и sweep, генерация и ресемплинг звука, вывод аудио без щелчков.есть урок
- СпрайтыOAM, sprite evaluation, sprite 0 hit, приоритеты и прозрачность, ограничение восьми спрайтов на строку, тонкости тайминга.есть урок
- PPU и фонПалитры, nametables и attribute tables, паттерны и тайлы, конвейер рендера фона, скроллинг и регистры PPU, тайминг сканлайнов.есть урок
Async вглубь
- Stream и каналыStream и Sink, каналы mpsc, oneshot, broadcast, watch, backpressure, обработка потоков и батчинг.есть урок
- Отмена и select!Cancellation safety, drop как отмена, потеря частичного прогресса, ловушки select!, структурная конкурентность, таймауты и AbortHandle.есть урок
- Свой исполнительМинимальный однопоточный executor, очередь готовых задач, Waker руками, reactor поверх mio/epoll, как poll встречается с эпохой готовности.есть урок
- Async-десахарингasync fn как машина состояний, трейт Future, poll, Poll::Pending и Ready, Waker и Context, кто двигает футуру.есть урок
- Tokio изнутриМногопоточный планировщик, work-stealing, локальные и глобальные очереди, I/O-драйвер, таймерное колесо, budget и кооперативная вытесняемость.есть урок
- Pin и самоссылкиСамоссылающиеся структуры, почему футуру нельзя переместить после первого poll, Unpin, Pin<Box>, проекции и pin-project.есть урок
Многопоточность и атомики
- Потоки, Send и Syncspawn, scoped threads, гонки данных, что именно Send и Sync обещают, почему Rc не Send, а Arc Send.есть урок
- Разделяемое состояниеArc, Mutex, RwLock, poisoning, parking_lot, дедлоки и порядок захвата, когда блокировка это узкое место.есть урок
- Аппаратная модельКэши и строки кэша, MESI и cache coherence, false sharing и repr(align), барьеры процессора, x86 против ARM.есть урок
- Атомики и порядки памятиRelaxed, Acquire, Release, AcqRel, SeqCst, happens-before, release-acquire цепочки, total modification order.есть урок
- Строим примитивыСпинлок на AtomicBool, мьютекс через futex, condvar, экспоненциальный backoff, парковка и пробуждение потока.есть урок
- Lock-freeСвой упрощённый Arc, SPSC ring buffer, проблема ABA, fences, epoch-based reclamation, когда lock-free реально выигрывает.есть урок
Сети и Проект 3 · игровой протокол
- Сериализация и кодекserde и bincode, свой нулевой-копии кодек, endianness на проводе, валидация недоверенного ввода на границе, защита от мусора.есть урок
- Клиент и netcodeClient-side prediction, интерполяция и экстраполяция, серверная реконсиляция, компенсация лага, борьба с джиттером.есть урок
- Надёжность поверх UDPНумерация, acks и bitfield, переотправка, простой контроль перегрузки, сборка играбельного демо, замер латентности и профилирование.есть урок
- Проектируем игровой протоколФрейминг, varint и битовая упаковка, версионирование, полный snapshot против delta, бюджет пакета.есть урок
- Сервер на tokioПриём соединений, состояние мира, серверные тики, рассылка снапшотов, антифлуд и backpressure.есть урок
- Сокеты с нуляTCP и UDP через std::net, потом ниже к байтам и заголовкам, блокирующий против неблокирующего, сетевое программирование по CS:APP.есть урок
WASM: Rust в браузере
- Движок виджетовУпаковываем переиспользуемый WASM-движок для виджетов курса (единый контракт init, step, render, input), netcode-демо в браузере, крючок для Web3.есть урок
- Мост Rust и JSwasm-bindgen и wasm-pack, экспорт функций и структур, передача срезов памяти без копий, замыкания, доступ к canvas и Web Audio, сборка через Trunk.есть урок
- Что такое WebAssemblyСтековая виртуальная машина, линейная память, типы значений, модули и импорты, песочница и портируемость, как Rust компилируется в wasm32.есть урок
- Эмулятор в браузереbcpu и NES в браузере, рендер кадра в canvas, звук через Web Audio, ввод с клавиатуры, тайминг через requestAnimationFrame, шаговый режим.есть урок
- Мощь и пределы WASMБенчмарк против JS, размер бандла и оптимизация (wasm-opt, twiggy), профилирование, SIMD, потоки и атомики через web workers и shared memory.есть урок
Functional DDD на Rust
- Доменные типы на RustNewtype как номинальный тип, smart-конструкторы через TryFrom, приватные поля как граница доверия, инварианты DateRange и Money, ValueError как канал отказа.есть урок
- Decider на RustКоманды против событий, состояние как FSM-enum, тройка decide/evolve/initial Шассена, Decider как trait, чистая decide с явным временем, replay и его закон, BDD-тесты.есть урок
- Event store на PostgresAppend-only журнал, контракт EventStore, оптимистичная блокировка через expected_version, sqlx runtime-API без живой базы, транзакция и unique violation 23505 как ConcurrencyConflict.есть урок
- Async-проекции и CQRSCQRS, проекция как чистый фолд, идемпотентность, live-проекция на tokio::spawn поверх broadcast, watch как живой снимок, eventual consistency, итог трека Functional DDD.есть урок