
Книга служит введением в продвинутые темы, необходимые для реализации полнофункциональных проектов на языке Rust. Rust рассматривается как сравнительно новый, но мощный и зрелый язык для серверного программирования. Рассмотрены паттерны проектирования, характерные для Rust, роль Rust в современном низкоуровневом программировании, приемы асинхронных взаимодействий и управление памятью. Проиллюстрированы способы создания HTTP REST API на Rust, интеграция кода Rust с кодом на других языках, типичные идиомы и структуры данных, применяемые при профессиональной работе с Rust.
Для Rust-разработчиков и специалистов по системному программированию
Книга ориентирована на читателей, имеющих базовые представления о Rust
Язык Rust успел прославиться своей высокой производительностью, надёжностью и безопасностью. Но не так просто овладеть им в совершенстве, чтобы все эти достоинства раскрылись в полной мере. Эта книга поможет вам быстро стартовать в изучении сложных тем, уверенно приступить к работе с низкоуровневыми системами, веб-приложениями, заниматься асинхронным программированием, оптимизацией, писать конкурентный код.
С этой книгой вы сможете работать более продуктивно. Она насыщена примерами и, опираясь на уже имеющиеся у вас знания, познакомит вас со специфичными для Rust паттернами проектирования, приёмами асинхронного программирования, а также поможет интегрировать Rust с другими языками. Также в ней рассказано о замечательных инструментах для тестирования, анализа кода, управления жизненным циклом приложения на Rust. Всё самое нужное — под одной обложкой!
В этой книге:
- Структуры данных Rust
- Управление памятью
- Создание эффективных API
- Инструментарий Rust, средства для тестирования и многое другое
Каждый Rust-разработчик что-то найдёт для себя в этой книге. Просто кладезь советов.
Тим Макнамара, основатель компании Accelerant.dev, автор книги «Rust в действии»
Та самая книга, которая поможет стать Rust-профессионалом.
Хайме Лопес, Институт Гуттманна, Барселона
Практичная, удобная и понятная книга.
Сатедж Кумар Саху, компания «Боинг»
Для всех амбициозных растофилов.
Симон Чоке, компания German Edge Cloud
Краткое оглавление…………………………………………………………………………………. 5
Предисловие…………………………………………………………………………………………… 13
Благодарности……………………………………………………………………………………….. 15
Об этой книге………………………………………………………………………………………… 17
В чем особенность этой книги?………………………………………………………………………………………………… 17
Для кого она предназначена?…………………………………………………………………………………………………… 17
Структура книги………………………………………………………………………………………………………………………… 18
О программном коде………………………………………………………………………………………………………………….. 19
Дискуссионный форум liveBook……………………………………………………………………………………………….. 20
Об авторе……………………………………………………………………………………………….. 21
Об иллюстрации на обложке………………………………………………………………….. 23
Глава 1. Почувствуйте Rust!…………………………………………………………………… 25
1.1. Так чем же примечателен Rust?…………………………………………………………………………………………. 26
1.2. В чем же уникальность Rust?…………………………………………………………………………………………….. 28
1.2.1. Rust безопасен………………………………………………………………………………………………………….. 28
1.2.2. Rust современен………………………………………………………………………………………………………… 30
1.2.3. У Rust абсолютно открытый исходный код…………………………………………………………… 30
1.2.4. Сравнение Rust с другими популярными языками………………………………………………… 31
1.3. В каких случаях стоит воспользоваться языком Rust?……………………………………………………. 32
1.4. Требуемые инструменты……………………………………………………………………………………………………. 33
Резюме…………………………………………………………………………………………………………………………………………. 34
Часть I. Работа с Rust на профессиональном уровне…….. 35
Глава 2. Управление проектами с помощью Cargo………………………………… 37
2.1. Ознакомительный тур по Cargo…………………………………………………………………………………………. 38
2.1.1. Основное применение………………………………………………………………………………………………. 38
2.1.2. Создание нового приложения или библиотеки……………………………………………………… 39
2.1.3. Компиляция, запуск и тестирование………………………………………………………………………. 41
2.1.4. Переключения между наборами инструментов…………………………………………………….. 42
2.2. Управление зависимостями……………………………………………………………………………………………….. 43
2.3. Фича-флаги………………………………………………………………………………………………………………………….. 46
2.4. Корректировка зависимостей…………………………………………………………………………………………….. 49
2.4.1. Косвенные зависимости…………………………………………………………………………………………… 51
2.4.2. Лучшие методы корректировки зависимостей………………………………………………………. 51
2.5. Публикация крейтов……………………………………………………………………………………………………………. 52
2.5.1. CI/CD-интеграция…………………………………………………………………………………………………….. 52
2.6. Ссылки на библиотеки С……………………………………………………………………………………………………. 56
2.7. Бинарный дистрибутив………………………………………………………………………………………………………. 59
2.7.1. Кросс-компиляция……………………………………………………………………………………………………. 59
2.7.2. Создание статически связанных бинарных файлов……………………………………………… 60
2.8. Документирование Rust-проектов…………………………………………………………………………………….. 62
2.8.1. Примеры кода в документации……………………………………………………………………………….. 65
2.9. Модули………………………………………………………………………………………………………………………………… 66
2.10. Рабочие пространства……………………………………………………………………………………………………… 69
2.11. Пользовательские сценарии сборки………………………………………………………………………………… 71
2.12. Проекты Rust во встраиваемых средах…………………………………………………………………………… 73
Резюме…………………………………………………………………………………………………………………………………………. 75
Глава 3. Инструменты Rust……………………………………………………………………. 77
3.1. Общий обзор инструментария Rust…………………………………………………………………………………… 78
3.2. IDE-интеграция Rust: инструмент rust-analyzer……………………………………………………………….. 79
3.2.1. Установка rust-analyzer……………………………………………………………………………………………. 79
3.2.2. Магические завершения…………………………………………………………………………………………… 80
3.3. Поддержка аккуратности кода: инструмент rustfmt……………………………………………………….. 83
3.3.1. Установка rustfmt…………………………………………………………………………………………………….. 83
3.3.2. Конфигурирование rustfmt………………………………………………………………………………………. 84
3.4. Повышение качества кода: инструмент Clippy………………………………………………………………… 85
3.4.1. Установка Clippy………………………………………………………………………………………………………. 86
3.4.2. Clippy-линты……………………………………………………………………………………………………………… 86
3.4.3. Конфигурирование Clippy……………………………………………………………………………………….. 88
3.4.4. Автоматическое применение предложений Clippy……………………………………………….. 89
3.4.5. Использование Clippy в CI/CD………………………………………………………………………………… 89
3.5. Сокращение времени компиляции: инструмент sccache…………………………………………………. 90
3.5.1. Установка sccache……………………………………………………………………………………………………. 91
3.5.2. Конфигурирование sccache……………………………………………………………………………………… 91
3.6. Интеграция Rust с IDE-средами, включая Visual Studio Code…………………………………………. 91
3.7. Использование наборов инструментов: стабильные и ночные версии………………………….. 92
3.7.1. Функции, доступные только в ночной версии……………………………………………………….. 93
3.7.2. Использование nightly-функций в публикуемых крейтах……………………………………… 94
3.8. Дополнительные инструменты: cargo-update, cargo-expand, cargo-fuzz, cargo-watch, cargo-tree 94
3.8.1. Поддержание пакетов в актуальном состоянии: инструмент cargo-update……….. 95
3.8.2. Отладка макросов: инструмент cargo-expand……………………………………………………….. 95
3.8.3. Тестирование с применением libFuzzer…………………………………………………………………… 96
3.8.4. Периодический запуск Cargo-команд: инструмент cargo-watch………………………….. 97
3.8.5. Проверка зависимостей: инструмент cargo-tree……………………………………………………. 97
Резюме…………………………………………………………………………………………………………………………………………. 99
Часть II. Основные данные………………………………………………………. 101
Глава 4. Структуры данных…………………………………………………………………. 103
4.1. Строковые типы String, str, &str и &’static str…………………………………………………………………. 104
4.1.1. Сравнение String и str…………………………………………………………………………………………….. 104
4.1.2. Эффективное применение строк……………………………………………………………………………. 105
4.2. Что такое слайсы и массивы?………………………………………………………………………………………….. 108
4.3. Векторы……………………………………………………………………………………………………………………………… 111
4.3.1. Более глубокое погружение в Vec…………………………………………………………………………. 111
4.3.2. Обертывание векторов…………………………………………………………………………………………… 113
4.3.3. Типы, связанные с векторами………………………………………………………………………………… 113
4.4. Отображения……………………………………………………………………………………………………………………… 114
4.4.1. Пользовательские функции хеширования……………………………………………………………. 115
4.4.2. Создание хешируемых типов………………………………………………………………………………… 116
4.5. Типы Rust: примитивы, структуры, перечисления и псевдонимы………………………………… 117
4.5.1. Применение примитивных типов………………………………………………………………………….. 117
Целочисленные типы…………………………………………………………………………………………….. 118
Размерные типы…………………………………………………………………………………………………….. 119
Арифметика на примитивных типах……………………………………………………………………. 119
4.5.2. Использование кортежей……………………………………………………………………………………….. 121
4.5.3. Применение структур…………………………………………………………………………………………….. 122
4.5.4. Применение перечислений…………………………………………………………………………………….. 125
4.5.5. Применение псевдонимов………………………………………………………………………………………. 128
4.6. Обработка ошибок с помощью Result…………………………………………………………………………….. 129
4.7. Преобразование типов с помощью From/Into………………………………………………………………… 130
4.7.1. Типажи TryFrom и TryInto……………………………………………………………………………………… 132
4.7.2. Наиболее рациональные приемы преобразования типов с использованием From и Into 133
4.8. Обеспечение совместимости интерфейса внешних функций с типами Rust………………… 133
Резюме………………………………………………………………………………………………………………………………………. 135
Глава 5. Работа с памятью……………………………………………………………………. 137
5.1. Управление памятью: куча и стек…………………………………………………………………………………… 137
5.2. Представление о владении: копирование, заимствование, ссылки и перемещения……. 140
5.3. Глубокое копирование……………………………………………………………………………………………………… 142
5.4. Предотвращение копирования………………………………………………………………………………………… 144
5.5. Умные указатели: тип Box……………………………………………………………………………………………….. 146
5.6. Подсчет ссылок…………………………………………………………………………………………………………………. 151
5.7. Клонирование при записи………………………………………………………………………………………………… 155
5.8. Пользовательские распределители…………………………………………………………………………………. 159
5.8.1. Создание пользовательского распределителя…………………………………………………….. 160
5.8.2. Создание пользовательского распределителя для защищенной памяти………….. 163
5.9. Кратко об умных указателях…………………………………………………………………………………………… 169
Резюме………………………………………………………………………………………………………………………………………. 170
Часть III. Корректность кода……………………………………………………. 173
Глава 6. Модульное тестирование………………………………………………………… 175
6.1. Чем примечательно тестирование в Rust?………………………………………………………………………. 175
6.2. Встроенные функции тестирования………………………………………………………………………………… 177
6.3. Среды тестирования…………………………………………………………………………………………………………. 179
6.4. Компилятор лучше вас знает, что не нужно тестировать…………………………………………….. 184
6.5. Работа с особыми случаями параллельного тестирования и глобального состояния. 185
6.6. Размышления о реструктуризации………………………………………………………………………………….. 191
6.7. Инструменты реструктуризации……………………………………………………………………………………… 191
6.7.1. Переформатирование…………………………………………………………………………………………….. 192
6.7.2. Переименование……………………………………………………………………………………………………… 192
6.7.3. Перемещение…………………………………………………………………………………………………………… 194
6.7.4. Переписывание……………………………………………………………………………………………………….. 194
6.8. Охват кода…………………………………………………………………………………………………………………………. 196
6.9. Работа с меняющейся экосистемой…………………………………………………………………………………. 198
Резюме………………………………………………………………………………………………………………………………………. 198
Глава 7. Интеграционное тестирование……………………………………………….. 199
7.1. Сравнение интеграционного и модульного тестирования……………………………………………. 200
7.2. Стратегии интеграционного тестирования…………………………………………………………………….. 203
7.3. Сравнение встроенного и внешнего интеграционного тестирования………………………….. 205
7.4. Библиотеки и инструменты для проведения интеграционного тестирования…………….. 206
7.4.1. Использование assert_cmd для тестирования CLI-приложений………………………… 206
7.4.2. Использование с интеграционными тестами крейта proptest…………………………….. 210
7.4.3. Другие инструменты интеграционного тестирования………………………………………… 211
7.5. Fuzz-тестирование…………………………………………………………………………………………………………….. 211
Резюме………………………………………………………………………………………………………………………………………. 216
Часть IV. Асинхронный Rust…………………………………………………….. 217
Глава 8. Асинхронное программирование в Rust………………………………….. 219
8.1. Среды выполнения……………………………………………………………………………………………………………. 221
8.2. Асинхронное мышление…………………………………………………………………………………………………… 222
8.3. Фьючерсы: обработка результатов выполнения асинхронных задач………………………… 224
8.3.1. Режим бездействия…………………………………………………………………………………………………. 224
8.3.2. Определение среды выполнения с помощью #[tokio::main]………………………………. 227
8.4. Ключевые слова async и .await: когда и где их использовать?…………………………………….. 227
8.5. Конкурентность и параллелизм с async………………………………………………………………………….. 230
8.6. Реализация асинхронного наблюдателя………………………………………………………………………… 234
8.7. Смешивание синхронного и асинхронного кода…………………………………………………………… 240
8.8. Когда не стоит применять асинхронность?……………………………………………………………………. 243
8.9. Трассировка и отладка асинхронного кода…………………………………………………………………… 243
8.10. Работа с асинхронностью при тестировании………………………………………………………………. 247
Резюме………………………………………………………………………………………………………………………………………. 248
Глава 9. Создание сервиса HTTP REST API…………………………………………. 251
9.1. Выбор веб-фреймворка…………………………………………………………………………………………………….. 252
9.2. Построение архитектуры…………………………………………………………………………………………………. 253
9.3. Проектирование API…………………………………………………………………………………………………………. 254
9.4. Библиотеки и инструменты……………………………………………………………………………………………… 255
9.5. Создание шаблонов приложений……………………………………………………………………………………. 257
9.5.1. Функция main()……………………………………………………………………………………………………….. 257
9.5.2. Инициализация трассировки: init_tracing()…………………………………………………………. 259
9.5.3. Инициализация пула базы данных: init_dbpool()……………………………………………….. 260
9.6. Моделирование данных…………………………………………………………………………………………………… 262
9.6.1. SQL-схема……………………………………………………………………………………………………………….. 262
9.6.2. Взаимодействие с нашими данными…………………………………………………………………….. 263
9.7. Объявление API-маршрутов…………………………………………………………………………………………….. 267
9.8. Реализация API-маршрутов……………………………………………………………………………………………… 269
9.9. Обработка ошибок……………………………………………………………………………………………………………. 272
9.10. Запуск сервиса………………………………………………………………………………………………………………… 273
Резюме………………………………………………………………………………………………………………………………………. 278
Глава 10. Создание CLI-инструмента HTTP REST API…………………………. 279
10.1. Выбор используемых инструментов и библиотек……………………………………………………….. 280
10.2. Проектирование CLI………………………………………………………………………………………………………. 281
10.3. Объявление команд…………………………………………………………………………………………………………. 282
10.4. Реализация команд…………………………………………………………………………………………………………. 285
10.5. Реализация запросов………………………………………………………………………………………………………. 287
10.6. Надлежащая обработка ошибок…………………………………………………………………………………… 289
10.7. Тестирование нашего CLI……………………………………………………………………………………………… 289
Резюме………………………………………………………………………………………………………………………………………. 293
Часть V. Оптимизация………………………………………………………………… 295
Глава 11. Оптимизация кода………………………………………………………………… 297
11.1. Абстракции с нулевой стоимостью……………………………………………………………………………….. 297
11.2. Векторы……………………………………………………………………………………………………………………………. 299
11.2.1. Выделение памяти для вектора…………………………………………………………………………. 299
11.2.2. Итераторы векторов…………………………………………………………………………………………… 301
11.2.3. Быстрое копирование с помощью Vec и слайсов…………………………………………….. 303
11.3. Применение возможностей SIMD………………………………………………………………………………….. 305
11.4. Распараллеливание с применением Rayon………………………………………………………………….. 307
11.5. Использование Rust для ускорения программ на других языках……………………………….. 309
11.6. Что делать дальше?………………………………………………………………………………………………………… 311
Резюме………………………………………………………………………………………………………………………………………. 312
Приложение…………………………………………………………………………………………. 313
Установка инструментов для примеров, приводимых в книге…………………………………………….. 313
Установка инструментов на macOS с помощью Homebrew………………………………………… 313
Установка инструментов на системах под управлением Linux…………………………………… 313
Установка rustup на Linux- или UNIX-системах…………………………………………………………… 313
Установка инструментов на системах под управлением Windows……………………………… 314
Управление rustc и другими Rust-компонентами с помощью rustup…………………………………… 314
Установка rustc и других компонентов………………………………………………………………………….. 314
Переключение исходных наборов инструментов с помощью rustup………………………….. 315
Обновление Rust-компонентов……………………………………………………………………………………….. 315
Установка HTTPie……………………………………………………………………………………………………………. 315
Предметный указатель…………………………………………………………………………. 317
