Релиз языка программирования Rust 1.27
Как сообщает opennet.ru Состоялся релиз языка системного программирования 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&8249;Trait&8250;" - "Box&8249;dyn Trait&8250;". Поддержка старого синтаксиса оставлена для обеспечения совместимости но не рекомендована к использованию;
- Обеспечена возможность применения атрибута "[must_use]" к функциям, а не только к типам. Указание данного атрибута приведет к выводу предупреждения, если выданное функцией значение в дальнейшем не используется в программе. В стандартной библиотеке данный атрибут уже выставлен для функций std::str::replace, Clone::clone, Iterator::collect и ToOwned::to_owned. Например, использование "[must_use]" помогает выявить такие ошибки, как выполнение функции без присвоения результата;
- Стабилизированы атрибуты над базовыми параметрами, такими как типы. Например: "fn foo&8249;[lifetime_attr] 'a" и "[type_attr] T: 'a&8250; {}";
- В разряд стабильных переведена новая порция 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".