LINUX.ORG.RU

Rust 1.22.0 и 1.22.1

 


2

7

Команда языка Rust с радостью представляет две версии языка Rust, 1.22 и 1.22.1. Rust — это системный язык программирования, который нацелен на безопасность, скорость выполнения и параллельное исполнение.

Подождите, две версии? В последний момент мы нашли баг на новой macOS High Sierra и по разным причинам решили выпустить 1.22 как обычно, а также выпустить пропатченный 1.22.1. Баг был найден в Cargo и влияет он только на пользователей macOS High Sierra.

Если у вас уже есть предыдущая версия Rust, обновите ее с помощью:

$ rustup update stable

Если у вас еще нет rustup, то вы можете скачать его. Детальный патчноут.

Что нового в 1.22.0 и 1.22.1

Главным нововведением является возможность использования ? для Option<T>! Примерно год назад мы представляли оператор ? для работы с Result<T, E>. С того момента началась дискуссия о будущем этого оператора. Должен он использоваться только с Result<T, E>? Должен ли он быть расширяем пользователем? Должен ли он использоваться с Option<T>?

В Rust 1.22 базовое использование данного оператора с Option<T> было стабилизировано. Теперь данный код будет компилироваться:

fn try_option_some() -> Option<u8> {
    let val = Some(1)?;
    Some(val)
}
assert_eq!(try_option_some(), Some(1));

fn try_option_none() -> Option<u8> {
    let val = None?;
    Some(val)
}
assert_eq!(try_option_none(), None);

Однако его функционал все еще ограничен. Вы не сможете писать код, который совмещает использование оператора ? для Option<T> и Result<T, E> в одной функции, например. Это будет возможно в будущем и уже доступно в nightly версии. Ждите новостей об этом операторе в будущем.

Типы, которые реализуют Drop теперь могу использоваться с const и static:

struct Foo {
    a: u32
}

impl Drop for Foo {
    fn drop(&mut self) {}
}

const F : Foo = Foo { a : 0 };
static S : Foo = Foo { a : 0 };

Само изменение не приносит много нового, но улучшение возможности вычисления во время компиляции в будущем принесет больше возможностей для const и static.

Также, некоторые маленькие изменения:

Два последних изменения в компиляторе ускорят компиляцию в debug режиме. У нас нет точных чисел, но, как обычно, время компиляции очень важно для нас, поэтому мы продолжим работать в этом направлении в будущем.

T op= &T теперь работает для примитивов:

let mut x = 2;
let y = &8;

// Теперь это будет работать
x += y;

Ранее вам нужно было писать x += *y для разыменовывания.

Улучшены бектрейсы на MacOS.

Теперь вы можете создавать compile-fail тесты в Rustdoc:

/// ```compile_fail
/// let x = 5;
/// x += 2; // shouldn't compile!
/// ``

Заметьте, что данные тесты могут опасны, потому что теперь код, который не компилировался, будет компилироваться. Например, оператор ?: код с ним не будет компилироваться в 1.21, но успешно скомпилируется на 1.22 и, возможно, сломает ваши тесты.

Также, мы перестаем поддерживать le32-unknown-nacl. Google уже отказались от поддержки PNaCl, направив силы на поддержку WebAssembly.

Стабилизация библиотеки

Несколько новых API были стабилизированы:

И другие.

Cargo

Если у вас есть какие-либо примеры для пользователей, то теперь Cargo может собирать их в поддиректории в examples, которая содержит main.rs.

Теперь Cargo может использовать git-репозитории для получения зависимостей.

>>> Полный патчноут

Ответ на: комментарий от anonymous

Статически зависимые типы приняты к разработке еще в мае и сейчас в стадии разработки.

Динамически зависимые типы (создание или использование типов, зависимых от текущего значения переменных), отложены на неопределенный срок.

gene1 ()

скорость выполнения

