Введение
Примечание: эта редакция книги такая же, как и книга The Rust Programming Language, доступная в печати в электронном формате в издательстве No Starch Press.
Добро пожаловать в The Rust Programming Language — ознакомительную книгу о Rust. Язык программирования Rust поможет вам быстро писать более надёжное программное обеспечение. Высокоуровневая эргономика и низкоуровневый контроль часто становятся несовместимыми целями при разработке нового языка программирования. Rust бросает вызов этому противоречию. Балансируя между мощной технической выразительностью и простотой логики программ, Rust даёт вам возможность управлять низкоуровневыми деталями (например, использованием памяти) без хлопот, обычно ожидаемых от необходимости подобного контроля.
Кому Rust придётся по душе
Ряд особенностей Rust делает его превосходным для многих групп людей. Взглянем на некоторые наиболее важные из них.
Команды разработчиков
Rust зарекомендовал себя как результативный инструмент для совместной работы больших команд разработчиков с разным уровнем квалификации. Низко- уровневый код подвержен разным тонким ошибкам, которые во множестве других языков можно отловить только через объёмное тестирование и дотошную проверку кода опытными разработчиками. В Rust, компилятор играет роль вратаря, не позволяя компилироваться программам, содержащим различные трудноуловимые ошибки (в том числе, ошибки параллельного взаимодействия). Работая с компилятором заодно, команды разработчиков могут сосредотачиваться на программной логике, оставляя на компиляторе охоту за багами.
Rust также привносит современные инструменты разработки в мир системного программирования:
- Cargo — встроенный менеджер зависимостей и инструмент сборки, делающий добавление,компиляцию и управление зависимостей безпроблемным и согласованным в рамках всей экосистемыRust.
- Rustfmt — инструмент форматирования, гарантирующий единообразие стиля программ, написанных разными людьми.
- rust-analyzer — средство интеграции в интегрированные среды разработки (IDE) автодополнения и отображения ошибок.
Благодаря применению этих и других инструментов экосистемы Rust, разработчики способны продуктивно работать над программами системного уровня.
Учащиеся
Rust подойдёт учащимся и всем тем, кто заинтересован в изучении низкоуровневых концепций. Используя Rust, многие люди изучили такие темы, как разработка операционных систем. Сообщество Rust очень приветливо: многие готовы помочь учащимся с их вопросами. Команды энтузиастов Rust прикладывают большие усилия к тому, чтобы сделать изучение системного программирования доступным большему числу людей, особенно новичкам в программировании в целом. Одним из результатов этих усилий и является эта книга.
Компании
Сотни компаний, больших и маленьких, применяют Rust для множества задач, таких как разработка инструментов командной строки, веб-сервисов, инструментов DevOps, встраиваемых устройств; анализ и обработка аудио и видео; создание криптовалют; биоинформатика; разработка поисковых систем, приложений интернета вещей; машинное обучение; и, наконец и например, разработка основных частей браузера Firefox.
Разработчики открытого программного обеспечения
Мир Rust с радостью примет людей, желающих развить этот язык, построить сплочённое Сообщество, создать библиотеки и средства разработки. Мы будем благодарны за ваш вклад в Rust.
Люди, ценящие скорость и устойчивость
Rust будет приятен для людей, требующих от языка скорости и стабильности. Под скоростью мы понимаем как скорость исполения программ, так и скорость их разработки. Проверки компилятора Rust гарантируют стабильность при развитии и рефакторинге. Это выгодно отличает Rust от языков, не поддерживающих эти проверки, и потому накопивших большие кодовые базы, которые разработчики часто опасаются редактировать. Благодаря абстракциям с нулевой стоимостью (высокоуровневым механизмам, компилирующимся в низкоуровневый код, столь же быстрый, как и написанный вручную), Rust стремится сделать код и безопасным, и быстрым.
Rust надеется заинтересовать и других людей. Те группы, что были упомянуты, — это лишь самые заметные стороны. В целом, ключевое стремление Rust — это избавить программистов от необходимости идти на компромиссы, на которые те шли десятилетиями. Rust — это способ получить безопасность и продуктивность вместе со скоростью и эргономикой. Познакомьтесь с Rust, попробуйте его, дайте ему шанс — и посмотрите, насколько он вам понравится.
Кому будет полезна эта книга
Эта книга предполагает, что вы уже знакомы с каким-нибудь другим языком программирования, но нам не будет важно, с каким именно. Мы постараемся изложить материал доступно — вне зависимости от имеющегося у вас на данный момент навыка. Мы не будем тратить много времени на обсуждение того, чем является программирование или как мыслить о нём. Если вы совершенно новы в программировании, вам будет крайне полезно для начала где-либо ознакомиться с его основами.
Как читать эту книгу
Эта книга предполагает, что вы будете её читать последовательно, от начала до конца. Последующие главы опираются на изученное в предыдущих, и более ранние могут охватывать отдельные темы лишь поверхностно, с учётом того, что всё пропущенное будет подробно рассмотрено далее.
В этой книге вы найдёте два вида глав: теоретические и практические. В теоретических главах вы будете изучать разные грани языка Rust. В практических главах мы будем вместе с вами разрабатывать небольшие программы, применяя всё, что вы изучили ранее. Главы 2, 12 и 21 — практические, остальные — теоретические.
Глава 1 объясняет, как установить Rust, написать "Hello, world!" и использовать Cargo — пакетный менеджер и систему сборки Rust. Глава 2 — это практическое введение в написание программ на Rust, в рамках которого вы напишете игру в угадайку. В ней мы поверхностно рассмотрим самые основы, а в следующих частях мы будем изучать дополнительные детали. Если вы хотите сразу приступить к работе, вы можете начать прямо с Главы 2. Глава 3 раскроет тот функционал Rust, который вы привыкли видеть в других подобных языках программирования, а в Главе 4 вы изучите механизм владения. Если вы хотели бы сначала изучить теорию, то вы можете сначала прочесть Главу 3, а потом вернуться к Главе 2, когда захотите захотите поработать над проектом, применяя изученное.
В Главе 5 обсуждаются структуры и методы. Глава 6 охватывает перечисления, выражение match
и конструкцию управления if let
. Структуры и перечисления пригодятся вам для создания собственных типов данных.
В Главе 7 вы познакомитесь с системой модулей и приватности Rust, которая поможет вам организовывать свой код и формировать для него интерфейс межпрограммного взаимодействия (API — Application Programming Interface). Глава 8 посвящена основным структурам данных, предоставляемых стандартной библиотекой: векторам, строкам, хеш-таблицам. В Главе 9 мы обсудим взгляд Rust на обработку ошибок и её средства.
В Главе 10 рассматриваются обобщённые типы данных, трейты и время жизни — средства, позволяющие определять схожее поведение сразу для нескольких типов. Глава 11 посвящена тестированию; гарантии безопасности Rust отвечают за синтаксическую корректность ваших программ, а тестирование понадобится для проверок логической корректности. В Главе 12 мы напишем программу, реализующую подмножество функциональности утилиты командной строки grep
— инструмента полнотекстового поиска по файлу. Она потребует многое из того, что мы изучим к этому моменту.
В Главе 13 речь идёт о замыканиях и итераторах: особенностях Rust, взятых из функцональных языков программирования. В Главе 14 мы подробнее изучим Cargo и поговорим о распространии ваших библиотек среди других разработчиков. В Главе 15 обсуждаются умные указатели, предоставляемые стандартной библиотекой, а также трейты, лежащие в их основе.
В Главе 16 мы пройдёмся по различным моделям параллельного программирования и обсудим, как Rust помогает писать безопасные многопоточные программы. В Главе 17 мы изучим синтаксис асинхронного программирования и обеспечиваемую ими облегчённую модель параллелизма.
В Главе 18 сравниваются широко известные идеи из парадигмы объектно-ориентированного программирования и аналогичные им реализации на Rust.
Глава 19 содержит справку по шаблонам и сопоставлению с шаблоном, являющимися мощным средством выражения различных идей в программах на Rust. В Главе 20 речь пойдёт о нескольких продвинутых темах, таких как небезопасное подмножество Rust, макросы, и дополнительная информация касательно времени жизни, трейтов, типов, функций и замыканий.
В Главе 21 мы напишем свой низкоуровневый многопоточный веб-сервер!
Наконец, есть несколько приложений, содержащих полезную информацию о языке в более сухом, справочном виде. В Приложении A рассматриваются ключевые слова Rust; в Приложении B — операторы и символы; в Приложении C — выводимые трейты, предоставляемые стандартной библиотекой; в Приложении D — некоторые полезные инструменты разработки; в Приложении E — редакции Rust. В Приложении F вы найдёте переводы этой книги, а в Приложении G вы узнаете, как разрабатывается Rust и что такое Nightly Rust. (Примечание переводчика: переводы, перечисленные в Приложении F, выполнены в сторонних разрозненных репозиториях. Переводы, выполненные в этой системе, всегда доступны в меню по кнопке глобуса справа сверху.)
Нет неправильного способа чтения этой книги: если вы хотите пропустить что-либо и пойти вперёд — дерзайте! Возможно, вам понадобится вернуться к предыдущим главам, если вы почувствуете себя неуверенно. В любом случае: делайте так, как вам будет удобно.
Важной частью процесса обучения языку Rust является обучение чтению сообщений об ошибках и вывода компилятора: они будут направлять вас к желаемому результату. Собственно, мы будем показывать большое количество примеров, которые не компилируются, вместе с их ошибками компиляции. Помните: не факт, что взяв любой пример, он скомпилируется! Убедитесь, что прочитали связанный с этим примером текст и посмотрели, не подразумевается ли неудача при попытке его запустить. Быстро определить заведомо нерабочий код вам поможет Феррис:
Феррис | Что имеет в виду |
---|---|
Этот код не компилируется! | |
Этот код приведёт к панике! | |
Этот код ведёт себя не так, как задумано. |
В большинстве случаев, мы приведём вас к исправленной версии неправильных примеров.
Исходный код
Исходные файлы, из которых сгенерирована эта книга, можно найти на GitHub.