diff --git a/ru-RU/faq.md b/ru-RU/faq.md index 1f1e16611..2bb650380 100644 --- a/ru-RU/faq.md +++ b/ru-RU/faq.md @@ -1,4 +1,238 @@ --- layout: ru-RU/faq -title: Frequently Asked Questions · The Rust Programming Language +title: Часто задаваемые вовпросы (Frequently Asked Questions) · по языку программирования Rust --- + +# Часто Задаваемые Вопросы + +

+Эта страница создана, для того чтобы отвечать на общие вопросы о языке программирования Rust. Это не полное руководство к языку и это не учебное руководство. Здесть опубликованы ответы на неоднократно задаваемых вопросы, которые обсуждались на встрече сообщества Rust, а также разъяснение причин некоторых дизайнерских решений языка Rust. +

+ +

+Если у вас есть какой-то общий или важный вопрос, который, не оставлен без ответа - не стесняйтесь, пишите его и мы его осветим.

+ +
+

Содержание

+
+
    +
  1. Проект Rust +
  2. Производительность +
  3. Синтаксис +
  4. Числа +
  5. Строки +
  6. Коллекции +
  7. Владение +
  8. Время жизни +
  9. Общие характеристики +
  10. Ввод / вывод +
  11. Обработка ошибок +
  12. Параллельность +
  13. Макросы +
  14. Отладка и инструменты +
  15. Низкоуровневое программирование +
  16. Кросс-платформенность +
  17. Модули и контейнеры +
  18. Библиотеки +
  19. Шаблоны проектирования +
  20. Другие языки +
  21. Документация +
+
+
+ +

Проект Rust

+ +

+Какова цель этого проекта? +

+ +Разработать и внедрить безопасный, параллельный, практичный системный язык. + +Rust существует, так как другие языки на этом уровне абстракции и эффективности неудовлетворительны. В частности: + +1. Слишком мало внимания уделяется безопасности. +2. Низкая поддержка параллелизма. +3. Отсутствие практических преимуществ. +4. Предлагается ограниченный контроль над ресурсами. + +Rust существует как альтернатива, которая обеспечивает как эффективный код, так и комфортный уровень абстракции, при этом улучшается во всех этих направлениях. + +

+Этот проект контролируется Mozilla? +