Я читал что вроде на сабже сделали движок в FF57. Так я хз где там скорость но тормозить он стал еще более чем предыдщий фокс :(

mx__ ★★★ ()

Лично я жду, когда уже стабилизируют поддержку SIMD.

Не то чтобы я лично горю желанием в ручную его писать, но есть шанс что ее впилят в Rayon, и тогда обычный итератор .par_iter() будет не только параллелить на несколько ядер, но и векторизировать код на одно ядро (или оба приема сразу). Прибавка к производительности будет очень ощутима.

gene1 ()
Ответ на: комментарий от dearAmomynous

Не совсем у меня а рядом. Теперь этому человеку пришлось с ФФ на хром перелезть. Сам же я на своём планшете давно от ФФ отказался ... невозможные тормоза :(

mx__ ★★★ ()
Ответ на: комментарий от mx__

Я читал что вроде на сабже сделали движок в FF57.

Ты читал наискосок. Движок старый, его только несколько форсировали с помощью переписанных на сабже компонентов.

Virtuos86 ★★★★★ ()

Заметьте, что данные тесты могут опасны, потому что теперь код, который не компилировался, будет компилироваться.

«Обращаем ваше внимание на то что подобные тесты менее надежны, так как дополнительные возможности Rust могут заставить работать ранее не собиравшийся код.»

«Теперь» там нету, это просто напоминание о том что обратная совместимость не заперщает в будущем добавить в язык что-то, что сломает твой тест на падение сборки.

Если у вас есть какие-либо примеры для пользователей, то теперь Cargo может собирать их в поддиректории в examples, которая содержит main.rs.

А тут речь о добавлении _многофайловых_ примеров. Однофайловые-то чуть не с самого появления cargo были.

ozkriff ()

Кого-то бомбит что чтобы использовать половину библиотек - нужен nightly? А чтобы использовать nightly - нужен rustup. Мало того что он срет в систему, так еще если у тебя Gentoo, то Firefox тянет стабильный, а чтобы кодить нужно rustup. Rustup находит стабильный и не ставится.

Меня бомбит.

Пока что буду есть кактус. И радоваться

vertexua ★★☆☆☆ ()
Последнее исправление: vertexua (всего исправлений: 1)
Ответ на: комментарий от bread

Действительно бесит современная привычка Мозиллы делать релизы каждые Х недель, независимо от количества и качества изменений, и последствий с обратной совместимостью.

Они сделали Раст 1.0 с гарантией стабильности «чтобы люди начали использовать», но в итоге, во-первых, стабильный язык настолько сырой, что все все равно используют nightly, а во-вторых, обратная совместимость уже создает проблемы в дизайне языка. Например, деструкторы работают в режиме FIFO, хотя с точки зрения структурной логики это абсурдно, а правильно надо - LIFO - но уже не исправить без поломки обратной совместимости.

gene1 ()
Ответ на: комментарий от gene1

Например, деструкторы работают в режиме FIFO, хотя с точки зрения структурной логики это абсурдно, а правильно надо - LIFO - но уже не исправить без поломки обратной совместимости.

struct PrintOnDrop(&'static str);

impl Drop for PrintOnDrop {
    fn drop(&mut self) {
        println!("{}", self.0);
    }
}

fn main() {
    let _first = PrintOnDrop("Declared first!");
    let _second = PrintOnDrop("Declared second!");
}
Declared second!
Declared first!

?

ozkriff ()
Ответ на: комментарий от gene1

стабильный язык настолько сырой, что все все равно используют nightly

Как-то слишком драматично:

https://blog.rust-lang.org/2017/09/05/Rust-2017-Survey-Results.html

Stable users now make up 77.9% of Rust users. Unfortunately, despite our efforts with procedural macros and helping move crates like Serde to stable, we still have work to do to promote people moving away from the nightly Rust compiler. This year shows an increase in nightly users, now at 1,852 votes it represents 51.6% of respondents using nightly, up from 48.8% of last year.

По опросу выходит что 77.9% проектов сидят на стабильном канале, а 51.6% разработчиков используют ночной канал локально для разработки.

ozkriff ()
Ответ на: комментарий от vertexua

чтобы использовать половину библиотек - нужен nightly

Очень сильно от области проекта зависит + см. комент выше про статистику опроса.

Мало того что он срет в систему,

У меня он пишет только в одну директорию внутри home, насколько я знаю, и то можно настроить на другое место, вроде.

Rustup находит стабильный и не ставится.

Я точно видел где-то что rustup учили использовать системный rustc/cargo. Не натыкался на это или не работает для твоего случая?

ozkriff ()
Ответ на: комментарий от gene1

обратная совместимость уже создает проблемы в дизайне языка ... но уже не исправить без поломки обратной совместимости

https://github.com/rust-lang/rfcs/pull/2052 - RFC с эпохами, кстати, видел? Походу вот они вместо «Rust 2/3/4/...» будут отвечать за точечные сломамы обратной совместимости в ключевых местах. Вроде как вполне есть шанс не в таком уж отдаленном будущем постепенно убрать самые неприятные обратно-совместимые бородавки языка.

ozkriff ()

Ну и говно же этот ваш раст. Какой упоротый должен быть пейсатель на нем, чтобы пользоваться таким дебильным синтаксисом.

anonymous ()
Ответ на: комментарий от ozkriff

Одно дело - поломать совместимость таким образом, чтобы старый код не компилился. Или, в крайнем случае, гарантированно паниковал в рантайме. Это можно сделать в новой эпохе - разработчики увидят что сломано, и пофиксят.

Но есть изменения, которые тихо меняют семантику кода, не оставляя никаких индикаций что она теперь неправильная, и потенциально создает баги или угрозы безопасности (я читал, в частности, что порядок деструкторов семантически важен в одной из криптографических библиотек в Расте). Подобные изменения (если они не результат явного багфикса), вероятнее всего не будут приняты даже в будущих эпохах, так как слишком большой риск для разработчиков словить и не заметить регрессию.

gene1 ()