LINUX.ORG.RU

Rust 1.27

 


3

10

Команда разработчиков языка Rust рада представить новую версию Rust 1.27.0. Rust — системный язык программирования, ориентированный на безопасность, скорость и параллельность.

Основные изменения:

  • SIMD — наиболее значимое и ожидаемое нововведение: стабильная версия Rust обзавелась базовой поддержкой SIMD.
    Для примера использования рассмотрим следующий сниппет:
    pub fn foo(a: &[u8], b: &[u8], c: &mut [u8]) {
        for ((a, b), c) in a.iter().zip(b).zip(c) {
            *c = *a + *b;
        }
    }
    
    Здесь мы берем два слайса, складываем числа в них и помещаем результат в третий слайс. Самый простой способ, описанный выше — это проход в цикле по каждому слайсу, сложение и сохранение результата. Впрочем, это можно сделать быстрее и в LLVM может автовекторизовать такой код, подставив SIMD инструкции автоматически.

    Стабильный Rust уже давно использует возможности автовекторизации LLVM, но, к сожалению, компилятор может использовать подобные оптимизации не всегда. В Rust 1.27.0 добавлен модуль std::arch, включающий базовую поддержку использования инструкций SIMD напрямую из кода на Rust. Кроме того, добавлены соответствующие директивы условной компиляции:

    #[cfg(all(any(target_arch = "x86", target_arch = "x86_64"),
          target_feature = "avx2"))]
    fn foo() {
        #[cfg(target_arch = "x86")]
        use std::arch::x86::_mm256_add_epi64;
        #[cfg(target_arch = "x86_64")]
        use std::arch::x86_64::_mm256_add_epi64;
    
        unsafe {
            _mm256_add_epi64(...);
        }
    }
    
    В примере выше флаги cfg позволяют выбрать правильную версию функции в зависимости от целевой архитектуры во время компиляции. Также мы можем это сделать в рантайме:
    fn foo() {
        #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
        {
            if is_x86_feature_detected!("avx2") {
                return unsafe { foo_avx2() };
            }
        }
    
        foo_fallback();
    }
    

    Примитивы, включенные в стандартную библиотеку обеспечивают минимальную поддержку и весьма низкоуровневы, но их включение позволяет развивать более выкокоуровневые примитывы в библиотеках. К примеру, крейт faster предоставляет удобный интерфейс, основанный на концепции итераторов.

    Без SIMD

    let lots_of_3s = (&[-123.456f32; 128][..]).iter()
        .map(|v| {
            9.0 * v.abs().sqrt().sqrt().recip().ceil().sqrt() - 4.0 - 2.0
        })
        .collect::<Vec<f32>>();
    

    С SIMD (faster)

    let lots_of_3s = (&[-123.456f32; 128][..]).simd_iter()
        .simd_map(f32s(0.0), |v| {
            f32s(9.0) * v.abs().sqrt().rsqrt().ceil().sqrt() - f32s(4.0) - f32s(2.0)
        })
        .scalar_collect();
    

  • dyn Trait

    Изначальный синтаксис трейт-объектов в Rust — одна из тех вещей, о введении которых мы жалеем: для некоторого трейта Foo, его трейт-объект будет выглядеть так: Box<Foo>

    И если Foo является структурой, синтаксис аллокации структуры в «куче» будет выглядеть точно так же.

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

    То же самое справедливо для случая impl SomeTrait for SomeOtherTrait, что является корректным синтаксисом, но интуитивно понимается как реализация трейта SomeTrait для всех типов, реализующих SomeOtherTrait, но на самом деле это записывается как impl<T> SomeTrait for T where T: SomeOtherTrait, в то время как первый вариант является реализацией трейта для трейт-объекта.

    Кроме того, появление impl Trait в противовес Trait ввело некую неконсистентность при обучении языку.

    Исходя из этого, в Rust 1.27 мы стабилизируем новый синтаксис dyn Trait.
    Теперь трейт-объейты выглядят так:

    // old => new
    Box<Foo> => Box<dyn Foo>
    &Foo => &dyn Foo
    &mut Foo => &mut dyn Foo
    

    То же самое применимо к другим типам указателей:
    Arc<Foo> теперь объявляется как Arc<dyn Foo>.

    Исходя из требований к обратной совместимости, мы не можем удалить старый синтаксис, но мы добавили предупреждение компилятора, призывающее обновить синтаксис для трейт-объектов. Пока что оно выключено по умолчанию.

  • #[must_use] для функций
    Наконец, атрибут #[must_use] получил новые возможности: теперь он применим к функциям.

    Раньше он использовался только на типах, таких как Result<T, E>, где возвращаемое значение должно быть использовано, но теперь возможно такое применение:

    #[must_use]
    fn double(x: i32) -> i32 {
        2 * x
    }
    
    fn main() {
        double(4); // warning: unused return value of `double` which must be used
    
        let _ = double(4); // (no warning)
    }
    

    Также этот атрибут был добавлен к некоторым функциям в стандартной библиотеке, таким как Clone::clone, Iterator::collect и ToOwned::to_owned, теперь компилятор предупредит в случае, если их результат останется неиспользованным, что поможет заметить и предотвратить случайный вызов затратных операций.

Стабилизация стандартной библиотеки

Новые возможности Cargo

В текущем релизе в Cargo включены два маленьких нововведения:

Во-первых, Cargo теперь принимает флаг --target-dir.

