habrahabr

Rust 1.0: текущее состояние и окончательное расписание выхода версий

  • воскресенье, 15 февраля 2015 г. в 02:11:58
http://habrahabr.ru/post/250577/

Rust logo
Прошло пять недель с тех пор как вышла альфа версия 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 вы используете.