К курсам
AI034 Professional

Язык программирования Rust

Полное введение в язык программирования Rust, охватывающее концепции системного программирования, безопасность памяти, многопоточность и инструментарий Rust (Cargo, rustup). Курс проходит от базового синтаксиса до создания полноценных проектов, таких как много потоковый веб-сервер.

5.0
63.0h
763 учеников
0 лайки
Искусственный интеллект
Начать обучение

Обзор курса

📚 Краткое содержание

Полное введение в язык Rust, охватывающее концепции системного программирования, безопасность памяти, параллелизм и инструментарий Rust (Cargo, rustup). От базового синтаксиса до создания полноценных проектов, таких как многопоточный веб-сервер.

Освойте искусство безопасного, быстрого и параллельного системного программирования с определяющим руководством по языку Rust.

Авторы: Стив Клабник и Карол Николс, с вкладом сообщества Rust

Благодарности: Вклад сообщества Rust; издание в мягкой обложке и электронной форме от издательства No Starch Press.

🎯 Цели обучения

  1. Успешно установить и управлять комплектами инструментов Rust с помощью rustup на разных операционных системах.
  2. Написать, скомпилировать и выполнить простую программу на Rust, выделив основные составные части кода.
  3. Использовать Cargo для создания стандартных структур проектов, управления сборками и создания оптимизированных бинарников для релиза.
  4. Получить и сохранить пользовательский ввод, управляя изменяемостью переменных и потенциальными сбоями ввода-вывода.
  5. Интегрировать внешние зависимости с помощью Cargo и управлять воспроизводимыми сборками через Cargo.lock.
  6. Реализовать логику игры с использованием вывода типов, разбора строк, циклов и оператора управления потоком match.
  7. Различать константы и тенирование переменных для управления неизменяемостью данных и областью видимости.
  8. Правильно реализовывать скалярные (целые, вещественные, логические, символы) и составные (кортежи, массивы) типы данных.
  9. Различать выражения и операторы для определения функций с конкретными возвращаемыми значениями.
  10. Различать стековую и кучевую память и объяснить, как Rust управляет данными в куче.

🔹 Урок 1: Начало работы с Rust

Обзор: Этот урок предоставляет всестороннее введение в экосистему Rust, делая акцент на настройке среды и основном рабочем процессе разработчика на Rust. Учащиеся пройдут путь от установки языка через rustup до написания ручной программы "Привет, мир!" и, наконец, освоения Cargo — официального системы сборки и менеджера пакетов Rust — для профессионального управления проектами и оптимизации выпуска.

Результаты обучения:

  • Успешно установить и управлять комплектами инструментов Rust с помощью rustup на разных операционных системах.
  • Написать, скомпилировать и выполнить простую программу на Rust, выделив основные составные части кода.
  • Использовать Cargo для создания стандартных структур проектов, управления сборками и создания оптимизированных бинарников для релиза.

🔹 Урок 2: Практика: Программирование игры «Угадай число»

Обзор: Этот урок проводит разработчиков через создание функциональной командной строки-игры на Rust. Охватывает фундаментальные концепции системного программирования, включая обработку пользовательского ввода, интеграцию сторонних пакетов для генерации случайных чисел и уникальный подход Rust к безопасности памяти и обработке ошибок через тип Result и сопоставление шаблонов. По завершении учащиеся получат надёжное приложение, которое обрабатывает некорректный ввод и обеспечивает воспроизводимые сборки.

Результаты обучения:

  • Получить и сохранить пользовательский ввод, управляя изменяемостью переменных и возможными сбоями ввода-вывода.
  • Интегрировать внешние зависимости с помощью Cargo и управлять воспроизводимыми сборками через Cargo.lock.
  • Реализовать логику игры с использованием вывода типов, разбора строк, циклов и оператора управления потоком match.

🔹 Урок 3: Общие концепции программирования

