Опубликован релиз языка программирования общего назначения Rust 1.63, основанного проектом Mozilla, но ныне развиваемого под покровительством независимой некоммерческой организации Rust Foundation. Язык сфокусирован на безопасной работе с памятью и предоставляет средства для достижения высокого параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime (runtime сводится к базовой инициализации и сопровождению стандартной библиотеки).
Методы работы с памятью в Rust избавляют разработчика от ошибок при манипулировании указателями и защищают от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo. Для размещения библиотек поддерживается репозиторий crates.io.
Безопасная работа с памятью обеспечивается в Rust во время компиляции через проверку ссылок, отслеживание владения объектами, учёт времени жизни объектов (области видимости) и оценку корректности доступа к памяти во время выполнения кода. Rust также предоставляет средства для защиты от целочисленных переполнений, требует обязательной инициализации значений переменных перед использованием, лучше обрабатывает ошибки в стандартной библиотеке, применяет концепцию неизменяемости (immutable) ссылок и переменных по умолчанию, предлагает сильную статическую типизацию для минимизации логических ошибок.
Основные новшества:
- Добавлен API std::thread::scope, позволяющий создавать потоки в привязке к области видимости (Scoped threads). В отличие от ранее доступных потоков новый API std::thread::scope допускает передачу заимствованных (borrowing) нестатических данных, в то время как потоки, создаваемые при помощи классического API std::thread::spawn, должны были владеть всеми передаваемыми аргументами и не могли получать заимствованные переменные. API std::thread::scope гарантирует, что любые порождённые потоки будут завершены до возвращения данных, обеспечивая должный уровень безопасности для механизма заимствования.
- Предложены новые типы-обвязки для файловых дескрипторов – BorrowedFd и OwnedFd, обеспечивающие заимствование и владение. Типы помечены при помощи “#[repr(transparent)]”, что позволяет напрямую использовать их во внешних Си-привязках с учётом владения.
- Предоставлена возможность вызова Condvar::new, Mutex::new и RwLock::new в контексте констант для создания глобальных статических значений Mutex, RwLock и Condvar без применения пакетов типа lazy_static.
- Для функций типа fn foo(value: T, f: impl Copy) разрешено использование синтаксиса вида “foo::(3, 3)”, явно указывая тип дженерика.
- Завершён переход на использование техники NLL (Non-Lexical Lifetimes) для выявления проблем с заимствованием переменных. NLL осуществляет учёт на уровне набора указателей в графе потока выполнения, что позволяет увеличить качество проверки заимствования переменных (borrow checker) и допустить выполнение некоторых видов корректного кода, использование которого ранее приводило к выводу ошибки. Поддержка старого механизма, использовавшего привязку времени жизни на лексическом уровне, теперь полностью удалена из rustc, а использование нового NLL внедрено повсеместно.
- В разряд стабильных переведена новая порция API, в том числе стабилизированы методы и реализации типажей:
- array::from_fn
- Box::into_pin
- BinaryHeap::try_reserve
- BinaryHeap::try_reserve_exact
- OsString::try_reserve
- OsString::try_reserve_exact
- PathBuf::try_reserve
- PathBuf::try_reserve_exact
- Path::try_exists
- Ref::filter_map
- RefMut::filter_map
- NonNull::::len
- ToOwned::clone_into
- Ipv6Addr::to_ipv4_mapped
- unix::io::AsFd
- unix::io::BorrowedFd
- unix::io::OwnedFd
- windows::io::AsHandle
- windows::io::BorrowedHandle
- windows::io::OwnedHandle
- windows::io::HandleOrInvalid
- windows::io::HandleOrNull
- windows::io::InvalidHandleError
- windows::io::NullHandleError
- windows::io::AsSocket
- windows::io::BorrowedSocket
- windows::io::OwnedSocket
- thread::scope
- thread::Scope
- thread::ScopedJoinHandle
- Признак “const”, определяющий возможность использования в любом контексте вместо констант, применён в функциях:
- array::from_ref
- slice::from_ref
- intrinsics::copy
- intrinsics::copy_nonoverlapping
- ::copy_to
- ::copy_to_nonoverlapping
- ::copy_to
- ::copy_to_nonoverlapping
- ::copy_from
- ::copy_from_nonoverlapping
- str::from_utf8
- Utf8Error::error_len
- Utf8Error::valid_up_to
- Condvar::new
- Mutex::new
- RwLock::new