Без особого шума опубликован релиз Rust 1.47, языка системного программирования, который разрабатывает Mozilla. Основными достоинствами языка являются безопасная работа с памятью, возможность автоматического управления памятью, высокий параллелизм выполнения заданий без использования «сборщика мусора» и runtime.
Rust автоматически управляет памятью, что избавляет разработчика от ошибок при манипулировании указателями, а также исключает проблемы из-за низкоуровневой работы с памятью. Обычно это обращение к области памяти после ее освобождения, разыменование нулевых указателей, выход за границы буфера и другие подобные моменты.
Распространение библиотек, обеспечение сборки и управление зависимостями осуществляется при помощи пакетного менеджера Cargo, который активно развивается.
Что нового в Rust
Добавлена поддержка типажей для массивов правильного размера. До выхода новой версии стандартная библиотека предоставляла встроенную поддержку типажей лишь для массивов, размер которых не превышал 32 элемента. Причина — невозможность определить generic-функции для всех целых значений. Благодаря функциональности константных дженериков (const generics) теперь можно определять generic-функций для любых размеров массива. Правда, они пока еще не включены в состав стабильных возможностей языка. Зато уже есть в компиляторе и задействованы в стандартной библиотеке для типажей массивов любого размера.
Хороший пример — реализация конструкции вида:
fn main() {
let xs = [0; 34];
println!("{:?}", xs);
}
Раньше, вместо вывода массива, эта конструкция привела бы к ошибке.
Разработчики обеспечили вывод более коротких трассировок (backtrace), которые выводятся при нештатных ситуациях. Из трассировки были исключены элементы, которые не представляют интереса в большинстве ситуаций и отвлекают от реальных проблем. Сейчас для возвращения полной трассировки можно задействовать переменную окружения RUST_BACKTRACE=full.
И если раньше для кода
fn main() {
panic!();
}
Трассировка выводилась в 23 этапа, то сейчас этапов всего три, причем они сразу позволяют уловить суть:
thread 'main' panicked at 'explicit panic', src/main.rs:2:5
stack backtrace:
0: std::panicking::begin_panic
at /rustc/d...d75a/library/std/src/panicking.rs:497
1: playground::main
at ./src/main.rs:2
2: core::ops::function::FnOnce::call_once
at /rustc/d...d75a/library/core/src/ops/function.rs:227
Компилятор rustc обновили до сборки с использованием LLVM 11 (Rust использует LLVM в качестве бэкенда для генерации кода). Разработчики сохранили возможность сборки со старыми LLVM, вплоть до 8-й версии. Но по умолчанию используется LLVM 11, релиз которого появится в ближайшее время.
Для Windows в компиляторе rustc появилась поддержка включения проверок целостности потока выполнения (Control Flow Guard). Активируется проверка флагом -C control-flow-guard.
В разряд стабильных перевели несколько API, включая
- Ident::new_raw,
- Range::is_empty,
- RangeInclusive::is_empty,
- Result::as_deref,
- Result::as_deref_mut,
- Vec::leak,
- pointer::offset_from,
- f32::TAU,
- f64::TAU.
Что касается признака const, который определяет возможность использования в любом контексте вместо констант, то он применен в методах:
- new для всех целых, отличных от нуля;
- checked_add, checked_sub, checked_mul,checked_neg, checked_shl, checked_shr, saturating_add, saturating_sub и saturating_mul для всех целых;
- is_ascii_alphabetic, is_ascii_uppercase, is_ascii_lowercase, is_ascii_alphanumeric, is_ascii_digit, is_ascii_hexdigit, is_ascii_punctuation, is_ascii_graphic, is_ascii_whitespace и is_ascii_control для типов char и u8.
Наконец, для FreeBSD задействован инструментарий из FreeBSD 11.4, поскольку FreeBSD 10 не поддерживает LLVM 11.
Дополнительная информация о новом релизе доступна здесь.