+ +Нет. В 2006 году Rust был создан Грэйдоном Хором (Graydon Hoare) и развивался им в свободное время и оставался таким более 3 лет. Mozilla приняла участие в его развитии в 2009 году, когда язык был достаточно зрелым, чтобы выполнять базовые тесты и демонстрировать свои основные концепции. Хотя он по-прежнему спонсируется Mozilla, Rust разрабатывается разнообразным сообществом энтузиастов из разных уголков мира. Команда [Rust Team](https://www.rust-lang.org/team.html) состоит из членов Mozilla и не Mozilla, а «rust» на GitHub имеет более [1,900 уникальных контрибьюторов](https://github.com/rust-lang/rust/). + +Что касается [управления проектами](https://github.com/rust-lang/rfcs/blob/master/text/1068-rust-governance.md), то Rust управляется основной командой, которая устанавливает видение и приоритеты для проекта, направляя его с глобальной точки зрения. Также есть подгруппы для руководства и развития определенных областей, включая основной язык, компилятор, библиотеки Rust, инструменты Rust и официальных сообществ Rust. Проекты в каждой из этих областей продвигаются через [RFC-процесс](https://github.com/rust-lang/rfcs). Для изменений, которые не требуют RFC, решения принимаются посредством запросов на загрузку в репозитории [`rustc`](https://github.com/rust-lang/rust). + +

+Какие цели не преследует проект Rust? +

+ +1. Мы не используем самые последние передовых технологий. Мы считаем, что старые, провенные иструменты и методы лучше. +2. Мы не гонимся за выразительностью, минимализмом или элегантностью. Это желательные, но второстепенные цели. +3. Мы не собираемся реализовывать полный набор функций C++ или любого другого языка. Язык Rust должен обеспечивать основной функционал. +4. Мы не намерены быть 100% статическими, 100% безопасными, 100% отражающими или слишком догматическими в любом другом смысле. Существуют компромиссы. +5. Мы не требуем, чтобы Rust работал на «любой возможной платформе». В конечном итоге он должен работать без ненужных компромиссов на широко используемых аппаратных и программных платформах. + +

+В каких проектах Mozilla использует Rust? +

+ +Основной проект - [Servo](https://github.com/servo/servo), экспериментальный движок браузера Mozilla. Также ведётся работа над [интеграцией компонентов Rust](https://bugzilla.mozilla.org/show_bug.cgi?id=1135640) в Firefox. + +

+Есть ли примеры крупных проектов Rust? +

+ +В настоящее время существуют дву крупных проекта на Rust с открытым исходным кодом. Это [Servo](https://github.com/servo/servo) и компилятор [Rust compiler](https://github.com/rust-lang/rust). + +

+Кто уже использует Rust? +

+ +[Растущее число организаций!](Friends.html) + +

+Могу попробовать начать программировать на Rust где-либо? +

+ +Самый простой способ попробовать Rust в работе - с помощью [playpen](https://play.rust-lang.org/), онлайн-приложение для написания и запуска кода Rust. Если вы хотите попробовать Rust на вашей системе, [установить его](https://www.rust-lang.org/install.html) и пройдите через [Guessing Game](https://doc.rust-lang.org/stable/book/second-edition/ch02-00-guessing-game-tutorial.html) учебник в книге. + +

+Как я могу получить помощь в вопросах по Rust? +

+ +Есть несколько способов: + +- Сообщение в [users.rust-lang.org](https://users.rust-lang.org/), официальный форум пользователей Rust +- Спросите в официальном канале [Rust IRC](https://chat.mibbit.com/?server=irc.mozilla.org&channel=%23rust) (#rust на irc.mozilla.org) +- Попросите [Stackoverflow](https://stackoverflow.com/questions/tagged/rust) с тегом «rust» +- Опубликовать в [/r/rust](https://www.reddit.com/r/rust), неофициальный канал Rust + +

+Почему Rust сильно изменилась с течением времени? +

+ +Rust начал разрабатываться, как безопасноый, но удобный в использовании системный язык программирования. Стремясь к этой цели, было исследованно множество идей, некоторые из которых были сохранееы (время жизни, трейты), в то время как другие были отброшены. Кроме того, в начале до версии 1.0 большая часть стандартной библиотеки была переписана, поскольку ранние проекты были обновлены, чтобы наилучшим образом использовать функции Rust и обеспечивать качественные, совместимые межплатформенные API. Теперь, когда Rust достиг 1.0, язык гарантированно будет «стабильным»; и в то время как он может продолжать развиваться. Код, который работает на текущей версии Rust, должен продолжать работать (компилироваться) и с использованием функционал будущих версий. + +

+Как работает управление версиями Rust? +

+ +Языковое исполнение Rust следует [SemVer](http://semver.org/). Обратно несовместимыми изменения стабильных API-интерфейсов допускаются только в младших версиях, если эти изменения исправляют ошибки компилятора, исправляют ошибки безопасности. Более подробные рекомендации по незначительным изменениям в версии доступны в качестве утвержденных RFC как для [языка](https://github.com/rust-lang/rfcs/blob/master/text/1122-language-semver.md), так и [стандартной библиотеки](https://github.com/rust-lang/rfcs/blob/master/text/1105-api-evolution.md). + +Rust поддерживает три «канала релиза»: стабильный, бета-и ночной. Стабильные и бета-версии обновляются каждые шесть недель, причем текущая ночная становится новой бета-версией, а текущая бета-версия становится новой стабильной. Языковые и стандартные функции библиотеки, помеченные как неустойчивые или скрытые функции, могут использоваться только в ночном версии. Новые возможности утверждаются основной группой и соответствующими подгруппами. Такой подход позволяет проводить эксперименты, обеспечивая при этом надежные гарантии обратной совместимости. + +Дополнительные сведения читайте в блоге Rust [«Стабильность, как конечный результат».](Http://blog.rust-lang.org/2014/10/30/Stability.html) + +

+Могу ли я использовать нестабильные функции в бета-версии или стабильный версии? +

+ +Нет, нельзя. Разработчики усердно работают, чтобы обеспечить прочные гарантии стабильности функций, предусмотренных на бета и в стабильной версии. Когда что-то нестабильно, это означает, что мы пока не можем предоставить эти гарантии, и не хотим, чтобы люди, полагающиеся на него, были уверены в стабильной работе. Это дает нам возможность попробовать изменения в дикой природе на ночном канале выпуска, сохраняя при этом надежные гарантии для людей, стремящихся к стабильности. + +Вещи стабилизируются все время, а бета-версии и стабильные каналы обновляются каждые шесть недель, причем иногда исправления принимаются в бета-версии в другое время. Если вы ожидаете, что функция будет доступна без использования ночного канала выпуска, вы можете найти ее проблему отслеживания, проверив [`B-unstable`](https://github.com/rust-lang/rust/issues?q=is%3Aissue+is%3Aopen+tracking+label%3AB-unstable) тег на трекер проблемы. + +

+Что такое «Feature Gates»? +

+ +«Feature Gates» - это механизм, который Rust использует для стабилизации функций компилятора, языка и стандартной библиотеки. Функция «gated» доступна только на ночном канале, а затем только тогда, когда она явно разрешена с помощью атрибутов `#[feature]` или аргумента командной строки `-Z unstable-options`. Когда функция стабилизируется, она становится доступной на стабильном канале релиза и не нуждается в явной активации. В этот момент признак считается «нелогичным». Функциональные ворота позволяют разработчикам тестировать экспериментальные функции, пока они находятся в разработке, прежде чем они будут доступны на устойчивом языке. + +

+Почему используется двойная лицензия MIT / ASL2? +

+ +Лицензия Apache включает важную защиту от патентной агрессии, но она несовместима с GPL, версия 2. Чтобы избежать проблем с использованием Rust с GPL2, она лицензируется MIT. + +

+Почему разрешающая лицензия в стиле BSD, а не MPL? +

+ +Отчасти это связано с предпочтением оригинального разработчика (Graydon) и отчасти из-за того, что языки имеют более широкую аудиторию и более разнообразный набор возможных вложений и конечных целей, чем такие продукты, как веб-браузеры. Мы хотели бы как можно скорее обратиться к таким потенциальным контрибьютерам. + +

Производительность

+ +

+Насколько язык Rust быстр? +

+ +Он быстр! Rust уже конкурирует с идиоматическими C и C ++ в ряде эталонных тестов (например, [Benchmarks Game](https://benchmarksgame-team.pages.debian.net/benchmarksgame/faster/rust.html) и [другие](https://github.com/kostya/benchmarks)). + +Подобно C++, Rust занимает [нулевые затраты абстракции](http://blog.rust-lang.org/2015/05/11/traits.html) в качестве одного из своих основных принципов: ни одна абстракция Rust не налагает глобального штрафа за производительность, и нет накладных расходов от любой системы времени исполнения в традиционном смысле. + +Учитывая, что Rust построен на LLVM и стремится походить на Clang с точки зрения LLVM, любые улучшения производительности LLVM также помогают Rust. В конечном счете, более богатая информация в системе типа Rust также должна включать оптимизацию, которая является сложной или невозможной для кода C/C++. + +

+В Rust используется куча? +

+ +Нет. Одним из ключевых новшеств Rust является гарантия безопасности памяти *(без segfaults)* без необходимости сбора мусора. + +Предотвращая GC, Rust может предложить множество преимуществ: предсказуемую очистку ресурсов, снижение накладных расходов для управления памятью и, по существу, отсутствие системы времени исполнения. Все эти черты делают Rust четким и легким встраиванием в произвольные контексты и упрощают [интегрировать код Rust с языками, имеющими GC](http://calculist.org/blog/2015/12/23/neon-node-rust/). + +Rust избегает необходимости в GC через свою систему владения и заимствования, но эта же система помогает с множеством других проблем, в том числе +[управление ресурсами в целом](http://blog.skylight.io/rust-means-never-having-to-close-a-socket/) и [параллелизм](http://blog.rust-lang.org /2015/04/10/Fearless-Concurrency.html). + +В случае, когда единичного владения недостаточно, программы Rust полагаются на стандартный тип интеллектуального указателя с подсчетом ссылок, [`Rc`](https://doc.rust-lang.org/std/rc/struct.Rc.html), и его многопоточный аналог [`Arc`](https://doc.rust-lang.org/std/sync/struct.Arc.html) вместо GC. + +Тем не менее мы рассматриваем *необязательный сбор мусора* в качестве будущего расширение. Целью является обеспечение плавной интеграции с +собранные с мусором периоды времени, например, предлагаемые +[SpiderMonkey](https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey) +и [V8](https://developers.google.com/v8/?hl=ru) движки JavaScript. +Наконец, некоторые исследователи +[сборщики мусора Rust](https://manishearth.github.io/blog/2015/09/01/designing-a-gc-in-rust/) +без поддержки компилятора. +

+Почему программа может работать медленно? +

+ +По умолчанию компилятор [не производит оптимизацию кода](https://users.rust-lang.org/t/why-does-cargo-build-not-optimise-by-default/4150/3). + +Для оптимизации кода компилируете `cargo`, используя флаг `--release`. Если вы скомпилируете `rustc` напрямую, используйте флаг` -O`. Любой из них включит оптимизацию. + +

+Компиляция кода Rust происхожит медленно. Возможные причины? +

+ +Перевод и оптимизация кода. Rust обеспечивает абстракции высокого уровня, которые скомпилируются в эффективный машинный код, и эти переводы требуют времени для запуска, особенно при оптимизации. + +Из-за большого количесва файлов исходного кода компиляция моет происходит медленно. Над этой проблемой сейчас ведётся работа. Решение [умная компиляция](https://github.com/rust-lang/rfcs/blob/master/text/1298-incremental-compilation.md), которая должна превзойти модель компиляции в C++. + +Помимо модели компиляции, есть несколько других аспектов разработки языка Rust и реализации компилятора, которые влияют на производительность во время компиляции. + +Во-первых, Rust имеет систему с умеренно сложным типом и должен потратить нематерифицированное количество времени компиляции, применяя ограничения, которые делают Rust безопасным во время выполнения. + +Во-вторых, компилятор Rust страдает от долговременной технической задолженности и, в частности, генерирует некачественный LLVM IR, который LLVM должен тратить время на «фиксацию». Добавление нового внутреннего представления под названием [MIR](https://github.com/rust-lang/rfcs/blob/master/text/1211-mir.md) в компилятор Rust дает возможность выполнять больше оптимизаций и улучшить качество генерируемого LLVM IR, но эта работа еще не состоялась. + +В-третьих, использование Rust LLVM для генерации кода - это обоюдоострый меч: хотя он позволяет Rust иметь производительность во время мирового класса, LLVM - это большая структура, которая не ориентирована на производительность во время компиляции, особенно при работе с некачественными входы. + +Наконец, в то время как предпочтительная стратегия Rust для мономорфизации генериков (как в C++) создает быстрый код, она требует создания гораздобольшего кода, чем другие стратегии перевода. Программисты Rust могут использовать объекты признаков, чтобы отменить этот раздутый код, используя динамическую диспетчеризацию. + +

+Почему в Rust медленный HashMap? +

+ +П умолчанию [`HashMap`][HashMap] использует алгоритм [SipHash](https://131002.net/siphash/), который реализован так чтобы предотвращать [коллизии](http://programmingisterrible.com/post/40620375793/hash-table-denial-of-service-attacks-revisited) предоставляя [возможную производительность](https://www.reddit.com/r/rust/comments/3hw9zf/rust_hasher_comparisons/cub4oh6). + +Хотя SipHash [демонстрирует конкурентоспособность](http://cglab.ca/%7Eabeinges/blah/hash-rs/) во многих случаях, в одном случае, когда он заметно медленнее, чем другие алгоритмы хэширования, это короткие ключи, такие как целые числа. Вот почему программисты Rust часто наблюдают медленную работу с [`HashMap`] [HashMap]. В этих случаях часто рекомендуется использовать хешер [FNV](https://crates.io/crates/fnv), но имейте в виду, что он не обладает теми же свойствами сопротивления столкновению, что и SipHash. + +

+Почему нет интегрированной инфраструктуры бенчмаркинга? +

+ +Существует, но он доступен только на ночном канале релиза. В конечном итоге мы планируем создать подключаемую систему для интегрированных контрольных показателей, но в то же время существующая система [считается нестабильной](https://github.com/rust-lang/rust/issues/29553). + +

+Производится ли в Rust оптимизация вызовов? +

+ +Обычно нет. Оптимизация вызовов может быть реализована только в [ограниченных случаях](http://llvm.org/docs/CodeGenerator.html#sibling-call-optimization) и [не гарантируется](https://mail.mozilla.org/pipermail/rust-dev/2013-April/003557.html). Т.к эта опция хотелась сообществом, язык Rust имеет зарезервированное ключевое слово (`become`). + +

+Имеет ли Rust runtime? +

+ +Не в типичном смысле, используемом такими языками, как Java, но части стандартной библиотеки Rust можно считать «средой выполнения», предоставляющей кучи, обратные трассировки, разматывание и защиту стека. Существует [небольшое количество кода инициализации](https://github.com/rust-lang/rust/blob/33916307780495fe311fe9c080b330d266f35bfb/src/libstd/rt.rs#L43), который выполняется до функции пользователя `main`. Стандартная библиотека Rustre также ссылается на стандартную библиотеку C, которая делает аналогичную [инициализацию времени выполнения](http://www.embecosm.com/appnotes/ean9/html/ch05s02.html). Код Rust может быть скомпилирован без стандартной библиотеки, и в этом случае время выполнения примерно эквивалентно C.