Введение
Примечание: Это издание книги идентично книге The Rust Programming Language, доступной в печатном формате и в формате электронной книги от No Starch Press.
Добро пожаловать в The Rust Programming Language — вводную книгу по Rust. Язык программирования Rust помогает писать более быстрое и надёжное программное обеспечение. Высокоуровневое удобство разработки и низкоуровневый контроль часто противоречат друг другу при проектировании языков программирования; Rust бросает вызов этому противоречию. За счёт баланса между мощными техническими возможностями и качественным опытом разработки Rust даёт вам возможность контролировать низкоуровневые детали (например, использование памяти) без всех сложностей, которые традиционно связаны с таким уровнем контроля.
Для кого предназначен Rust
Rust идеально подходит многим людям по самым разным причинам. Рассмотрим несколько наиболее важных групп.
Команды разработчиков
Rust показывает себя как продуктивный инструмент для совместной работы больших команд разработчиков с разным уровнем знаний в области системного программирования. Низкоуровневый код подвержен различным трудноуловимым ошибкам, которые в большинстве других языков можно обнаружить только с помощью обширного тестирования и тщательного анализа кода опытными разработчиками. В Rust компилятор выполняет роль своеобразного контролёра, отказываясь компилировать код с подобными труднообнаружимыми ошибками, включая ошибки конкурентности. Работая совместно с компилятором, команда может сосредоточить своё время на логике программы вместо поиска ошибок.
Rust также приносит в мир системного программирования современные инструменты разработки:
- Cargo — встроенный менеджер зависимостей и инструмент сборки — делает добавление, компиляцию и управление зависимостями простыми и единообразными для всей экосистемы Rust.
- Инструмент форматирования
rustfmtобеспечивает единый стиль написания кода для всех разработчиков. - Rust Language Server обеспечивает интеграцию со средами разработки (IDE), предоставляя автодополнение кода и встроенные сообщения об ошибках.
Используя эти и другие инструменты экосистемы Rust, разработчики могут оставаться продуктивными при написании системного кода.
Студенты
Rust подходит студентам и всем, кто заинтересован в изучении системных концепций. Используя Rust, многие люди познакомились с такими темами, как разработка операционных систем. Сообщество очень дружелюбно и охотно отвечает на вопросы студентов. Благодаря таким инициативам, как эта книга, команда Rust стремится сделать системные концепции более доступными для большего числа людей, особенно для тех, кто только начинает знакомство с программированием.
Компании
Сотни компаний — как крупных, так и небольших — используют Rust в производственной среде для самых разных задач, включая инструменты командной строки, веб-сервисы, DevOps-инструменты, встроенные устройства, анализ и транскодирование аудио и видео, криптовалюты, биоинформатику, поисковые системы, приложения Интернета вещей (IoT), машинное обучение и даже значительные части веб-браузера Firefox.
Разработчики открытого исходного кода
Rust предназначен для людей, которые хотят развивать язык программирования Rust, сообщество, инструменты разработки и библиотеки. Мы будем рады вашему участию в развитии языка Rust.
Люди, которые ценят скорость и стабильность
Rust предназначен для людей, которым важны скорость и стабильность языка. Под скоростью мы подразумеваем как скорость выполнения кода Rust, так и скорость, с которой Rust позволяет создавать программы. Проверки компилятора Rust обеспечивают стабильность при добавлении новых возможностей и рефакторинге. Это противопоставляется хрупкому устаревшему коду в языках без подобных проверок, который разработчики часто опасаются изменять. Стремясь к созданию абстракций с нулевой стоимостью (zero-cost abstractions) — высокоуровневых возможностей, которые компилируются в низкоуровневый код с той же скоростью, что и написанный вручную, — Rust стремится сделать безопасный код также и быстрым.
Rust также стремится поддерживать множество других пользователей; здесь перечислены лишь некоторые из наиболее значимых групп. В целом главная цель Rust — устранить компромиссы, которые программисты были вынуждены принимать десятилетиями, предоставляя безопасность и продуктивность, скорость и удобство разработки (ergonomics). Попробуйте Rust и посмотрите, подходят ли вам предлагаемые им решения.
Для кого предназначена эта книга
Эта книга предполагает, что вы уже писали код на каком-либо другом языке программирования, однако не делает предположений о том, на каком именно. Мы постарались сделать материал доступным для людей с самым разным опытом в программировании. Мы не уделяем много времени объяснению того, что такое программирование и как о нём думать. Если вы совсем новичок в программировании, вам лучше подойдёт книга, специально предназначенная для знакомства с основами программирования.
Как использовать эту книгу
В целом эта книга предполагает, что вы читаете её последовательно — от начала до конца. Более поздние главы опираются на концепции, представленные в ранних главах, а ранние главы могут не углубляться в детали определённой темы, возвращаясь к ней позднее.
В этой книге вы встретите два типа глав: концептуальные главы и главы, посвящённые проектам. В концептуальных главах вы будете изучать отдельные аспекты Rust. В главах, посвящённых проектам, мы будем вместе создавать небольшие программы, применяя всё, что вы уже изучили. Главы 2, 12 и 21 относятся к проектным главам; остальные являются концептуальными.
Глава 1 объясняет, как установить Rust, как написать программу «Привет, мир!», а также как использовать Cargo — менеджер пакетов и инструмент сборки Rust. Глава 2 представляет собой практическое введение в написание программ на Rust, в котором вы создадите игру по угадыванию числа. Здесь мы рассматриваем концепции на высоком уровне, а в последующих главах будут представлены дополнительные подробности. Если вы хотите сразу приступить к практике, то Глава 2 — подходящее место. Если же вы относитесь к числу особенно внимательных учащихся и предпочитаете изучить каждую деталь перед переходом к следующему материалу, вы можете пропустить Главу 2 и сразу перейти к Главе 3, которая рассматривает возможности Rust, похожие на возможности других языков программирования; после этого вы сможете вернуться к Главе 2, когда захотите поработать над проектом, применяя изученные детали.
В Главе 4 вы познакомитесь с системой владения (ownership) Rust.
Глава 5 рассматривает структуры и методы. Глава 6 посвящена
перечислениям, выражениям match, а также конструкциям управления потоком
if let и let...else. Вы будете использовать структуры и перечисления
для создания собственных типов.
В Главе 7 вы познакомитесь с системой модулей Rust и правилами приватности для организации вашего кода и его публичного интерфейса программирования приложений (API). Глава 8 рассматривает некоторые распространённые структуры данных коллекций, предоставляемые стандартной библиотекой: векторы, строки и HashMap. Глава 9 исследует философию и подходы Rust к обработке ошибок.
Глава 10 подробно рассматривает дженерики (generics), трейты и времена
жизни (lifetimes), которые дают возможность определять код, применимый сразу
к нескольким типам. Глава 11 полностью посвящена тестированию, которое,
даже при наличии гарантий безопасности Rust, остаётся необходимым для
обеспечения корректности логики программы. В Главе 12 мы создадим
собственную реализацию части функциональности инструмента командной строки
grep, который выполняет поиск текста внутри файлов. Для этого мы будем
использовать многие концепции, обсуждавшиеся в предыдущих главах.
Глава 13 рассматривает замыкания и итераторы — возможности Rust, пришедшие из функциональных языков программирования. В Главе 14 мы более подробно изучим Cargo и обсудим лучшие практики распространения ваших библиотек. Глава 15 рассматривает умные указатели, предоставляемые стандартной библиотекой, а также трейты, обеспечивающие их функциональность.
В Главе 16 мы рассмотрим различные модели конкурентного программирования
и поговорим о том, как Rust помогает бесстрашно работать с несколькими
потоками. В Главе 17 мы продолжим эту тему, изучив синтаксис async и
await в Rust, а также задачи (tasks), Future и потоки (streams), вместе с
лёгкой моделью конкурентности, которую они предоставляют.
Глава 18 рассматривает, как идиомы Rust соотносятся с принципами объектно-ориентированного программирования, с которыми вы, возможно, уже знакомы. Глава 19 представляет собой справочник по шаблонам и сопоставлению с шаблонами (pattern matching) — мощным способам выражения идей в программах на Rust. Глава 20 содержит набор продвинутых тем, включая unsafe Rust, макросы и дополнительные сведения о временах жизни, трейтах, типах, функциях и замыканиях.
В Главе 21 мы завершим проект, реализовав низкоуровневый многопоточный веб-сервер!
Наконец, несколько приложений содержат полезную справочную информацию о языке. Приложение A посвящено ключевым словам Rust, Приложение B — операторам и символам Rust, Приложение C — автоматически выводимым трейтам, предоставляемым стандартной библиотекой, Приложение D содержит некоторые полезные инструменты разработки, а Приложение E объясняет редакции Rust. В Приложении F вы сможете найти переводы книги, а в Приложении G мы рассмотрим, как создаётся Rust и что представляет собой nightly Rust.
Не существует неправильного способа читать эту книгу: если хотите перейти вперёд — переходите! Возможно, вам придётся вернуться к предыдущим главам, если что-то вызовет затруднения. Но делайте так, как удобнее именно вам.
Важной частью изучения Rust является умение читать сообщения об ошибках, которые выводит компилятор: именно они будут направлять вас к рабочему коду. Поэтому мы приведём множество примеров, которые не компилируются, вместе с сообщениями об ошибках, которые компилятор покажет в каждом случае. Помните, что если вы введёте и запустите случайный пример, он может не скомпилироваться! Обязательно читайте окружающий текст, чтобы понять, предназначен ли пример для демонстрации ошибки. В большинстве ситуаций мы покажем правильную версию кода, который не компилируется. Ferris также поможет вам отличить код, который не должен работать:
| Ferris | Значение |
|---|---|
| Этот код не компилируется! | |
Этот код вызывает панику (panic!)! | |
| Этот код не даёт ожидаемого поведения. |
В большинстве случаев мы будем показывать правильную версию кода, который не компилируется.
Исходный код
Исходные файлы, на основе которых генерируется эта книга, доступны на GitHub.