Приложение G - Как создается Rust и “Nightly Rust”
Это приложение о том, как создается Rust и как это влияет на вас как разработчика Rust.
Стабильность без застоя
Как язык, Rust очень заботится о стабильности вашего кода. Мы хотим, чтобы Rust был надежным фундаментом, на котором можно строить, а если бы все постоянно менялось, это было бы невозможно. В то же время, если мы не можем экспериментировать с новыми возможностями, мы можем не обнаружить важные недостатки до их выпуска, когда уже не сможем ничего изменить.
Наше решение этой проблемы — то, что мы называем «стабильностью без застоя», и наш руководящий принцип таков: вам никогда не должно быть страшно обновляться до новой версии стабильного Rust. Каждое обновление должно быть безболезненным, но также должно приносить новые возможности, меньше ошибок и более быстрое время компиляции.
Чух-чух! Каналы релизов и поездка на поездах
Разработка Rust работает по расписанию поездов. То есть вся разработка ведется в основной ветке репозитория Rust. Релизы следуют модели release train, которая использовалась в Cisco IOS и других программных проектах. У Rust есть три канала релизов:
- Nightly
- Beta
- Stable
Большинство разработчиков Rust в основном используют стабильный канал, но те, кто хочет попробовать новые экспериментальные возможности, могут использовать nightly или beta.
Вот пример того, как работает процесс разработки и выпуска: предположим, что команда Rust работает над релизом Rust 1.5. Этот релиз состоялся в декабре 2015 года, но он даст нам реалистичные номера версий. В Rust добавляется новая возможность: новый коммит попадает в основную ветку. Каждую ночь создается новая nightly-версия Rust. Каждый день — день релиза, и эти релизы создаются нашей релизной инфраструктурой автоматически. Поэтому с течением времени наши релизы выглядят так, раз за ночь:
nightly: * - - * - - *
Каждые шесть недель приходит время готовить новый релиз! Ветка beta
репозитория Rust отделяется от основной ветки, используемой nightly. Теперь
есть два релиза:
nightly: * - - * - - *
|
beta: *
Большинство пользователей Rust не используют beta-релизы активно, но проверяют свой код на beta в системе CI, чтобы помочь Rust обнаружить возможные регрессии. Тем временем nightly-релиз по-прежнему выходит каждую ночь:
nightly: * - - * - - * - - * - - *
|
beta: *
Допустим, найдена регрессия. Хорошо, что у нас было время протестировать
beta-релиз до того, как регрессия пробралась в стабильный релиз! Исправление
применяется к основной ветке, чтобы nightly был исправлен, затем исправление
переносится обратно в ветку beta, и выпускается новый beta-релиз:
nightly: * - - * - - * - - * - - * - - *
|
beta: * - - - - - - - - *
Через шесть недель после создания первой beta наступает время стабильного
релиза! Ветка stable создается из ветки beta:
nightly: * - - * - - * - - * - - * - - * - * - *
|
beta: * - - - - - - - - *
|
stable: *
Ура! Rust 1.5 готов! Однако мы забыли одну вещь: поскольку шесть недель прошли,
нам также нужна новая beta следующей версии Rust, 1.6. Поэтому после того как
stable отделяется от beta, следующая версия beta снова отделяется от
nightly:
nightly: * - - * - - * - - * - - * - - * - * - *
| |
beta: * - - - - - - - - * *
|
stable: *
Это называется «моделью поездов», потому что каждые шесть недель релиз «отправляется со станции», но ему все еще нужно пройти путь через канал beta, прежде чем он прибудет как стабильный релиз.
Rust выпускается каждые шесть недель, как часы. Если вы знаете дату одного релиза Rust, вы можете узнать дату следующего: она будет на шесть недель позже. Приятная сторона релизов, запланированных каждые шесть недель, в том, что следующий поезд скоро придет. Если какая-то возможность не попала в конкретный релиз, не нужно беспокоиться: скоро будет другой! Это помогает снизить давление и не протаскивать потенциально недоработанные возможности близко к крайнему сроку релиза.
Благодаря этому процессу вы всегда можете проверить следующую сборку Rust и
самостоятельно убедиться, что обновиться до нее легко: если beta-релиз работает
не так, как ожидалось, вы можете сообщить об этом команде и добиться
исправления до следующего стабильного релиза! Поломки в beta-релизе
относительно редки, но rustc все еще является программным обеспечением, и
ошибки существуют.
Время сопровождения
Проект Rust поддерживает самую свежую стабильную версию. Когда выпускается новая стабильная версия, старая версия достигает конца жизненного цикла (EOL). Это означает, что каждая версия поддерживается шесть недель.
Нестабильные возможности
У этой модели релизов есть еще одна особенность: нестабильные возможности. Rust использует технику под названием «флаги возможностей» (feature flags), чтобы определять, какие возможности включены в данном релизе. Если новая возможность активно разрабатывается, она попадает в основную ветку и, следовательно, в nightly, но за флагом возможности. Если вы как пользователь хотите попробовать возможность, находящуюся в процессе разработки, вы можете это сделать, но должны использовать nightly-релиз Rust и аннотировать исходный код соответствующим флагом, чтобы явно включить эту возможность.
Если вы используете beta- или stable-релиз Rust, вы не можете использовать никакие флаги возможностей. Это ключ, который позволяет нам получить практический опыт использования новых возможностей до того, как мы навсегда объявим их стабильными. Те, кто хочет использовать самый передний край, могут это сделать, а те, кто хочет максимально надежного опыта, могут оставаться на stable и знать, что их код не сломается. Стабильность без застоя.
Эта книга содержит информацию только о стабильных возможностях, поскольку возможности в разработке все еще меняются, и они наверняка будут отличаться между моментом написания этой книги и моментом, когда их включат в стабильные сборки. Документацию по возможностям только для nightly можно найти онлайн.
Rustup и роль Rust Nightly
Rustup позволяет легко переключаться между разными каналами релизов Rust глобально или для отдельного проекта. По умолчанию у вас будет установлен стабильный Rust. Например, чтобы установить nightly:
$ rustup toolchain install nightly
С помощью rustup также можно увидеть все установленные у вас toolchains
(релизы Rust и связанные компоненты). Вот пример на одном из компьютеров
авторов под Windows:
> rustup toolchain list
stable-x86_64-pc-windows-msvc (default)
beta-x86_64-pc-windows-msvc
nightly-x86_64-pc-windows-msvc
Как видите, стабильный toolchain используется по умолчанию. Большинство
пользователей Rust большую часть времени используют stable. Возможно, большую
часть времени вы захотите использовать stable, но применять nightly в
конкретном проекте, потому что вам важна передовая возможность. Для этого можно
использовать rustup override в директории этого проекта, чтобы установить
nightly toolchain как тот, который rustup должен использовать, когда вы
находитесь в этой директории:
$ cd ~/projects/needs-nightly
$ rustup override set nightly
Теперь каждый раз, когда вы вызываете rustc или cargo внутри
~/projects/needs-nightly, rustup будет следить за тем, чтобы вы
использовали nightly Rust, а не stable Rust по умолчанию. Это удобно, когда у
вас много проектов Rust!
Процесс RFC и команды
Так как же узнать об этих новых возможностях? Модель разработки Rust следует процессу Request For Comments (RFC). Если вы хотите улучшения в Rust, вы можете написать предложение, называемое RFC.
Любой может писать RFC для улучшения Rust, а предложения рассматриваются и обсуждаются командой Rust, состоящей из множества тематических подкоманд. Полный список команд есть на сайте Rust; он включает команды для каждой области проекта: дизайн языка, реализация компилятора, инфраструктура, документация и многое другое. Соответствующая команда читает предложение и комментарии, пишет собственные комментарии, и в конечном итоге достигается консенсус о принятии или отклонении возможности.
Если возможность принята, в репозитории Rust открывается issue, и кто-то может ее реализовать. Человек, который ее реализует, вполне может оказаться не тем, кто изначально предложил эту возможность! Когда реализация готова, она попадает в основную ветку за feature gate, как мы обсуждали в разделе «Нестабильные возможности».
Через некоторое время, когда разработчики Rust, использующие nightly-релизы, смогут попробовать новую возможность, участники команды обсудят возможность, то, как она показала себя в nightly, и решат, должна ли она попасть в stable Rust или нет. Если решение — двигаться дальше, feature gate удаляется, и возможность теперь считается стабильной! Она едет на поездах в новый стабильный релиз Rust.