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