Без особого шума опубликован релиз 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.

Дополнительная информация о новом релизе доступна здесь.