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)

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

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

Чистейший, незамутнённый здравым смыслом, бред.

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

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

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

И зачем тогда придумывать новые ЯП бера за основу С/С++ ? Один ЯП ассемблер на стероидах с фичами типа запишем «==» вместо «=» чтобы укоротить количество символов в коде, а другой ну просто образец простоты думанья, для его компиляния и железо нужно выше среднего, чтобы комп сутки не думал.

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

В редакторе с нормальной подсветкой синтаксиса одинарные кавычки не составляют проблем. Так как сразу видно что это не кавычки а просто штрих.

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

При чем тут вообще кресты, если я отвечаю на пример с растом?

UPD: а, окей, тут нет различий в синтаксисе, только в семантике. My bad.

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

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

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

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

может ты еще и код в микрофон начитываешь?

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

Это ошибка судить по процентным значениям. Часто этим манипулируют подменяя понятия для создания нужных ощущений у тех кто голову не желает включать.
Нужно не забывать смотреть на абсолютные значения, которые «почему-то» скрываются и понимать что за этими цифрами вообще стоит.
Мобильный рынок определённо растёт быстрее, т.к. смартфоны доступнее населению и рынок сравнительно молодой, но это не значит что он в реальности теснит другие сегменты рынка, он просто появляется как новая ниша.
Скажем кто любит горький шоколад не перестанет его покупать потому что появился молочный (но мелкие дети конечно побегут за молочным). Кто покупал автомобили не пересядет внезапно полностью на велосипед (и тут кстати видно что одно другому не мешает).
Игры для смартфонов довольно специфические в силу того как смартфоны используются (короткие сессии) и их технических ограничений (я говорю больше о «вводе», хотя мощность тоже имеет значение) и производители не стремятся делать смартфоны более дружелюбными к полноценным играм.
Там свой тип аудитории и свои подходы по получению от этого населения прибыли.
За строчкой смартфоны стоит отдельный зоопарк устройств и пригодный для графонистых игр например не такой уж большой кусок.
Короче не стоит противопоставлять однокнопочные дрочильни полноценным ПК/консольным играм.

Вот что происходит когда пытаются надеть сову на глобус https://www.youtube.com/watch?v=fyNXQpAFQJc

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

Полностью согласен. Но рынок ПК всё равно уменьшается. Ещё 10 лет назад у человека, которому не очень нужен был комп, был хотя бы ноут/нетбук. А теперь, в лучшем случае, планшет.

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

Ещё 10 лет назад у человека, которому не очень нужен был комп, был хотя бы ноут/нетбук. А теперь, в лучшем случае, планшет.

Ещё 10 лет назад много кому не нужне был комп. В 2018 уже сложно такого человека представить.

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

Ещё 10 лет назад много кому не нужне был комп. В 2018 уже сложно такого человека представить.

«комп» != «стационарный ПК»; компьютерные потребности большинства людей удовлетворяет смартфон или планшет.

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

Комп нужен не больше чем 10 и 20 и 30 лет назад. То есть не нужен почти никому. Это маркетологи потоптались, убедив ширнармассы что им очень нужно ненужно, аж житья нет без него. В итоге лохи выпрыгивают из трусов, чтобы погасить кредит на ойфон, а чоткие дяди прикупают новую яхту. Се ля ви.

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

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

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

«комп» != «стационарный ПК»

Производители пк всё про***ли. Ноут на виндовз 10 из нижней ценовой категории это: «мобильный» проц с такими частотами, что я бы и 10 лет назад плевался; Windows «подождите минутку, почти готово» 10; внедренные производителем ноута десятки блотватрей

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

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

Так-то скачать счет в PDF с почты — тоже в каком-то смысле потребление контента. Это разработчикам понятно что нужен старый добрый ПиСи

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

Это разработчикам понятно что нужен старый добрый ПиСи

ПК нужен для работы (производства контента), мобилки - чисто для потребления.

Помимо разрабов есть ещё художники, аниматоры, дизайнеры и тысячи других.

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

художники, аниматоры, дизайнеры

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

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

если бы не современные тенденции индуского софтостроения и софтовпихивания

Так, стоп. Разрыв шаблона. Не ты ли здесь главный евангелист электрона?

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

Десяточка (к тому же брендированная) гуано не по причине того, что все ПО в ней перевели на веб. У меня тут, между прочим, где-то eeepc на ChromeOS вполне шустро гоняет андроид-приложения

А с десяточкой, из неттопов, нормально работает только какая-то аллюминиевая д**сня за 60к

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

Ты видимо перепутал с D. Там по умолчанию наоборот есть GC, но его можно отключить в режиме «Better C»

А в Rust как раз весь цимес в том, что GC становится не нужен, так как есть линейные типы

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

Не перепутал. Я следил за растом когда он только ещё появился, разговоры о gc тогда точно были, и мне казалось, что он в каком-то виде есть. Перестал следить, когда осознал что раст окончательно скатился в функциональщину.

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

как есть линейные типы

Означает ли это, память потом не нужно вычищать руками?

Тут, кстати, следует уточнить у фалькона что он имел ввиду, действительно ли ему нужен gc, или он это условно это сказал, подразумевая отсутствие необходимости рукоблудия с памятью.

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

подразумевая отсутствие необходимости рукоблудия с памятью

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

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

Тормоза не являются критерием для хомячков. Да и ноут большой и тяжелый. Ненужно. Нужен только телефон, от силы планшет.

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

Перестал следить, когда осознал что раст окончательно скатился в функциональщину.

Где? Где вы все видите функциональщину в раст? Лямбды что ли?

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

Он накладывает определенные ограничения. Ваш КО.

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

Где вы все видите функциональщину в раст?

ADT + pattern matching, HOF, иммутабельность. И лямбды, да.

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

Не бесплатно, что характерно. Производительность ниже чем у Rust.

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