Обзор: Этот урок охватывает основные строительные блоки программирования на Rust, сосредоточившись на том, как хранится и манипулируется данные. Исследует нюансы тенирования переменных и констант, классификацию данных на скалярные и составные типы, правила структуры функций и логику управления потоком и повторяющегося выполнения.

Результаты обучения:

  • Различать константы и тенирование переменных для управления неизменяемостью данных и областью видимости.
  • Правильно реализовывать скалярные (целые, вещественные, логические, символы) и составные (кортежи, массивы) типы данных.
  • Различать операторы и выражения для определения функций с конкретными возвращаемыми значениями.

🔹 Урок 4: Понимание владения и памяти

Обзор: Этот урок исследует уникальный подход Rust к управлению памятью через систему владения. Вместо использования сборщика мусора или ручного управления памятью, Rust использует набор правил, проверяемых на этапе компиляции, чтобы гарантировать безопасность памяти. Этот раздел охватывает механику стека и кучи, жизненный цикл данных и то, как ссылки и срезы обеспечивают безопасный и эффективный доступ к памяти без передачи владения.

Результаты обучения:

  • Различать стековую и кучевую память и объяснить, как Rust управляет данными в куче.
  • Применить три правила владения для прогнозирования валидности и области действия переменных.
  • Продемонстрировать различие между операциями перемещения (Move), клонирования (Clone) и копирования (Copy).

🔹 Урок 5: Структуры: управление связанными данными

Обзор: Этот урок исследует, как группировать связанные данные в пользовательские типы с помощью структур для создания более значимого и организованного кода. Охватывает определение и создание различных форм структур (классических, кортежных и единичных), управление владением данных внутри этих структур, а также расширение структур с помощью производных характеристик, таких как Debug, и пользовательских методов, определённых через блоки impl.

Результаты обучения:

  • Определить и создать структуры с именованными полями, сокращённой синтаксисом и синтаксисом обновления.
  • Различать классические структуры, кортежные структуры и единичные структуры и определять их области применения.
  • Реализовать характеристику Debug и использовать макрос dbg! для анализа данных структуры.

🔹 Урок 6: Перечисления и сопоставление шаблонов

Обзор: Этот урок исследует, как Rust использует перечисления (enums) для определения типов путём перечисления их возможных вариантов, предоставляя более гибкий способ группировки связанных констант и данных, чем сами структуры. Охватывает ключевую роль перечисления Option в устранении ошибок указателей, а также демонстрирует, как конструкции match и if let обеспечивают мощный, исчерпывающий контроль потока для безопасной обработки сложных структур данных.

Результаты обучения:

  • Определить перечисления с различными типами данных и реализовать методы для них с помощью блоков impl.
  • Объяснить преимущества безопасности перечисления Option<T> по сравнению с традиционными значениями null.
  • Создать исчерпывающие выражения match, которые связывают внутренние значения вариантов и используют универсальные заполнители.

🔹 Урок 7: Модули, пакеты и крейты

Обзор: Этот урок исследует, как Rust организует код для читаемости и повторного использования с помощью своей системы модулей. Охватывает создание дерева модулей, применение правил приватности для контроля видимости элементов, а также использование путей и ключевых слов, таких как use и pub, для управления областью видимости и создания чистых интерфейсов.

Результаты обучения:

  • Организовать код в иерархическую структуру с помощью модулей и дерева модулей.
  • Ссылаться на элементы кода с помощью абсолютных и относительных путей.
  • Управлять видимостью функций, модулей и полей с помощью ключевого слова pub и правил приватности.

🔹 Урок 8: Общие коллекции

Обзор: Этот урок исследует стандартные библиотечные коллекции Rust, в частности векторы, строки и хэш-карты. Эти структуры данных хранятся в куче, что позволяет им динамически расти или уменьшаться во время выполнения, а урок детально описывает, как правила владения и заимствования в Rust обеспечивают безопасность памяти и производительность при управлении этими списками значений, текстом в кодировке UTF-8 и ассоциациями ключ-значение.

