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

тонкое душевкое равновесие разрабов мгновенно нарушается

Более того, юзеры, увидев чекбокс с другим border-raduis перестают понимать как пользоваться компьютером и мгновенно впадают в депресию. Но, ЧСХ, это касается только родных приложений. А то, что на каждом сайте свой уникальный стиль всего чего только можно, всем почему-то пофиг

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

Ну прибыльный, и? Возвращаемся к релевантности. Старожилы не подвинуты, галактеко не опасносте, плюсы не выкинули, на раст пересаживаться не побежали.

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

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

gnome-control-center симпатичный, ИМХО

тот же github на мобилках как гавно

По непонятной причине, команда разрабов решила, что не надо в мобильной версии показывать звезды и основной язык. Их право. Мобильный браузер тут ни при чем. Кнопку «desktop version» внизу добавили и то хорошо

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

Пользуюсь, всё устраивает. Что с ними не так?

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

Чтобы судить о динамике нужно взглянуть на предыдущий год:
2017 — https://newzoo.com/insights/articles/the-global-games-market-will-reach-108-9...
2018 — https://newzoo.com/insights/articles/global-games-market-reaches-137-9-billio...
Таки мобилки отжали немного у PC и консолей.

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

А то, что на каждом сайте свой уникальный стиль всего чего только можно, всем почему-то пофиг

С чего вы так решили?

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

Ты понял о чем я) Юзер видит нестандартные элементы и у него повышается уровень стресса, преступности, соляной кислоты.. По крайней мере в этом нас хотят убедить разработчики ОС в своих стайлгайдах

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

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

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

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

Для того чтобы Гейб разогнал Валв ссаными тряпками? Дня чего достаточно и на что это влияет? Не улавливаю я твоей логики, если она вообще есть.

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

Есть подозрение, что в половине этих приложенек webview. А нативное затем, что богоподобный веб пока не научился доставлять нотификейшены в ждущем режиме. Работа с камерой и микрофоном тоже неочень. Ну и вообще фсб-кгб хотят полного владения твоим девайсом, чего через браузер не добиться

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

Нет. Разжевываю: GUI - это не только внешний вид, но и поведение. Всем известный look & feel. Wheel focus, tab order, hotkeys, native dialogs, buttons order и прочие прелести.

PS: русскоязычную терминологию не знаю.

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

Большая часть пространства не используется. Прямо как в десяточке.

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

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

Воот. Виндовс-юзер, открыв в винде GTK-приложение якобы испытает столько стресса, что впору вводить уголовную статью за gtk на винде

На самом деле нет. И, например, 40-50 летние бухи без проблем переходят со старого интерфейса 1с на такси, при том что и тот и другой далеки от виндового и друг от друга

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

И, например, 40-50 летние бухи без проблем переходят со старого интерфейса 1с

Ага. Я как-то писал софтину для бухгалтерии. Синдром утёнка только так. 4-я кнопка слева во втором ряду - это оно.

вводить уголовную статью за gtk на винде

Я только за. Но винду уже не спасти. Поэтому все эстеты давно свалили на мак.

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

Большая часть пространства не используется. Прямо как в десяточке

Но пользоваться-то возможно?

GTK3 позволяет мельчить, если тебе так хочется. Посмотри меню настроек gnome-terminal

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

И что из этого следует? Классическая индустрия под страхом от надвигающихся мобилок сама схлопнется чтоли? Или мобилонаци загонят консольщиков в лагеря, а бетезде станет некому продавать элдерскроллсы?

Пока рынок растёт, ничего с ней не будет. Прибыль же приносит, и приличную, а мобильный рынок вечно расти не может.

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

Ну так прибыль растет, вот тебе и тенденция. Нормально всё.

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

Если на нечто более вразумительное тебя не хватает, нк том и закончим.

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

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

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

Если слышишь где-то хруст, это снова отвалился* обновился руст.

* когда он распухнет и станет системным, не потребуется стишок переделывать

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

Не всё так просто. Для hello world сойдёт, но не более.

Разминка для ума: представьте как должна выглядеть прога уровня IDEA/Photoshop/After Effect/3D max/Autocad на мобилке. Правильно - никак. Нужно разрабатывать GUI с нуля.

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

это контрпример. ты бы хоть заголовок прочитал

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

Почему невозможно?

У меня запомнено 30+ точек доступа wifi. Там прокрутка вертикальная есть? Не могу разглядеть на скрине.

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

GTK3 позволяет мельчить, если тебе так хочется.

Мельчить - дело нехитрое. Убрать или хотя бы уменьшить пустое место... какие, говоришь, настройки Gtk3 за это отвечают?

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

Можешь убрать паддинги хоть в ноль. Берешь любую тему и херачишь CSS. Но проблем, тыжпрограммист.

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

IDEA/Photoshop/After Effect/3D max/Autocad

Office забыл. А вот плеер, файловый менеджер, IM, текстовый редатор,всякие конфигурялки и прочие фейсы к БД/утилите — вполне можно сделать адаптивными

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

Разминка для ума: представьте как должна выглядеть прога уровня IDEA/Photoshop/After Effect/3D max/Autocad на мобилке.

Как мобильный сканер, это давно известно. На сервер подаются кадры, со счёта списываются рубли, обработанные кадры подаются на экран - мобилка готова для десктопа! А если рубли списываются, разве надо что-то ещё разрабатывать? Всё что нужно, уже есть!

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