Ласкаво просимо в Comprehensive Rust 🦀
1.
Проведення курсу
❱
1.1.
Структура курсу
1.2.
Гарячі клавіші
1.3.
Переклади
2.
Використання Cargo
❱
2.1.
Екосистема Rust
2.2.
Приклади коду
2.3.
Локальний запуск Cargo
День 1: Ранок
3.
Ласкаво просимо
4.
Hello World!
❱
4.1.
Що таке Rust?
4.2.
Переваги Rust
4.3.
Ігровий майданчик
5.
Типи та значення
❱
5.1.
Hello World!
5.2.
Змінні
5.3.
Значення
5.4.
Арифметика
5.5.
Виведення типів
5.6.
Вправа: Фібоначчі
❱
5.6.1.
Рішення
6.
Основи потоку керування
❱
6.1.
Вирази if
6.2.
Цикли
❱
6.2.1.
for
6.2.2.
loop
6.3.
break та continue
❱
6.3.1.
Мітки
6.4.
Блоки та області застосування
❱
6.4.1.
Області видимості та затінення
6.5.
Функції
6.6.
Макроси
6.7.
Вправа: Послідовність Коллатца
❱
6.7.1.
Рішення
День 1: Полудень
7.
Ласкаво просимо
8.
Кортежі та масиви
❱
8.1.
Масиви
8.2.
Кортежі
8.3.
Ітерація масиву
8.4.
Патерни та деструктуризація
8.5.
Вправа: Вкладені масиви
❱
8.5.1.
Рішення
9.
Посилання
❱
9.1.
Спільні посилання
9.2.
Ексклюзивні посилання
9.3.
Зрізи
9.4.
Рядки
9.5.
Вправа: Геометрія
❱
9.5.1.
Рішення
10.
Типи, які визначаються користувачем
❱
10.1.
Іменовані структури
10.2.
Кортежні структури
10.3.
Перелічувані типи
10.4.
Константи
10.5.
Статика
10.6.
Псевдоніми типу
10.7.
Вправа: події в ліфті
❱
10.7.1.
Рішення
День 2: Ранок
11.
Ласкаво просимо
12.
Зіставлення зразків
❱
12.1.
Співставлення значень
12.2.
Деструктурування структур
12.3.
Деструктурування переліків
12.4.
Потік контролю Let
12.5.
Вправа: обчислення виразу
❱
12.5.1.
Рішення
13.
Методи та Трейти
❱
13.1.
Методи
13.2.
Трейти
❱
13.2.1.
Реалізація трейтів
13.2.2.
Супертрейти
13.2.3.
Асоційовані типи
13.3.
Виведення
13.4.
Вправа: Загальний логгер
❱
13.4.1.
Рішення
День 2: Полудень
14.
Ласкаво просимо
15.
Узагальнені типи
❱
15.1.
Узагальнені функції
15.2.
Узагальнені типи даних
15.3.
Узагальнені трейти
15.4.
Обмеження трейту
15.5.
impl Trait
15.6.
dyn Trait
15.7.
Вправа: узагальнена min
❱
15.7.1.
Рішення
16.
Типи стандартної бібліотеки
❱
16.1.
Стандартна бібліотека
16.2.
Документація
16.3.
Option
16.4.
Result
16.5.
String
16.6.
Vec
16.7.
HashMap
16.8.
Вправа: Лічильник
❱
16.8.1.
Рішення
17.
Трейти стандартної бібліотеки
❱
17.1.
Порівняння
17.2.
Оператори
17.3.
From та Into
17.4.
Приведення
17.5.
Read та Write
17.6.
Default, синтаксис оновлення структури
17.7.
Закриття
17.8.
Вправа: ROT13
❱
17.8.1.
Рішення
День 3: Ранок
18.
Ласкаво просимо
19.
Управління пам'яттю
❱
19.1.
Огляд пам'яті програми
19.2.
Підходи до управління пам'яттю
19.3.
Володіння
19.4.
Семантика переміщення
19.5.
Clone
19.6.
Типи які копіюються
19.7.
Drop
19.8.
Вправа: Тип будівельника
❱
19.8.1.
Рішення
20.
Розумні вказівники
❱
20.1.
Box<T>
20.2.
Rc
20.3.
Принадлежні об'єкти трейтів
20.4.
Вправа: Бінарне дерево
❱
20.4.1.
Рішення
День 3: Полудень
21.
Ласкаво просимо
22.
Запозичення
❱
22.1.
Запозичення значення
22.2.
Перевірка запозичення
22.3.
Помилки запозичення
22.4.
Внутрішня мутабельність
22.5.
Вправа: Статистика здоров’я
❱
22.5.1.
Рішення
23.
Тривалість життя
❱
23.1.
Анотації тривалісті життя
23.2.
Упущення тривалісті життя
23.3.
Тривалість життя структур
23.4.
Вправа: Розбір Protobuf
❱
23.4.1.
Рішення
День 4: Ранок
24.
Ласкаво просимо
25.
Ітератори
❱
25.1.
Ітератор
25.2.
IntoIterator
25.3.
FromIterator
25.4.
Вправа: ланцюжок методів ітератора
❱
25.4.1.
Рішення
26.
Модулі
❱
26.1.
Модулі
26.2.
Ієрархія файлової системи
26.3.
Видимість
26.4.
use, super, self
26.5.
Вправа: Модулі для бібліотеки графічного інтерфейсу користувача
❱
26.5.1.
Рішення
27.
Тестування
❱
27.1.
Тестові модулі
27.2.
Інші типи тестів
27.3.
Лінти компілятора та Clippy
27.4.
Вправа: Алгоритм Луна
❱
27.4.1.
Рішення
День 4: Полудень
28.
Ласкаво просимо
29.
Обробка помилок
❱
29.1.
Паніки
29.2.
Result
29.3.
Оператор спроб
29.4.
Перетворення спроб
29.5.
Error трейт
29.6.
thiserror
29.7.
anyhow
29.8.
Вправа: Переписування с Result
❱
29.8.1.
Рішення
30.
Небезпечний Rust
❱
30.1.
Unsafe
30.2.
Розіменування "сирих" вказівників
30.3.
Несталі статичні змінні
30.4.
Об'єднання
30.5.
Небезпечні функції
30.6.
Небезпечні трейти
30.7.
Вправа: обгортка FFI
❱
30.7.1.
Рішення
Android
31.
Ласкаво просимо
32.
Установка
33.
Правила побудови
❱
33.1.
Бінарний файл
33.2.
Бібліотека
34.
AIDL
❱
34.1.
Посібник із сервісу Birthday
❱
34.1.1.
Інтерфейс
34.1.2.
API сервісу
34.1.3.
Сервіс
34.1.4.
Сервер
34.1.5.
Розгортка
34.1.6.
Кліент
34.1.7.
Зміна API
34.1.8.
Оновлення реалізацій
34.2.
AIDL типи
❱
34.2.1.
Примітивні типи
34.2.2.
Типи Масивів
34.2.3.
Надсилання об'єктів
34.2.4.
Посилкові данні
34.2.5.
Надсилання файлів
35.
Тестування
❱
35.1.
GoogleTest
35.2.
Mocking
36.
Журналювання
37.
Інтероперабельність
❱
37.1.
З С
❱
37.1.1.
Виклик С за допомогою Bindgen
37.1.2.
Виклик Rust з C
37.2.
З С++
❱
37.2.1.
Модуль Bridge
37.2.2.
Rust Bridge
37.2.3.
Згенерований C++
37.2.4.
C++ Bridge
37.2.5.
Спільні типи
37.2.6.
Спільні переліки
37.2.7.
Обробка помилок в Rust
37.2.8.
Обробка помилок в C++
37.2.9.
Додаткові типи
37.2.10.
Збірка для Android: C++
37.2.11.
Збірка для Android: Genrules
37.2.12.
Збірка для Android: Rust
37.3.
З Java
38.
Вправи
Chromium
39.
Ласкаво просимо
40.
Установка
41.
Порівняння екосистем Chromium і Cargo
42.
Політика
43.
Правила побудови
❱
43.1.
Небезпечний код
43.2.
Залежнісь Chromium C++ від коду Rust
43.3.
Visual Studio Code
43.4.
Вправа
44.
Тестування
❱
44.1.
Бібліотека rust_gtest_interop
44.2.
Правила GN для тестів Rust
44.3.
Макрос chromium::import!
44.4.
Вправа
45.
Взаємодія з C++
❱
45.1.
Приклади прив'язок
45.2.
Обмеження CXX
45.3.
Обробка помилок в CXX
❱
45.3.1.
Обробка помилок: приклад QR
45.3.2.
Обробка помилок: приклад PNG
45.4.
Використання CXX у Chromium
45.5.
Вправа
46.
Додавання крейтів третіх сторін
❱
46.1.
Налаштування Cargo.toml
46.2.
Налаштування gnrt_config.toml
46.3.
Завантаження крейтів
46.4.
Створення правил побудови gn
46.5.
Вирішення проблем
❱
46.5.1.
Скрипти збірки, які генерують код
46.5.2.
Скрипти збірки, які будують C++ або виконують довільні дії
46.6.
Залежнісь від крейта
46.7.
Перевірки та аудити
46.8.
Реєстрація в Chromium Source Code
46.9.
Підтримання крейтів в актуальному стані
46.10.
Вправа
47.
Зібрання усього разом - вправа
48.
Рішення вправ
Залізо: Ранок
49.
Ласкаво просимо
50.
no_std
❱
50.1.
Мінімальний приклад
50.2.
alloc
51.
Мікроконтролери
❱
51.1.
Сирий ввід вивід з відображеної пам'яті (MMIO)
51.2.
Крейти доступу до периферійних пристроїв (PACs)
51.3.
Крейти абстракції обладнання (HAL)
51.4.
Крейти підтримки плат
51.5.
Шаблон стану типу
51.6.
embedded-hal
51.7.
probe-rs та cargo-embed
❱
51.7.1.
Налагодження
51.8.
Інші проєкти
52.
Вправи
❱
52.1.
Компас
52.2.
Рішення
Залізо: Полудень
53.
Прикладні процесори
❱
53.1.
Підготовка до Rust
53.2.
Вбудована збірка
53.3.
Ввід вивід з відображеної пам'яті (MMIO)
53.4.
Давайте напишемо драйвер UART
❱
53.4.1.
Більше трейтів
53.5.
Кращий драйвер UART
❱
53.5.1.
Бітові прапорці (крейт bitflags)
53.5.2.
Кілька регістрів
53.5.3.
Драйвер
53.5.4.
Використання
53.6.
Журналювання
❱
53.6.1.
Використання
53.7.
Виключення
53.8.
Інші проєкти
54.
Корисні крейти
❱
54.1.
zerocopy
54.2.
aarch64-paging
54.3.
buddy_system_allocator
54.4.
tinyvec
54.5.
spin
55.
Android
❱
55.1.
vmbase
56.
Вправи
❱
56.1.
Драйвер годинника реального часу (RTC)
56.2.
Рішення
Одночасність виконання: Ранок
57.
Ласкаво просимо
58.
Потоки
❱
58.1.
Звичайні потоки
58.2.
Потоки з областю видимості
59.
Канали
❱
59.1.
Відправники та отримувачі
59.2.
Незав'язані канали
59.3.
Зав'язані канали
60.
Send та Sync
❱
60.1.
Маркерні трейти
60.2.
Send
60.3.
Sync
60.4.
Приклади
61.
Спільний стан
❱
61.1.
Arc
61.2.
Mutex
61.3.
Приклад
62.
Вправи
❱
62.1.
Вечеря філософів
62.2.
Перевірка багатопоточних посилань
62.3.
Рішення
Одночасність виконання: Полудень
63.
Ласкаво просимо
64.
Основи асинхронізації
❱
64.1.
async/await
64.2.
Futures
64.3.
Середовища виконання
❱
64.3.1.
Токіо
64.4.
Завдання
65.
Канали та потік управління
❱
65.1.
Асинхронні канали
65.2.
Join
65.3.
Select
66.
Підводні камені
❱
66.1.
Блокування Виконавця
66.2.
Pin
66.3.
Асинхронні трейти
66.4.
Скасування
67.
Вправи
❱
67.1.
Вечеря філософів
67.2.
Програма широкомовного чату
67.3.
Рішення
Заключні слова
68.
Дякую!
69.
Глосарій
70.
Інші ресурси
71.
Кредити
Light
Rust
Coal
Navy
Ayu
Comprehensive Rust 🦀
English
Brazilian Portuguese (Português do Brasil)
Chinese Simplified (汉语)
Chinese Traditional (漢語)
Japanese (日本語)
Korean (한국어)
Farsi (فارسی)
Spanish (Español)
Ukrainian (українська)
Корисні крейти
Ми розглянемо кілька крейтів, які вирішують деякі поширені проблеми програмування на голому залізі.