Результаты обучения:

  • Реализовать динамические списки с помощью Vec<T> и управлять их жизненным циклом через проверку заимствования.
  • Работать с текстом в кодировке UTF-8 с помощью типа String, преодолевая сложности внутреннего представления и конкатенации.
  • Применить HashMap<K, V> для эффективного хранения и обновления связанных данных с использованием API Entry и учетом пользовательской хеш-функции.

🔹 Урок 9: Стратегии обработки ошибок

Обзор: Этот урок исследует прочную философию обработки ошибок в Rust, которая различает восстанавливаемые и невосстанавливаемые ошибки. Учащиеся научатся использовать макрос panic! для критических сбоев, тип Result для управляемых отказов и оператор ? для упрощения распространения ошибок. Кроме того, урок охватывает, как использовать систему типов Rust для принудительной валидации данных и поддержания целостности программы.

Результаты обучения:

  • Определять, когда использовать невосстанавливаемый panic! вместо восстанавливаемого Result на основе критериев «плохого состояния».
  • Использовать трассировки (backtraces) для отладки происхождения невосстанавливаемых ошибок.
  • Реализовать распространение ошибок с помощью оператора ? и изменить функцию main, чтобы поддерживать возврат ошибок.

🔹 Урок 10: Генерики, черты и сроки жизни

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

Результаты обучения:

  • Определять и использовать параметры генериков в функциях, структурах и перечислениях для работы с несколькими типами данных.
  • Реализовывать общее поведение с помощью черт (traits) и ограничений черт (trait bounds) для ограничения генериков.
  • Применять аннотации сроков жизни и правила устранения (elision) для управления валидностью ссылок и удовлетворения проверке заимствования.

🔹 Урок 11: Автоматическое тестирование

Обзор: Этот урок исследует реализацию и организацию автоматического тестирования в Rust. Охватывает структурные требования к функции теста, использование макросов утверждений для проверки логики, а также технические различия между юнит-тестами и интеграционными тестами. Учащиеся также узнают, как управлять поведением тестового запускателя для управления потоком выполнения и видимостью результатов.

Результаты обучения:

  • Определять структуру и метаданные, необходимые для корректной функции теста в Rust.
  • Реализовывать проверки равенства и верификацию состояния паники для обеспечения надёжности кода.
  • Настроить тестовый запуск для параллельного или последовательного выполнения и видимости вывода программы.

🔹 Урок 12: Проект ввода-вывода: команда для командной строки

Обзор: Этот урок руководит разработчиков в создании функционального инструмента командной строки (упрощённая версия grep) на Rust. Основное внимание уделяется переходу от однофайлового скрипта к модульной, готовой к производству бинарной программе, с акцентом на безопасность памяти при анализе аргументов, работе с файлами и разделении ответственности между логикой библиотеки и интерфейсом командной строки. Учащиеся реализуют надёжную обработку ошибок и разрабатывают функции с использованием методологии тест-драйвенного развития (TDD), управляя состоянием приложения через переменные окружения.

Результаты обучения:

  • Получить и преобразовать аргументы командной строки в структурированные объекты конфигурации.
  • Рефакторить код в соответствии с принципом разделения ответственности для бинарных проектов.
  • Реализовать основную логику с использованием цикла ТДД с аннотациями сроков жизни.

🔹 Урок 13: Функциональные возможности: итераторы и замыкания

Обзор: Этот урок исследует функциональные возможности в Rust, в частности замыкания и итераторы. Замыкания — это анонимные функции, которые могут захватывать окружающую среду, контролируемые через черты Fn, в то время как итераторы предоставляют ленивый, эффективный способ обработки последовательностей элементов. Вместе эти возможности позволяют писать выразительный код, соответствующий принципу «нулевой стоимости абстракции» в Rust, часто достигая или превышая производительность традиционных циклов.

