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

Корректность на уровне типов в Rust

О проекте

  • Курс основан на оригинальных материалах Rust Training. Лицензии: MIT (код) и CC-BY-4.0 (текст).
  • Русский перевод и адаптация выполнены участниками проекта RustTraining-Rus.
  • Замечания и исправления присылайте через Issues и Pull Requests репозитория.

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

Все паттерны здесь следуют одному принципу: переносите инварианты из проверок во время выполнения в систему типов, чтобы компилятор обеспечивал их соблюдение.

Как работать с книгой

Уровни сложности

СимволУровеньДля кого
🟢ВводныйУверенно владеете владением и трейтами
🟡СреднийЗнакомы с обобщениями и ассоциированными типами
🔴ПродвинутыйГотовы к typestate, phantom-типам и сессионным типам

Рекомендации по темпу

ЦельМаршрутВремя
Быстрый обзоргл. 01, гл. 13 (шпаргалка)30 мин
Разработчик IPMI / BMCгл. 02, 05, 07, 10, 172,5 ч
Разработчик GPU / PCIeгл. 02, 06, 09, 10, 152,5 ч
Реализация Redfishгл. 02, 05, 07, 08, 17, 183 ч
Фреймворки и инфраструктурагл. 04, 08, 11, 14, 182,5 ч
Новичок в корректности по построениюгл. 01 → 10 по порядку, затем упражнения гл. 124 ч
Полное погружениеВсе главы по порядку7 ч

Аннотированное оглавление

Гл.НазваниеСложностьКлючевая идея
1Философия: почему типы лучше тестов🟢Три уровня корректности; типы как гарантии, которые проверяет компилятор
2Типизированные командные интерфейсы🟡Ассоциированные типы связывают запрос с ответом
3Одноразовые типы🟡Семантика перемещения как линейные типы для криптографии
4Capability-токены🟡Токены-доказательства полномочий нулевого размера
5Автоматы состояний протоколов🔴Typestate для сессий IPMI и LTSSM в PCIe
6Анализ размерностей🟢Обёртки newtype не дают перепутать единицы измерения
7Проверенные границы🟡Разбор данных один раз на границе, доказательство хранится в типах
8Capability-миксины🟡Трейты-ингредиенты и blanket impl
9Phantom-типы🟡PhantomData для ширины регистров и направления DMA
10Собираем всё вместе🟡Все 7 паттернов в одной платформе диагностики
11Четырнадцать проверенных приёмов🟡Sentinel → Option, sealed-трейты, билдеры и др.
12Упражнения🟡Шесть итоговых задач с решениями
13Краткая шпаргалка—Каталог паттернов и блок-схема выбора
14Тестирование гарантий на уровне типов🟡trybuild, proptest, cargo-show-asm
15Const fn: доказательства корректности на этапе компиляции🟠Карты памяти, регистры и битовые поля
16Send и Sync: доказательства корректности конкурентности🟠Проверки конкурентности на этапе компиляции
17Пошаговый разбор: клиент Redfish🟡Восемь паттернов в типобезопасном клиенте Redfish
18Пошаговый разбор: сервер Redfish🟡Typestate билдера, токены источников, агрегация состояния здоровья, миксины

Что желательно знать заранее

КонцепцияГде изучить
Владение и заимствованиеПаттерны Rust, гл. 01
Трейты и ассоциированные типыПаттерны Rust, гл. 02
Newtype и typestateПаттерны Rust, гл. 03
PhantomDataПаттерны Rust, гл. 04
Обобщения и ограничения трейтовПаттерны Rust, гл. 01

Спектр корректности по построению

← Менее безопасно                                             Более безопасно →

Проверки в рантайме  Модульные тесты   Property-тесты        Корректность по построению
───────────────────  ────────────────  ──────────────        ──────────────────────────

if temp > 100 {      #[test]           proptest! {           struct Celsius(f64);
  panic!("слишком    fn test_temp() {    |t in 0..200| {     // Нельзя перепутать с Rpm
  жарко");               assert!(          assert!(...)       // на уровне типов
}                      check(42));     }
                     }                 }
                                                            Некорректная программа?
Неверный код?        Неверный код?     Неверный код?         Не скомпилируется.
Падает в проде.      Падает в CI.      Падает в CI           Её не существует.
                                       (вероятностно).

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