Об авторе....21
О техническом рецензенте....22
Признательности....23
Предисловие....24
Скачивание архивов с исходным кодом и цветными изображениями....25
От издательства....26
Глава 1....27
Системное программирование на языке Rust....27
Введение....27
Содержание главы....27
Защищенность и производительность....28
Защита памяти....29
Обращение к памяти по пустому указателю....30
Переполнение буфера....35
Сборщик мусора....37
Многопоточность и параллелизм....40
Сопоставление с шаблоном....45
Времена жизни....46
Абстракции с нулевой стоимостью ....47
Интерфейс с внешними функциями (FFI)....49
Обработка ошибок....50
Контролируемые незащищенные операции....51
Инструментарий Rust ....51
Практические применения....52
Будущее вместе с Rust ....52
Отзывчивое сообщество ....53
За пределами основ....53
Заметные проекты на Rust....53
Установка Rust....55
Установка языка в Windows....55
Установка в Linux....57
Установка Rust в MacOS....58
Все готово к работе!....58
Интегрированная среда разработки и инструменты....58
Выбор интегрированной среды разработки....59
Visual Studio Code (VS Code)....59
Основные инструменты Rust....60
Менеджер пакетов....60
Анализатор исходного кода....60
Форматирование исходного кода....60
Написание первой программы на Rust....61
Начало работы....61
Написание исходного кода....61
Компиляция и запуск....61
Cargo: менеджер пакетов исходного кода на Rust....63
Знакомство с менеджером Cargo....63
Создание нового проекта....63
Навигация по структуре проекта....63
Сборка и запуск....64
Управление зависимостями....64
Тестирование и документация....65
Обследование других функциональных возможностей менеджера Cargo....65
Заключение....65
Дополнительные ресурсы....66
Вопросы для самопроверки....66
Ответы....69
Ключевые термины....69
Глава 2....72
Основы Rust....72
Введение....72
Содержание главы....72
Переменные и типы данных....73
Введение в переменные....73
Мутируемость....75
Затенение ....75
Константы....77
Числовые примитивы....78
Фиксированная ширина....79
Целочисленные типы....79
Символы и числовые типы....80
Строки и символы....82
Итерация по символам и операции со строковыми значениями....82
Использование числовых конвертаций....83
Арифметические операции....84
Сложение....85
Вычитание....85
Умножение....85
Деление....86
Взятие остатка от деления....86
Числа с плавающей точкой....87
f32 для эффективности....87
f64 для глубины точности....88
Литералы чисел с плавающей точкой....89
Математические операции....89
Ориентация в сложностях....90
Приближенное равенство....90
Освоение чисел с плавающей точкой....91
Булевы значения....91
Сложные типы данных....95
Строковые значения....95
Подстроки....96
Комбинирование строковых значений....96
Массивы....97
Преимущества фиксированного размера....98
Синтаксис и объявление....98
Надежность в сложных условиях....98
Кортежи....99
Деструктуризация кортежей....99
Управляющие конструкции....100
Условные инструкции....101
Циклы while....101
Циклы for....101
Конструкция loop....102
Выражения match....102
Функции....103
Явные сигнатуры ....103
Вложенные функции для модульности....103
Замыкания ....104
Владение, заимствование и времена жизни....104
Владение....104
Контролер заимствования ....105
Повышение производительности....106
Заключение....106
Вопросы для самопроверки ....106
Ответы....109
Ключевые термины....110
Глава 3....111
Общие черты и обобщения....111
Введение....111
Содержание главы....111
Общие черты....112
Реализация общих черт....112
Общая черта с дефолтным поведением....114
Границы общих черт....115
Расширение с помощью обобщений....116
Обобщения ....116
Адаптивные структуры....117
Ассоциированные функции....118
Ассоциированные типы....119
Объекты динамической диспетчеризации....121
Практические применения....122
Границы общих черт в стандартной библиотеке....124
Продвинутые шаблоны общих черт....125
Ассоциированные константы....125
Перегрузка операторов....125
Маркерные общие черты....126
Комбинирование общих черт....127
Избегание конфликтов общих черт....128
Всеохватывающие реализации....129
Суперчерты....130
Шаблон-обертка....131
Типы с динамически изменяемым размером....133
Условное соблюдение ....135
Программирование на уровне типов ....136
Соображения производительности....138
Заключение....138
Вопросы для самопроверки....139
Ответы....142
Глава 4....143
Встроенные в Rust структуры данных....143
Введение....143
Содержание главы....144
Массивы в Rust....144
Создание массивов....145
Доступ к элементам массива....145
Изменение элементов массива....147
Выполнение итераций по элементам массива в цикле....148
Взятие срезов из массивов....148
Многомерные массивы....150
Работа с методами массивов....151
Инициализация массивов и дефолтные значения....152
Инициализация дефолтными значениями....152
Генерирование шаблонов с помощью итераторов....152
Инициализация вычисляемыми значениями....152
Длина массива и проверка границ....153
Получение длины....153
Проверка границ ....154
Копирование и клонирование массивов....154
Копирование массивов....154
Клонирование массивов....154
Векторы....155
Создание векторов....156
Доступ к элементам и их изменение....156
Изменение векторов....157
Добавление элементов....157
Обновление элементов....158
Удаление элементов....159
Выполнение итераций по элементам в цикле....160
Использование цикла for....160
Использование метода iter_mut для мутируемой итерации....161
Использование метода enumerate для получения индекса и значения....162
Кортежи....162
Создание и инициализация кортежей....163
Доступ к элементам кортежа....163
Деструктуризация кортежей....164
Кортежные шаблоны и продвинутое использование....164
Варианты использования из реальной практики....165
Координатные вычисления....165
Обработка ошибок с помощью кортежей Result....165
Ограничения кортежей....166
Кортежи в операции сопоставления с шаблоном....166
Сопоставление кортежа с шаблонами....166
Игнорирование элементов кортежа....167
Вложенные кортежи и шаблоны....167
Опровержимость кортежных шаблонов ....168
Владение и заимствование в кортежах....168
Владение кортежами....169
Заимствование кортежей....169
Взятие срезов кортежей и оператор развертывания....170
Создание срезов элементов кортежей....170
Доступ к срезам кортежей ....171
Кортежи как аргументы функций и возвращаемые из них значения....171
Использование кортежей в качестве аргументов функций....171
Возврат кортежей из функций....172
Кортежные варианты перечислений....173
Создание вариантов перечислений с использованием кортежей....173
Срезы....174
Понимание срезов ....175
Создание срезов....176
Доступ к элементам среза....176
Изменение элементов среза....177
Практические применения....178
Манипуляция строковыми литералами....178
Обработка данных....179
Токенизация текста....180
Работа с двоичными данными....180
Отображение в память ....181
Хеш-множества в Rust....182
Создание множества....182
Обновление множества....183
Добавление элементов....183
Удаление элементов....183
Продвинутые операции на множествах....183
Симметрическая разность....184
Проверка на подмножество и надмножество....184
Практические применения....185
Дедупликация....185
Проверка на вхождение в множество ....186
Кеширование....186
Алгоритмы на графах....187
Операции на множествах....189
Тегирование и фильтрация ....190
Отслеживание уникальных значений ....191
Вопросы производительности....191
Вопросы конкурентного исполнения....192
Умные указатели Mutex....192
Атомарные типы ....193
Сериализация и десериализация....195
Нагрузочное тестирование и оптимизация....196
Хеш-словари....197
Создание хеш-словаря....197
Обновление хеш-словаря....198
Добавление элементов....198
Удаление элементов....199
Обновление элементов....199
Доступ к значениям....200
Выполнение итераций по элементам хеш-словаря в цикле....200
Продвинутые операции на хеш-словарях....202
Проверка существования ключа....202
API внесения записей....202
Очистка хеш-словаря....203
Емкость хеш-словаря....203
Практические применения....204
Подсчет вхождений....204
Мемоизация....205
Кеширование....205
Управление конфигурацией....206
Преобразование данных....207
Группировка данных....207
Графовые алгоритмы....208
Индексация баз данных....208
Заключение....209
Дополнительные ресурсы....210
Вопросы для самопроверки....212
Ответы....216
Глава 5....218
Обработка ошибок и восстановление после отказов....218
Введение....218
Содержание главы....219
Обработка ошибок с использованием типов Result и Option....219
Понимание типов Result и Option....219
Обработка ошибок с помощью типа Result....220
Обработка ошибок с помощью типа Option....221
Передача ошибок по стеку вызовов....222
Оператор ?....222
Обработка нескольких ошибок с помощью типа Result....224
Передача ошибок с использованием типов Result и Option....225
Создание конкретно-прикладных типов ошибок....226
Продвинутая обработка ошибок....227
Библиотека anyhow....227
Конкретно-прикладные типы ошибок с пакетом thiserror....228
Асинхронная обработка ошибок....230
Асинхронные функции и экземпляры типа Result....230
Конкретно-прикладные типы ошибок для асинхронного исходного кода....231
Обработка ошибок конкурентности....232
Обработка ошибок в веб-приложениях....233
Собираем все воедино....234
Разбор файлов и обработка ошибок....234
Обработка ошибок в консольных приложениях ....235
Использование библиотеки clap....236
Обработка сигналов и прерываний....237
Обработка ошибок при файловом вводе-выводе....238
Чтение и запись файлов....239
Работа с директориями....240
Обработка ошибок в сетевом программировании....240
Выполнение HTTP-запросов....241
Построение сетевых сервисов....241
Обработка ошибок в многопоточном исходном коде....243
Межпотоковый обмен данными....245
Тестирование и обработка ошибок....246
Написание тестов для обработки ошибок....246
Тестирование на основе свойств....247
Заключение....248
Справочные и дополнительные материалы....249
Вопросы для самопроверки....249
Ответы....253
Глава 6....254
Управление памятью и указатели....254
Введение....254
Содержание главы....255
Роль управления памятью....255
Трудности ручного управления памятью....256
Владение и заимствование....256
Висячие ссылки....258
Незащищенный исходный код ....259
Гонки за доступом к данным....260
Управление ресурсами....261
Стек и куча....261
Роль стека в Rust....263
Роль кучи в Rust....263
Модель владения ....264
Заимствование в Rust....265
Времена жизни в Rust ....265
Сырые и умные указатели....267
Умный указатель Box....267
Умный указатель Rc....269
Умный указатель Arc....270
Умный указатель RefCell....272
Умный указатель Mutex....273
Умный указатель RwLock....276
Атомарные операции....279
Незащищенный Rust....281
Незащищенные функции....281
Незащищенные пакеты....281
Конкретно-прикладные незащищенные абстракции....282
Интерфейс с внешними функциями....283
Рекомендации по написанию незащищенного исходного кода....284
Лучшие образцы практики управления памятью....284
Приоритет выделения памяти в стеке....285
Активное задействование ссылок ....285
Разумное использование умных указателей....285
Использование сопоставления с шаблоном....286
Аннотирование времен жизни....286
Надлежащее управление ресурсами....287
Многопоточность и конкурентность ....287
Осторожное использование незащищенного исходного кода....287
Профилирование и оптимизация....288
Продвинутое управление памятью....289
Конкретно-прикладные выделители памяти....289
Отображение файлов в память....291
Операционная совместимость с другими языками....292
Лучшие образцы практики управления памятью....293
Заключение....294
Глава 7....295
Управление конкурентностью....295
Введение....295
Содержание главы....295
Понимание конкурентного программирования....295
Параллелизм против конкурентности....296
Порождение потоков исполнения и управление ими....297
Коллективное использование данных между потоками исполнения....298
Конкурентные структуры данных....298
Базовое использование контейнера-синхронизатора Mutex....299
Коллективное использование данных между потоками....301
Предотвращение взаимных блокировок....302
Владение сторожами мьютекса....304
Обработка скомпрометированных мьютексов....305
Продвинутое использование мьютекса....306
Условное запирание на замок....306
Реализация защищенной мьютексом очереди ....308
Реализация защищенной мьютексом очереди с приоритетом....309
Обработка взаимных блокировок с помощью мьютекса....311
Мьютекс в многопоточном сценарии производитель–потребитель....312
Обследование контейнера-синхронизатора RwLock....314
Управление коллективными данными с помощью примитива синхронизации RwLock....314
Продвинутые варианты использования контейнера-синхронизатора RwLock в Rust....316
Динамическое количество читателей....316
Запирание на замок по времени....317
Предотвращение взаимных блокировок....319
Реализация объединения ресурсов в пул....320
Обмен данными между потоками исполнения и передача сообщений....322
Использование каналов для обмена данными....322
Передача сообщений с использованием структур....323
Атомарные операции....324
Продвинутый обмен данными между потоками исполнения....325
Координация потоков исполнения с помощью барьеров....326
Локальное для потока хранение данных....327
Библиотека crossbeam....329
Асинхронное программирование....330
Лучшие образцы практики программирования конкурентности....331
Заключение....332
Дополнительные ресурсы....333
Вопросы для самопроверки....334
Ответы....337
Ключевые термины....337
Глава 8....340
Консольные программы....340
Введение....340
Содержание главы....340
Введение в разбор аргументов....340
Преимущества использования библиотеки clap....341
Начало работы с библиотекой clap....342
Обработка нескольких аргументов....344
Обработка аргументов-флагов....346
Обработка продвинутых аргументов....347
Реализация логики поиска и замены текста....350
Обзор функциональности утилиты поиска и замены текста....350
Чтение входного файла....351
Логика поиска и замены....355
Запись измененного содержимого....358
Поиск без учета регистра символов (опционально)....361
Поддержка нескольких входных файлов....365
Заключение....368
Дополнительные ресурсы....369
Вопросы для самопроверки....370
Ответы....372
Ключевые термины....372
Глава 9....374
Работа с вводом-выводом с устройств на Rust....374
Введение....374
Содержание главы....375
Чтение из файлов и запись в файлы....375
Открытие файла....375
Чтение из файла....377
Запись в файл....378
Закрытие файла....381
Выполнение распространенных операций с файловой системой....382
Создание директорий....382
Переименование и перемещение файлов....383
Проверка метаданных из файлов....384
Удаление файлов и директорий....386
Обход директорий....387
Работа с путями к файлам....389
Чтение и запись двоичных данных....391
Обработка ошибок и типы Result....392
Работа с аппаратными устройствами....394
Продвинутые файловые операции ....396
Символические и жесткие ссылки....396
Запирание файлов на замок....398
Отображаемые файлы....402
Лучшие образцы практики файлового ввода-вывода ....403
Драйверы устройств и модули ядра....406
Сетевое программирование и ввод-вывод с устройств....407
Сокеты и протоколы....408
Асинхронное сетевое взаимодействие и ввод-вывод с устройств....411
Библиотеки для сетевого взаимодействия и ввод-вывод с устройств....415
Вопросы защищенности и кибербезопасности....416
Параллелизм, конкурентность и ввод-вывод с устройств....419
Реально-временные системы и ввод-вывод с устройств....421
Заключение....424
Дополнительные ресурсы....425
Вопросы для самопроверки....426
Ответы....428
Ключевые термины....429
Глава 10....431
Итераторы и замыкания....431
Введение....431
Содержание главы....431
Итераторы....431
Анатомия итератора....432
Ключевые общие черты: Iterator и IntoIterator....434
Создание итераторов с помощью функций from_fn и successors....436
Метод drain....439
Другие источники итераций....440
Адаптерные методы итераторов....443
Построение конкретно-прикладных итераторов....445
Ленивые вычисления....447
Продвинутые методы: flat_map, take, skip и peekable....448
Адаптерный метод flat_map....448
Адаптерные методы take и skip....449
Адаптерный метод peekable....450
Адаптерные методы filter_map, fuse и flatten....452
Адаптерный метод filter_map....452
Адаптерный метод fuse....453
Адаптерный метод flatten....455
Волшебство замыканий....456
Синтаксис замыканий....457
Захват переменных в замыканиях....457
Заимствование переменных....458
Перемещение переменных....459
Замыкания и общие черты Fn, FnMut, FnOnce....460
Замыкания Fn....460
Замыкания FnMut....461
Замыкания FnOnce....462
Итераторы для эффективной обработки данных....463
Накопление данных с помощью метода fold....464
Выстраивание итераторов в цепочку с помощью метода chain....465
Применение итераторов и замыканий в практических примерах....466
Вариант использования 1: анализ текста....466
Вариант использования 2: обработка изображений....468
Вариант использования 3: фильтрация и преобразование данных....469
Вариант использования 4: обработка сенсорных данных....471
Вариант использования 5: финансовые расчеты....472
Вариант использования 6: сортировка....474
Заключение....475
Дополнительные ресурсы....476
Вопросы для самопроверки....477
Ответы....480
Ключевые термины....480
Глава 11....482
Модульное тестирование на Rust....482
Введение....482
Содержание главы....482
Модульное тестирование....483
Написание тестовых функций и модулей....483
Написание простейшей тестовой функции....484
Тестовые модули....485
Тесты и результаты тестирования....486
Выполнение тестов....486
Интерпретация результатов тестирования....488
Сверки....490
Конкретно-прикладные сообщения об ошибках....492
Выполнение тестов с опциями....492
Фикстуры и исходный код подготовки....493
Условные тесты....499
Асинхронное тестирование....501
Создание заглушек для зависимостей....503
Тестирование приватных функций....504
Замеры производительности....506
Покрытие исходного кода ....507
Непрерывная интеграция....507
Заключение....508
Дополнительные ресурсы....509
Вопросы для самоконтроля....510
Ответы....513
Ключевые термины....513
Глава 12....516
Сетевое программирование....516
Введение....516
Содержание главы....517
Сетевое программирование....517
Разработка сетевых приложений....517
Протоколы связи: TCP и UDP....521
Протокол управления передачей (TCP)....522
Протокол пользовательских датаграмм (UDP)....525
Асинхронные сетевые операции....527
Асинхронное программирование....528
Асинхронный TCP-сервер....531
Варианты использования из реальной практики: обработка HTTP-запросов....532
Приложение для обмена сообщениями по сети....534
Сервер передачи файлов....537
Сервер дистанционного исполнения команд....539
Одноранговый обмен файлами ....541
Реально-временное коллаборативное редактирование....543
Заключение....547
Дополнительные ресурсы....548
Вопросы для самопроверки....549
Ответы....551
Ключевые термины....552
Глава 13....553
Незащищенное программирование на Rust....553
Введение....553
Содержание главы....553
Незащищенный исходный код....554
Сценарии использования блоков unsafe....555
Вопросы производительности и защищенности....557
Примеры из реальной практики....558
Пример 1: взаимодействие с базой данных через FFI....558
Пример 2: продвинутая обработка изображений....564
Пример 3: конкретно-прикладное управление памятью....567
Лучшие образцы практики использования незащищенного исходного кода....569
Нарушения защищенности памяти....571
Практические примеры....573
Практический пример 1: уязвимость Heartbleed....573
Практический пример 2: авария первого полета ракеты Ариан-5....576
Риски использования незащищенного исходного кода....581
Риск 1: обращение к памяти по пустому указателю....581
Риск 2: переполнение буфера....582
Риск 3: ошибки использования памяти после ее высвобождения....583
Заключение....584
Дополнительные ресурсы....585
Вопросы для самопроверки....586
Ответы....588
Ключевые термины....589
Глава 14....591
Асинхронное программирование....591
Введение....591
Содержание главы....591
Основы синтаксиса asyncawait Rust....592
Обследование динамики синтаксиса asyncawait....594
Использование библиотеки tokio....596
Использование ключевого слова async для повышения отзывчивости....596
Обработка ошибок в асинхронном исходном коде....598
Времена жизни конкурентных заданий....600
Продвинутые шаблоны асинхронного программирования....602
Асинхронные потоки данных....603
Управление ресурсами с помощью асинхронного завершения жизненного цикла....607
Разветвление и сведение в асинхронных потоках данных....609
Обработка отмен заданий и реализации тайм-аутов....612
Управление динамическими заданиями....613
Интеграция асинхронного и синхронного исходных кодов....615
Заключение....617
Дополнительные ресурсы....618
Вопросы для самопроверки....619
Ответы....621
Ключевые термины....621
Глава 15....623
Web Assembly на Rust....623
Введение....623
Содержание главы....623
Преимущества стандарта WebAssembly....624
Ограничения стандарта WebAssembly....624
Ограниченная поддержка веб-браузерами....625
Косвенная манипуляция объектной моделью документа....625
Сложности управления памятью....626
Rust для разработки в сопряжении со стандартом WebAssembly ....627
Установка инструментария Rust и стандарта WebAssembly ....627
Настройка нового проекта на Rust в связке с двоичным форматом инструкций Wasm....627
Сборка и тестирование модулей WebAssembly....628
Написание функций на Rust с привязкой к Wasm....629
Тестирование модуля WebAssembly....630
Примеры применения стандарта WebAssembly из реальной практики....631
Вариант использования 1: обработка изображений....632
Вариант использования 2: криптографические операции....636
Вариант использования 3: обработка сетевых запросов....639
Заключение....642
Дополнительные ресурсы....642
Вопросы для самопроверки....643
Ответы....645
Предметный указатель....646
В динамичной среде системного программирования, где высокие требования встречаются с инновациями, критически важно владеть языком, сочетающим в себе надежность и эффективность. Эта книга представляет собой всеобъемлющее руководство, которое выходит за рамки основ и раскрывает сложности языка лежащего в основе разработки стабильных, защищенных и высокопроизводительных систем. Уникальные функциональные средства языка Rust позволят вам писать чистый и точный исходный код.
Издание будет полезно не только системным программистам, заинтересованным в повышении профессионального уровня, но и всем изучающим программирование на языке Rust.