Результаты обучения:

  • Определять анонимные функции (замыкания) и объяснять, как они захватывают переменные из своей среды по ссылке или перемещением.
  • Различать три черты Fn (Fn, FnMut, FnOnce) и понимать, как компилятор выводит типы замыканий.
  • Реализовать черту Iterator с помощью метода next и различать потребляющие адаптеры и адаптеры итераторов.

🔹 Урок 14: Расширенный Cargo и Crates.io

Обзор: Этот урок исследует продвинутые возможности менеджера пакетов Rust — Cargo — и его экосистему — Crates.io. Основное внимание уделяется оптимизации сборки с помощью профилей релиза, созданию профессиональной документации с интегрированными тестами и мастерству архитектуры публичных интерфейсов. Кроме того, рассматриваются жизненные циклы крейта — от публикации и версионирования до управления многосоставными проектами через рабочие пространства (workspaces) и расширение встроенных возможностей Cargo.

Результаты обучения:

  • Настроить профили релиза для баланса скорости компиляции и производительности во время выполнения.
  • Генерировать и проверять комментарии документации, которые служат как руководства для пользователей, так и автоматическими тестами.
  • Создать удобный публичный интерфейс с помощью переэкспорта (pub use) для отделения внутренней структуры от внешнего использования.

🔹 Урок 15: Умные указатели

Обзор: Этот урок исследует умные указатели в Rust — структуры данных, ведущие себя как указатели, но несущие дополнительную информацию и возможности. Мы сосредоточимся на управлении выделением памяти в куче с помощью Box<T>, на поддержке совместного владения с помощью Rc<T> и на обходе строгих правил заимствования через паттерн внутренней изменчивости с помощью RefCell<T>. Также мы рассмотрим черты Deref и Drop, лежащие в основе поведения умных указателей и очистки ресурсов.

Результаты обучения:

  • Реализовать рекурсивные структуры данных с помощью Box<T> для обеспечения косвенности и известного размера памяти.
  • Настроить поведение указателя и управление ресурсами с помощью черт Deref и Drop.
  • Управлять несколькими владельцами и проверяемой во время выполнения изменчивостью, комбинируя Rc<T> и RefCell<T>.

🔹 Урок 16: Безопасная параллельность

Обзор: Этот урок исследует философию «безопасной параллельности» в Rust, демонстрируя, как язык использует свои системы владения и типов, чтобы превратить параллельное программирование из опасной области во время выполнения в уверенность на этапе компиляции. Охватываем создание потоков, безопасную передачу сообщений, управление общим состоянием с помощью мьютексов и фундаментальные черты, определяющие безопасность потоков.

Результаты обучения:

  • Создавать и управлять потоками с помощью spawn и join, разрешая конфликты владения с помощью ключевого слова move.
  • Реализовать параллельность с передачей сообщений с помощью каналов mpsc для безопасной передачи данных между потоками.
  • Управлять общим состоянием между несколькими потоками с помощью Mutex<T> для исключения взаимодействия и Arc<T> для безопасного счетчика ссылок.

🔹 Урок 17: Объектно-ориентированное программирование в Rust

Обзор: Этот урок исследует, как Rust реализует основные принципы объектно-ориентированного программирования (ООП), в частности инкапсуляцию и полиморфизм. Подробно описываются механизмы объектов черт для обработки гетерогенных коллекций и торговые сделки между статическим и динамическим диспетчеризацией. В заключение сравнивается реализация классического паттерна «Состояние» с более естественным для Rust подходом, где состояния и поведения прямо кодируются в системе типов.

Результаты обучения:

  • Реализовать инкапсуляцию в Rust с помощью модулей и модификаторов видимости для скрытия внутреннего состояния.
  • Использовать объекты черт для достижения полиморфизма и понимать влияние производительности статической и динамической диспетчеризации.
  • Применить паттерн «Состояние» для управления сложным поведением объектов и перехода между состояниями.

