Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Введение

Примечание: это издание книги совпадает с книгой 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.