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

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

В тексте анонса нового выпуска разработчики Rust ввязались в политику и демонстративно отказались публиковать полноценный обзор изменений в Rust 1.44 в знак солидарности с протестующими против полицейского насилия, указав, что этот вопрос важнее обмена техническими знаниями. Основные новшества:

  • В пакетный менеджер Cargo интегрирована команда «cargo tree», выводящая древовидный граф зависимостей. Также добавлена опция «—duplicates» («cargo tree -d»), позволяющая оценить зависимости в разных версиях одного пакета.

    mdbook v0.3.2 (/Users/src/rust/mdbook)
    ├── ammonia v3.0.0
    │ ├── html5ever v0.24.0
    │ │ ├── log v0.4.8
    │ │ │ └── cfg-if v0.1.9
    │ │ ├── mac v0.1.1
    │ │ └── markup5ever v0.9.0
    │ │ ├── log v0.4.8 (*)
    │ │ ├── phf v0.7.24
    │ │ │ └── phf_shared v0.7.24
    │ │ │ ├── siphasher v0.2.3
    │ │ │ └── unicase v1.4.2
    │ │ │ [build-dependencies]
    │ │ │ └── version_check v0.1.5

  • Для приложений, не привязанных к std («#![no_std]»), реализована поддержка методов асинхронного программирования, основанных на функции «async», блоке async move { … } и операторе «.await», которые упрощают написание обработчиков, не блокирующих основной поток команд.
  • В парсер добавлена поддержка расширяемой схемы определения иерархии модулей. Например, следующая конструкция не приведёт к выводу ошибки, несмотря на фактическое отсутствие модуля «foo/bar/baz.rs» (семантически конструкция по-прежнему недопустима и может вызвать ошибку, но изменения можно увидеть и разобрать на уровне макросов и условной компиляции):

    #[cfg(FALSE)]
    mod foo {
    mod bar {
    mod baz;
    }
    }

  • В компиляторе rustc добавлена возможность использования флага «-C codegen-units» в инкрементальном режиме. Переработана реализация catch_unwind, которая теперь не оказывает влияния на производительность, если отключён процесс «размотки» (unwinding) и не возникает исключений.
  • Обеспечен третий уровень поддержи для платформ aarch64-unknown-none, aarch64-unknown-none-softfloat, arm64-apple-tvos и x86_64-apple-tvos. Третий уровень подразумевает базовую поддержку, но без автоматизированного тестирования и публикации официальных сборок.
  • В разряд стабильных переведена новая порция API, в том числе стабилизированы
    PathBuf::with_capacity,
    PathBuf::capacity,
    PathBuf::clear,
    PathBuf::reserve,
    PathBuf::reserve_exact,
    PathBuf::shrink_to_fit,
    {f32|f64}::to_int_unchecked,
    Layout::align_to,
    Layout::pad_to_align,
    Layout::array и
    Layout::extend.

  • Расширены функции стандартной библиотеки:
    • Добавлен специальный вариант «vec![]», напрямую отражаемый в Vec::new(), что позволяет использовать «vec![]» в контексте вместо констант.
    • В convert::Infallible добавлена реализация (impl) типажа Hash.
    • В OsString реализованы умные указатели DerefMut и IndexMut, возвращающие «&mut OsStr».
    • Добавлена поддержка Unicode 13.
    • В String реализован From<&mut str>.
    • В IoSlice реализован типаж Copy.
    • В Vec<T> реализован From<[T; N]>.
    • В proc_macro::LexError реализованы fmt::Display и Error.
  • Признак «const», определяющий возможность использования в любом контексте вместо констант, применён в методах from_le_bytes, to_le_bytes, from_be_bytes, to_be_bytes, from_ne_bytes и to_ne_bytes для всех целочисленных типов.
  • Добавлена поддержка генерации статических библиотек в формате «.a» вместо «.lib» для GNU-платформ для Windows.
  • Минимальные требования к LLVM подняты до версии LLVM 8.