🔹 Урок 18: Расширенные шаблоны и сопоставление

Обзор: Этот урок исследует глубину системы сопоставления шаблонов в Rust, выходя за рамки простых ветвей match до сложной извлечения данных и управления потоком. Учащиеся освоят различие между неопровержимыми и опровергаемыми шаблонами, научатся декомпозировать сложные вложенные структуры и использовать расширенный синтаксис, такой как защитные условия (match guards) и привязки, для написания более выразительного и безопасного кода.

Результаты обучения:

  • Различать неопровержимые и опровергаемые шаблоны и применять их к соответствующим конструкциям Rust (например, let против if let).
  • Декомпозировать структуры, перечисления и кортежи для извлечения конкретных данных в локальные переменные.
  • Использовать расширенный синтаксис шаблонов, включая диапазоны, несколько шаблонов, игнорирование значений и привязки @ для сложного условного сопоставления.

🔹 Урок 19: Расширенные возможности и Unsafe Rust

Обзор: Этот урок исследует «суперспособности» Rust, позволяющие разработчикам обходить определённые ограничения компилятора и создавать высоко гибкие абстракции. Охватывается использование Unsafe Rust для низкоуровневого манипулирования памятью, продвинутые техники черт для сложных отношений типов, а также мощные возможности метапрограммирования, предоставляемые декларативными и процедурными макросами.

Результаты обучения:

  • Различать безопасный Rust и «неопределённые» возможности, требующиеся для непосредственного манипулирования указателями и вызова unsafe-функций.
  • Реализовать продвинутые паттерны черт, включая связанные типы, перегрузку операторов, суперчерты и паттерн новообразованного типа (Newtype).
  • Разрешать неоднозначность вызовов методов с помощью полного квалифицированного синтаксиса и управлять сложными типами, такими как динамически размерные типы (DST) и псевдонимы типов.

🔹 Урок 20: Финальный проект: многопоточный веб-сервер

Обзор: Этот урок руководит разработкой высокопроизводительного веб-сервера с использованием сетевых и концепций параллелизма Rust. Охватывает переход от простого TCP-слушателя к сложной многопоточной системе с использованием собственной созданной очереди потоков. Учащиеся узнают, как управлять низкоуровневыми потоками, реализовать передачу сообщений на основе работников для распределения задач и обеспечить стабильность системы с механизмом грациозного завершения.

Результаты обучения:

  • Установить и управлять TCP-соединениями: привязать сервер к локальному порту и обрабатывать входящие потоки байтов.
  • Анализировать и отвечать на HTTP-запросы: считывать сырые данные запроса и формировать корректные HTTP-ответы со строками статуса и телами HTML.
  • Архитектура собственной очереди потоков: использовать каналы mpsc и примитивы синхронизации (Arc, Mutex) для распределения задач между ограниченным количеством потоков.

🔹 Урок 21: Приложения Rust: инструменты и справочные материалы

Обзор: Этот урок предоставляет всестороннюю техническую справку по языку программирования Rust, сосредоточившись на его плотном синтаксисе, автоматизированных инструментах разработки и эволюционном процессе выпусков. Учащиеся научатся ориентироваться в сложном синтаксисе Rust, реализовывать стандартное поведение через производные черты и использовать экосистемные инструменты для поддержания высокого качества кода и следования философии языка «стабильность без застоя».

Результаты обучения:

  • Идентифицировать и интерпретировать синтаксис: расшифровывать операторы Rust, символы путей и ограничения генериков с помощью стандартизированных справочных таблиц.
  • Реализовывать стандартное поведение: автоматизировать реализацию черт Debug, Clone, Eq, Ord и Hash с помощью атрибута derive.
  • Оптимизировать рабочий процесс разработки: использовать rustfmt, rustfix и Clippy для форматирования, исправления и проверки кода согласно стандартам сообщества.