Прошло пять недель с тех пор как вышла альфа версия Rust 1.0! До того как выйдет следующая предварительная версия Rust, мы хотели бы рассказать о текущем состоянии языка и о том, что мы еще намерены сделать по пути к стабильной версии 1.0.
TL;DR: Rust 1.0 выйдет 15 мая 2015 года
Расписание выхода версий
Исходя из прогресса, которого мы добились во время жизни первой альфы, мы составили точное расписание выхода новых версий до 1.0:
- Rust 1.0-alpha2 – 20 февраля
- Все модули из 1.0 будут помечены стабильными в ночных сборках – примерно 9 марта
- Rust 1.0-beta – 31 марта
- Rust 1.0 – 15 мая
Это расписание отличается от предыдущего тем, что мы закрепили определенный набор циклов разработки. Также новое расписание предусматривает вторую альфа-версию и только одну бета-версию.
Главная причина, по которой следующий релиз будет называться alpha2, а не beta1, это то, что мы только что утвердили новые модули path и IO, и хотели бы собрать побольше реакции сообщества, прежде чем объявлять их стабильными.
Что нового в alpha2
У нас получилось утвердить и реализовать почти все фичи, которые были запланированы на этот цикл разработки.
Самое важное – пересмотр API всех основных подсистем завершен: проведена реформа модулей path и IO. Сейчас все модули, которые мы хотим включить в 1.0, приняли свою окончательную форму (хотя возможны мелкие правки во время цикла alpha2).
Остальные изменения и улучшения:
- Замыкания: Rust теперь поддерживает замыкания с полным захвтом, а временная
|:|
нотация была объявлена deprecated. - Деструкторы: Утверждены новые правила деструкторов, устраняя необходимость использования конструкции
#[unsafe destructor]
. - Реформа path: Модуль
path
был спроектирован с нуля, чтобы устранить множество проблем с семантикой и удобством использования и чтобы использовать преимущества типов с динамическим размером (DST). - Реформа IO: Подсистема
io
была тщательно пересмотрена чтобы улучшить стабильность, кроссплатформенное поведение и избежать претенциозных высокоуровневых абстракций над системой. Несмотря на то, что почти все API было затронуто этими изменениями, они были сделаны по направлению к намного более консервативному и последовательному дизайну. - Приведения через разыменование (deref coercions): Новое неявное приведение типов затрагивает в основном умные указатели. С помощью него вы сможете передавать
&Vec<T>
там, где требуется&[T]
, или&Arc<T>
там, где требуется&T
. Эти приведения помогают избавиться от явного разыменования и ужасного "перезаимствования"&*
и в целом означают, что теперь вы можете думать о&
как об общем операторе заимствования (borrow operator). - Различные стадии стабильности фич: Теперь в Rust есть система именования фич API, похожая на то, как мы работали с фичами языка. Это новоое понятие поможет нам управлять прогрессом стандартной библиотеки и сделает более ясным процесс определения минимальной версии Rust, необходимой для крейта (crate, аналог пакета или библиотеки в экосистеме Rust – прим. пер.).
- Циклы for: Для более удобных циклов for введен новый трейт
IntoIterator
. Теперь можно писатьfor x in &vec
, вместоfor x in vec.iter()
. - Диапазоны: Мы утвердили нотацию диапазонов, добавлена конструкция
..
для полных диапазонов, что делает возможным в будущем использование API вродеcollection.remove(..)
. - Трейты: Были утверждены новые правила согласованности, что позволяет достичь одновременно большей гибкости и обоснованности для реализаций трейтов.
- Семантика переполнения: После долгих споров, была утверждена (будет реализована в alpha2) семантика целочисленного переполнения. Она призвана значительно упростить поиск багов переполнения, особенно при использовании совместно с fuzzing-методикой.
- Ассоциированные (associated) типы: Было исправлено множество багов со связанными типами в компиляторе, теперь их можно использовать повсеместно.
Еще несколько изменений на момент написания статьи не утверждены, но, скорее всего, войдут в alpha2: ковариантность и контравариантность типов, изменения в трейте Send и изменения в стандартной библиотеке после реформы целочисленных типов в alpha1.
Детали будут описаны в заметках к релизу на следующей неделе.
Почему еще одна альфа?
Главная причина – мы хотим оставить те API, которые мы недавно утвердили (например IO и path), помеченными нестабильными на несколько недель, чтобы успеть получить обратную связь. В бете мы собираемся вообще запретить использование нестабильных частей Rust.
Более подробно, этим релизом подчеркивается разница между альфа- и бета-версиями, связанная с нашей системой стабильности. В альфа релизах можно включить использование нестабильных фичей, но после выхода беты это будет возможно только при использовании ночных сборок. Релиз бета-версии станет той точкой, когда значительная часть сообщества сможет уйти от использования ночных сборок.
Как было сказано выше, мы утвердили все API, необходимые для выпуска 1.0, включая path и IO. Однако, некоторые изменения были приняты только в конце цикла и у сообщества нет достаточного опыта работы с изменными API, чтобы пометить их стабильными. Изменения в API, за исключением нескольких, очень консервативны: все они были сделаны по подобию существующих успешных библиотек.
После выхода alpha2 откроется длинное окно для внесения изменений в API, прежде чем они будет объявлены стабильными. Окно закроется примерно 9 марта.
Если ли риск пробуксовки из-за того, что сейчас вышла альфа, а не бета?
Навряд ли. Все фичи языка и стандартной библиотеки, необходимые для выпуска 1.0, утверждены. Это означает, что у нас есть 12 недель, чтобы отполировать все и спокойно перейти от alpha2 к стабильной 1.0.
Что еще случится до выхода 1.0?
Все фичи 1.0 уже утверждены. Остается только шлифовать, улучшать производительность и документацию, исправлять баги и набираться достаточной уверенности в новых API, чтобы можны было присвоить им метку #[stable]
.
Релиз alpha2 пометит deprecated (но оставит доступными) старые модули path и IO. Новые модули должны стать стабильными к 9 марта. Пожалуйста, пробуйте новые API и помогите нам выявить выявить возможные проблемы!
После дедлайна 9 марта для значительной части крейтов станет возможным работать только со "стабильным Rust", то есть без единого использования частей Rust, помеченных #[feature]
. После дедлайна, и до выхода бета-версии 1.0, мы намерены работать напрямую с авторами пакетов для crates.io, чтобы помочь перевести их код на стабильный Rust и выявить все пробелы в стабилизации языка.
Мы надеемся, что к моменту выхода беты значительная часть экосистемы перейдет с ночных сборок на стабильные релизы. Чтобы достичь этого, нужно чтобы все сообщество стало двигаться в направлении стабилизации, которую мы координируем с помощью discuss. Если вы еще не включились в этот процесс, пожалуйста зайдите туда и расскажите какие ключевые нестабильные API вы используете.
Автор: werktone