Во-вторых, Cargo теперь будет пытаться автоматически найти тесты, примеры и исполняемые файлы (прим. бинарные подпроекты в библиотечных крейтах) в проекте, но явная конфигурация всё же будет требоваться в некоторых случаях.

Для помощи в конфигурации мы добавили несколько ключевых слов в Cargo.toml.

Обновить Rust можно с помощью команды:

curl https://sh.rustup.rs -sSf | sh # если у вас еще не установлен rustup
rustup update stable

>>> Подробности

★★★★★

Проверено: tailgunner ()
Последнее исправление: cetjs2 (всего исправлений: 5)
Ответ на: комментарий от WitcherGeralt

Ага. При этом мобильный рынок больше десктопа и приставок вместе взятых. И на мобилкак как раз индюшатина.

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

Зато сколько мусора в питоне, когда просто нужно пустить сабпроцесс.

воспользуюсь случаем попиарить xonsh

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

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

Я пристально слежу за GUI либами. Но лучше Qt так ничего и нет.

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

Мобильный рынок огромный. А рынок мобильных игр сомнительный, не понятно как и в каких единицах его оценивать. Да и сравнивать консоли (особенно) и десктопы с платформой, максимально не пригодной для чего либо кроме казуалок, как-то странно.

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

дык половина лора блеванёт, ничего не поделать

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

Как то печально. D выглядит куда интереснее в плане гуи (и не только).

anonymous
()
Ответ на: комментарий от MyTrooName
let model = Rc::new(RefCell::new(Model { count: 0 }));

Ммм... Язык — мечта формошлепа. Жесть прям с первой строчки хеллворда.

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

Я спросил, посмотрев. Может, не заметил чего-то.

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

Исторически сложилось, что графический тулкит — это скорее не отдельная сущность, а часть API операционной системы. Так разумно ли писать на расте новый тулкит вместо того чтобы интегрироваться в существующие?

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

Исторически сложилось, что графический тулкит — это скорее не отдельная сущность, а часть API операционной системы

Разве что «API ОС» понимается в вендовом смысле - в Unix тулкит никогда не был частью ОС, да и в винде есть Qt.

Так разумно ли писать на расте новый тулкит вместо того чтобы интегрироваться в существующие?

Не знаю. Но биндингов к существующим тулкитам и так уже много.

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

Его уже можно использовать в своих проекта и с софтварным рендерингом?

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

Может быть, если знаешь в точности что гуглить. У меня чот не гуглится, хотя я и не спарался, мне абсолютно наплевать. Это в любом случае не релевантно.

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

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

Разве что «API ОС» понимается в вендовом смысле

И в маковом, андроидовом, иосовом смысле тоже

в Unix тулкит никогда не был частью ОС

Никогда не был, и вот снова стал. Вернее «стали». Целых два. Сэндвич с Дерьмом 3 и Гигантская Клизма 5

Не знаю. Но биндингов к существующим тулкитам и так уже много

Нет того самого единственного: декларакивное реактивное описание интерфейса + работа на мобилках и десктопах, с задействованием родных компонентов

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

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

Я про это и говорил.

Первая ссылка по запросу games market revenue: https://newzoo.com/wp-content/uploads/2016/03/Global_Games_Market_2018.png

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

в Unix тулкит никогда не был частью ОС

Никогда не был, и вот снова стал. Вернее «стали». Целых два. Сэндвич с Дерьмом 3 и Гигантская Клизма 5

Я не понимаю языка, на котором ты говоришь.

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

работа на мобилках и десктопах

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

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

Анриал на С++ написан

А кто спорит? Я к тому, что сейчас в геймдеве большая часть функционала реализуется не на C/C++/Rust и подобных языках, а на непойми чем, на c#, lua, питоне, джаваскрипте, даже на полудохлом D Remedy игры кодят. И я бы не рискнул утверждать, что C/C++, в тех частях, в которых он ещё используется, присутствует там потому что это было осознанное решение «нам тут нужны кресты» а не потому, что эта подсистема из ранних нулевых и просто не было необходимости её переписывать.

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

Да ну, как так можно? Тулкит на другом языке обязательно не отвечает идеодогии/парадигме/эстетике целевого языка, тонкое душевкое равновесие разрабов мгновенно нарушается. Про NIH-синдром тоже не забывай.

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

даже на полудохлом D Remedy игры кодят.

Только не игры, а какую-то мелкую тулзу для игры, если не ошибаюсь.

Для скриптования что угодно используют, но рендеры как были на плюсах, так и остались. Альтернативно-то нет.

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

Нельзя сделать один GUI для десктопа и мобилок

Как же так-то. В браузере сто лет как пишут адаптивные приложения, а натив почемуто «нельзя». Можно, просто лэйаут будет перестраиваться в зависимости от размера экрана. Ну и элементы привести более-менее к одному размеру (долой чекбоксы размером в 10 пикселей)

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

Ну и элементы привести более-менее к одному размеру

Гном уже испоганили. Достаточно.

В браузере сто лет как пишут адаптивные приложения

Которые одинакового убого работают на всех платформах. Зачем далеко ходить - тот же github на мобилках как гавно.

Про нативные приложения соц. сетей для мобилок я вообще молчу.

А так да - веб 2.0 победил, ага.

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

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

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

Это картинка показывает, что мобильный рынок намного более прибыльный, из-за чего в него все лезут. Пишут те игры, которые продаются - ваш КО. А склепать очередной шлак для одноклеточный намного проще и выгоднее, чем делать очередной ААА долгострой.

Каким местом вы смотрели на этот график - не ясно.

RazrFalcon ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.