- PVSM.RU - https://www.pvsm.ru -

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

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 мая

Это расписание отличается от предыдущего [1] тем, что мы закрепили определенный набор циклов разработки. Также новое расписание предусматривает вторую альфа-версию и только одну бета-версию.

Главная причина, по которой следующий релиз будет называться alpha2, а не beta1, это то, что мы только что утвердили новые модули path и IO, и хотели бы собрать побольше реакции сообщества, прежде чем объявлять их стабильными.

Что нового в alpha2

У нас получилось утвердить и реализовать почти все фичи, которые были запланированы [2] на этот цикл разработки.

Самое важное – пересмотр API всех основных подсистем завершен: проведена реформа модулей path и IO. Сейчас все модули, которые мы хотим включить в 1.0, приняли свою окончательную форму (хотя возможны мелкие правки во время цикла alpha2).

Остальные изменения и улучшения:

  • Замыкания: Rust теперь поддерживает замыкания с полным захвтом [3], а временная |:| нотация была объявлена deprecated.
  • Деструкторы: Утверждены новые правила деструкторов [4], устраняя необходимость использования конструкции #[unsafe destructor].
  • Реформа path: Модуль path был спроектирован [5] с нуля, чтобы устранить множество проблем с семантикой и удобством использования и чтобы использовать преимущества типов с динамическим размером (DST).
  • Реформа IO: Подсистема io была тщательно пересмотрена [6] чтобы улучшить стабильность, кроссплатформенное поведение и избежать претенциозных высокоуровневых абстракций над системой. Несмотря на то, что почти все API было затронуто этими изменениями, они были сделаны по направлению к намного более консервативному и последовательному дизайну.
  • Приведения через разыменование (deref coercions): Новое неявное приведение типов [7] затрагивает в основном умные указатели. С помощью него вы сможете передавать &Vec<T> там, где требуется &[T], или &Arc<T> там, где требуется &T. Эти приведения помогают избавиться от явного разыменования и ужасного "перезаимствования" &* и в целом означают, что теперь вы можете думать о & как об общем операторе заимствования (borrow operator).
  • Различные стадии стабильности фич: Теперь в Rust есть система именования фич API [8], похожая на то, как мы работали с фичами языка. Это новоое понятие поможет нам управлять прогрессом стандартной библиотеки и сделает более ясным процесс определения минимальной версии Rust, необходимой для крейта (crate, аналог пакета или библиотеки в экосистеме Rust – прим. пер.).
  • Циклы for: Для более удобных циклов for введен новый трейт IntoIterator. Теперь можно писать for x in &vec, вместо for x in vec.iter().
  • Диапазоны: Мы утвердили нотацию диапазонов [9], добавлена конструкция .. для полных диапазонов, что делает возможным в будущем использование API вроде collection.remove(..).
  • Трейты: Были утверждены [10] новые правила согласованности, что позволяет достичь одновременно большей гибкости и обоснованности для реализаций трейтов.
  • Семантика переполнения: После долгих споров, была утверждена [11] (будет реализована в alpha2) семантика целочисленного переполнения. Она призвана значительно упростить поиск багов переполнения, особенно при использовании совместно с fuzzing-методикой.
  • Ассоциированные (associated) типы: Было исправлено множество багов со связанными типами в компиляторе, теперь их можно использовать повсеместно.

Еще несколько изменений на момент написания статьи не утверждены, но, скорее всего, войдут в alpha2: ковариантность и контравариантность типов [12], изменения в трейте Send [13] и изменения в стандартной библиотеке после реформы целочисленных типов в alpha1 [14].

Детали будут описаны в заметках к релизу на следующей неделе.

Почему еще одна альфа?

Главная причина – мы хотим оставить те API, которые мы недавно утвердили (например IO и path), помеченными нестабильными на несколько недель, чтобы успеть получить обратную связь. В бете мы собираемся вообще запретить использование нестабильных частей Rust.

Более подробно, этим релизом подчеркивается разница между альфа- и бета-версиями [1], связанная с нашей системой стабильности [15]. В альфа релизах можно включить использование нестабильных фичей, но после выхода беты это будет возможно только при использовании ночных сборок. Релиз бета-версии станет той точкой, когда значительная часть сообщества сможет уйти от использования ночных сборок.

Как было сказано выше, мы утвердили все 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 [16]. Если вы еще не включились в этот процесс, пожалуйста зайдите туда и расскажите какие ключевые нестабильные API вы используете.

Автор: werktone

Источник [17]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/82919

Ссылки в тексте:

[1] предыдущего: http://blog.rust-lang.org/2014/12/12/1.0-Timeline.html

[2] запланированы: http://blog.rust-lang.org/2015/01/09/Rust-1.0-alpha.html

[3] замыкания с полным захвтом: https://github.com/rust-lang/rfcs/blob/master/text/0231-upvar-capture-inference.md

[4] правила деструкторов: https://github.com/rust-lang/rfcs/pull/769

[5] спроектирован: https://github.com/rust-lang/rfcs/pull/474

[6] тщательно пересмотрена: https://github.com/rust-lang/rfcs/blob/master/text/0517-io-os-reform.md

[7] Новое неявное приведение типов: https://github.com/rust-lang/rfcs/pull/241

[8] именования фич API: https://github.com/rust-lang/rfcs/pull/475

[9] утвердили нотацию диапазонов: https://github.com/rust-lang/rfcs/pull/702

[10] утверждены: http://internals.rust-lang.org/t/orphan-rules/1322

[11] утверждена: https://github.com/rust-lang/rfcs/pull/560

[12] ковариантность и контравариантность типов: https://github.com/rust-lang/rfcs/pull/738

[13] изменения в трейте Send: https://github.com/rust-lang/rfcs/pull/458

[14] изменения в стандартной библиотеке после реформы целочисленных типов в alpha1: https://github.com/rust-lang/rust/issues/22240

[15] системой стабильности: http://blog.rust-lang.org/2014/10/30/Stability.html

[16] discuss: http://users.rust-lang.org/t/using-unstable-apis-tell-us-about-it/157/26

[17] Источник: http://habrahabr.ru/post/250577/