Приложение G: как создаётся Rust и что такое «Nightly Rust»
Это приложение о том, как создаётся Rust и как это сказывается на вас как на разработчике на Rust.
Стабильность без застоя
Rust как язык очень заботится о стабильности вашего кода. Мы хотим, чтобы Rust был надёжным, как скала, фундаментом для ваших проектов, а если бы всё постоянно менялось, это было бы невозможно. В то же время, если не экспериментировать с новыми возможностями, важные недостатки могут обнаружиться только после релиза, когда менять что-либо уже поздно.
Наше решение этой проблемы мы называем «стабильностью без застоя» (stability without stagnation), а главный принцип такой: вам никогда не должно быть страшно обновляться до новой версии стабильного Rust. Каждое обновление должно проходить безболезненно, но при этом приносить новые возможности, меньше багов и более быструю компиляцию.
Чух-чух! Каналы релизов и «поезда»
Разработка Rust идёт по расписанию поездов (train schedule). Вся разработка ведётся в основной ветке репозитория Rust. Релизы следуют модели «поезда релизов» (software release train), которую используют Cisco IOS и другие программные проекты. У Rust три канала релизов (release channels):
- Nightly (ночной)
- Beta (бета)
- Stable (стабильный)
Большинство разработчиков на Rust в основном пользуются стабильным каналом, а те, кто хочет попробовать экспериментальные новые возможности, — nightly или beta.
Вот пример того, как устроен процесс разработки и релизов. Допустим, команда Rust работает над релизом Rust 1.5. Этот релиз вышел в декабре 2015 года, но на нём удобно показать реалистичные номера версий. В Rust добавляется новая возможность: в основную ветку попадает новый коммит. Каждую ночь собирается новая ночная версия Rust. Каждый день — день релиза, и эти релизы автоматически создаёт наша инфраструктура. Так что со временем релизы выглядят так — по одному за ночь:
nightly: * - - * - - *
Раз в шесть недель приходит время готовить новый релиз! Ветка beta
репозитория Rust ответвляется от основной ветки, из которой собирается nightly.
Теперь релизов два:
nightly: * - - * - - *
|
beta: *
Большинство пользователей Rust не используют бета-релизы напрямую, но прогоняют на них тесты в своих CI-системах, помогая Rust находить возможные регрессии. Тем временем ночной релиз по-прежнему выходит каждую ночь:
nightly: * - - * - - * - - * - - *
|
beta: *
Допустим, нашлась регрессия. Хорошо, что у нас было время протестировать
бета-релиз, прежде чем регрессия пробралась в стабильный! Исправление
применяется к основной ветке, так что nightly исправлен, затем исправление
переносится (backport) в ветку beta, и выходит новый бета-релиз:
nightly: * - - * - - * - - * - - * - - *
|
beta: * - - - - - - - - *
Через шесть недель после создания первой беты приходит время стабильного
релиза! Ветка stable создаётся из ветки beta:
nightly: * - - * - - * - - * - - * - - * - * - *
|
beta: * - - - - - - - - *
|
stable: *
Ура! Rust 1.5 готов! Но мы забыли одну вещь: раз шесть недель прошли, нужна
новая бета следующей версии Rust, 1.6. Поэтому после того, как stable
ответвилась от beta, следующая версия beta снова ответвляется от nightly:
nightly: * - - * - - * - - * - - * - - * - * - *
| |
beta: * - - - - - - - - * *
|
stable: *
Это называется «моделью поездов», потому что каждые шесть недель релиз «отправляется со станции», но, прежде чем прибыть стабильным релизом, ему ещё предстоит проехать через бета-канал.
Rust выходит каждые шесть недель, как по часам. Если вы знаете дату одного релиза Rust, то знаете и дату следующего: через шесть недель. Приятная сторона такого расписания — следующий поезд скоро. Если какая-то возможность не успела к определённому релизу, волноваться не о чем: следующий будет совсем скоро! Это снижает соблазн впихнуть недоработанные возможности в последний момент перед релизом.
Благодаря такому процессу вы всегда можете взять следующую сборку Rust и сами
убедиться, что на неё легко обновиться: если бета-релиз работает не так, как
ожидалось, можно сообщить команде и добиться исправления до выхода следующего
стабильного релиза! Поломки в бета-релизах случаются относительно редко, но
rustc — всё-таки программа, а в программах бывают баги.
Срок поддержки
Проект Rust поддерживает самую свежую стабильную версию. Когда выходит новая стабильная версия, срок жизни старой заканчивается (end of life, EOL). То есть каждая версия поддерживается шесть недель.
Нестабильные возможности
У этой модели релизов есть ещё одна особенность — нестабильные возможности. Чтобы определить, какие возможности включены в данном релизе, Rust использует приём под названием «флаги возможностей» (feature flags). Если новая возможность активно разрабатывается, она попадает в основную ветку, а значит, и в nightly, но за флагом возможности. Если вы как пользователь хотите попробовать возможность, работа над которой ещё идёт, — пожалуйста, но для этого нужно использовать ночной релиз Rust и пометить исходный код соответствующим флагом, явно её включив.
В бета- и стабильных релизах Rust флаги возможностей использовать нельзя. Именно это позволяет нам опробовать новые возможности на практике, прежде чем навсегда объявить их стабильными. Кто хочет быть на переднем крае — может включить их, а кто хочет надёжности — остаётся на стабильном канале и знает, что код не сломается. Стабильность без застоя.
В этой книге описаны только стабильные возможности: те, что ещё в разработке, продолжают меняться и наверняка будут отличаться от того, какими они были на момент написания книги, к тому времени, как их включат в стабильные сборки. Документацию по возможностям, доступным только в 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
Как видите, по умолчанию используется стабильный тулчейн. Большинство
пользователей Rust почти всегда работают на стабильном. Возможно, вы тоже
захотите почти всегда использовать stable, но для конкретного проекта —
nightly, потому что вам нужна какая-то передовая возможность. Для этого в
каталоге проекта выполните rustup override и укажите тулчейн nightly — его
rustup будет использовать, когда вы находитесь в этом каталоге:
$ cd ~/projects/needs-nightly
$ rustup override set nightly
Теперь при каждом вызове rustc или cargo внутри ~/projects/needs-nightly
rustup позаботится, чтобы использовался ночной Rust, а не стабильный,
выбранный по умолчанию. Это удобно, когда у вас много проектов на Rust!
Процесс RFC и команды
Как же узнавать об этих новых возможностях? Разработка Rust идёт по процессу RFC (Request For Comments, «запрос комментариев»). Если вы хотите улучшить что-то в Rust, можно написать предложение — RFC.
Писать RFC для улучшения Rust может кто угодно; предложения рассматривает и обсуждает команда Rust, которая состоит из множества тематических подкоманд. Полный список команд есть на сайте Rust: там команды для каждой области проекта — дизайна языка, реализации компилятора, инфраструктуры, документации и других. Соответствующая команда читает предложение и комментарии, добавляет свои, и в итоге достигается консенсус — принять возможность или отклонить.
Если возможность принята, в репозитории Rust открывается задача (issue), и кто-нибудь может её реализовать. Реализовывать её вполне может не тот, кто изначально предложил! Когда реализация готова, она попадает в основную ветку за флагом возможности, как описано в разделе «Нестабильные возможности».
Через какое-то время, когда разработчики, использующие ночные релизы, успеют попробовать новую возможность, члены команды обсуждают её и то, как она показала себя в nightly, и решают, попадёт ли она в стабильный Rust. Если решение положительное, флаг возможности убирается, и возможность считается стабильной! Она отправляется на поезде в новый стабильный релиз Rust.