Релиз языка программирования Rust 1.27

Состоялся релиз языка системного программирования Rust 1.27, развиваемого проектом Mozilla. Язык сфокусирован на безопасной работе с памятью, обеспечивает автоматическое управление памятью и предоставляет средства для достижения высокого параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime.

Автоматическое управление памятью в Rust избавляет разработчика от манипулирования указателями и защищает от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo, позволяющий получить нужные для программы библиотеки в один клик. Для размещения библиотек поддерживается репозиторий crates.io.

В подготовке нового выпуска принял участие 131 разработчик. Основные новшества:

  • Добавлена поддержка параллельной обработки данных c использованием инструкций SIMD. В разряд стабильных переведены модули std: arch: x86 и std: arch: x86_64 (std: arch: arm пока остаётся экспериментальным), предоставляющие доступ к процессорным инструкциям SIMD, для определения поддержки которых предложены макрос «is_x86_feature_detected», атрибут '#[target_feature (enable=»)]' и проверочная конструкция '#[cfg (target_feature = »…»)]'. К инструкциям можно обращаться напрямую без выноса логики их задействования на плечи компилятора. Например, можно подготовить несколько вариантов обработчиков функции, один из которых использует AVX2, а другой применяется на системах без поддержки SIMD:
         fn foo() {         #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]         {             if is_x86_feature_detected!("avx2") {                  return unsafe { foo_avx2() };             }         }         foo_fallback();     }  

    В настоящее время для вызова SIMD в std: arch предлагаются только низкоуровневые примитивы, но в будущих выпусках ожидается появление высокоуровневого интерфейса std: simd, который пока не прошёл стадию стабилизации. Кроме того, уже развиваются библиотеки для упрощения применения SIMD, например доступен модуль faster, а в модуль regex добавлен код для использования SIMD для ускорения обработки данных;

  • Предложен новый синтаксис для создания объектов trait — «dyn Trait», который синтаксически эквивалентен старому Trait, но унифицирован с учётом нового выражения «impl Trait» (т.е. чтобы не создавать путаницу c impl предлагается явно писать «dyn»). Например, вместо »&Trait» теперь рекомендовано писать »&dyn Trait», вместо »&mut Trait» — »&mut dyn Trait», а вместо «Box‹Trait›» — «Box‹dyn Trait›». Поддержка старого синтаксиса оставлена для обеспечения совместимости, но не рекомендована к использованию;
  • Обеспечена возможность применения атрибута »#[must_use]» к функциям, а не только к типам. Указание данного атрибута приведёт к выводу предупреждения, если выданное функцией значение в дальнейшем не используется в программе. В стандартной библиотеке данный атрибут уже выставлен для функций std: str: replace, Clone: clone, Iterator: collect и ToOwned: to_owned. Например, использование »#[must_use]» помогает выявить такие ошибки, как выполнение функции без присвоения результата;
  • Стабилизированы атрибуты над базовыми параметрами, такими как типы. Например: «fn foo‹#[lifetime_attr] 'a» и »#[type_attr] T: 'a›() {}»;
  • В разряд стабильных переведена новая порция API, в том числе DoubleEndedIterator: rfind/rfold/try_rfold, Duration: from_micros/from_nanos/subsec_micros/subsec_millis, HashMap: remove_entry, Iterator: try_fold/try_for_each, NonNull: cast, Option: filter, String: replace_range, Take: set_limit, process: id и slice: rsplit_mut/rsplit/swap_with_slice;
  • В базовый состав (core) из std перенесены многие методы для работы с типами [u8], f32 и f64;
  • В пакетный менеджер cargo добавлен флаг »--target-dir» для изменения целевого каталога. Также добавлен код для автоматического определения тестов, примеров и исполняемых файлов в проекте без их явного упоминания в настройках. В cargo-metadata включены поля authors, categories, keywords, readme и repository. Обеспечено кэширование информации от компилятора (для отключения можно указать CARGO_CACHE_RUSTC_INFO=0);
  • Добавлена возможность поиска в разделе документации на сайте doc.rust-lang.org;
  • Добавлена поддержка новой целевой платформы «armv5te-unknown-linux-musl».

© OpenNet