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