Дата публикации:Fri, 31 Oct 2025 10:55:57 +0300
Опубликован релиз языка программирования Rust 1.91, основанного проектом Mozilla, но ныне развиваемого под покровительством независимой некоммерческой организации Rust Foundation. Язык сфокусирован на безопасной работе с памятью и предоставляет средства для достижения высокого параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime (runtime сводится к базовой инициализации и сопровождению стандартной библиотеки).
Методы работы с памятью в Rust избавляют разработчика от ошибок при манипулировании указателями и защищают от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo. Для размещения библиотек поддерживается репозиторий crates.io.
Безопасная работа с памятью обеспечивается в Rust во время компиляции через проверку ссылок, отслеживание владения объектами, учёт времени жизни объектов (области видимости) и оценку корректности доступа к памяти во время выполнения кода. Rust также предоставляет средства для защиты от целочисленных переполнений, требует обязательной инициализации значений переменных перед использованием, лучше обрабатывает ошибки в стандартной библиотеке, применяет концепцию неизменяемости (immutable) ссылок и переменных по умолчанию, предлагает сильную статическую типизацию для минимизации логических ошибок.
Основные новшества:
- Улучшена поддержка 64-разрядных ARM-систем с ОС Windows. Целевая платформа "aarch64-pc-windows-msvc" переведена со второго на первый уровень поддержки. Обеспечен второй уровень поддержки для архитектур aarch64-pc-windows-gnullvm и x86_64-pc-windows-gnullvm. Первый уровень поддержки подразумевает формирование бинарных сборок, проведение досконального тестирования и предоставление наивысшей гарантии поддержки платформы - каждое изменение в компиляторе проверяется выполнением полного тестового набора. Второй уровень поддержки включает формирование бинарных сборок и гарантию сборки, но не гарантирует прохождение тестового набора. Третий уровень охватывает базовую поддержку, но без автоматизированного тестирования, публикации официальных сборок и проверки возможности сборки кода. Добавлено lint-предупреждение "dangling_pointers_from_locals" для выявления возвращения функциями висячих raw-указателей (dangling raw pointer), указывающих на данные, хранящиеся в локальных переменных, определённых в вызванной функции. Подобные переменные удаляются после завершения функции, а raw-указатели на связанные с этими переменными данные, становятся висячими, т.е. указывающими на освобождённую память. Последующее разыменование подобного указателя приводит к неопределённому поведению. fn f() -> *const u8 { let x = 0; &x // warning: a dangling pointer will be produced because the local variable "x" will be dropped } Добавлено lint-предупреждение "integer_to_ptr_transmutes", информирующее о преобразовании целых чисел в указатели с помощью функции std::mem::transmute. В пакетном менеджере Cargo стабилизирована поддержка параметра "build.build-dir", определяющего каталог для хранения временных сборочных артефактов, создаваемых cargo и rustc на этапе сборки. Для ABI sysv64, win64, efiapi и aapcs стабилизирована поддержка объявления функций с переменным числом аргументов в стиле Си. Стабилизирована поддержка inline-ассемблера для архитектуры LoongArch32. В разряд стабильных переведена новая порция API, в том числе стабилизированы методы и реализации типажей:
-  [/url]Path::file_prefix
- [/url]AtomicPtr::fetch_ptr_add
- [/url]AtomicPtr::fetch_ptr_sub
- [/url]AtomicPtr::fetch_byte_add
- [/url]AtomicPtr::fetch_byte_sub
- [/url]AtomicPtr::fetch_or
- [/url]AtomicPtr::fetch_and
- [/url]AtomicPtr::fetch_xor
- [/url]{integer}::strict_add
- [/url]{integer}::strict_sub
- [/url]{integer}::strict_mul
- [/url]{integer}::strict_div
- [/url]{integer}::strict_div_euclid
- [/url]{integer}::strict_rem
- [/url]{integer}::strict_rem_euclid
- [/url]{integer}::strict_neg
- [/url]{integer}::strict_shl
- [/url]{integer}::strict_shr
- [/url]{integer}::strict_pow
- [/url]i{N}::strict_add_unsigned
- [/url]i{N}::strict_sub_unsigned
- [/url]i{N}::strict_abs
- [/url]u{N}::strict_add_signed
- [/url]u{N}::strict_sub_signed
- [/url]PanicHookInfo::payload_as_str
- [/url]core::iter::chain
- [/url]u{N}::checked_signed_diff
- [/url]core::array::repeat
- [/url]PathBuf::add_extension
- [/url]PathBuf::with_added_extension
- [/url]Duration::from_mins
- [/url]Duration::from_hours
- [/url]impl PartialEq<str> for PathBuf
- [/url]impl PartialEq<String> for PathBuf
- [/url]impl PartialEq<str> for Path
- [/url]impl PartialEq<String> for Path
- [/url]impl PartialEq<PathBuf> for String
- [/url]impl PartialEq<Path> for String
- [/url]impl PartialEq<PathBuf> for str
- [/url]impl PartialEq<Path> for str
- [/url]Ipv4Addr::from_octets
- [/url]Ipv6Addr::from_octets
- [/url]Ipv6Addr::from_segments
- [/url]impl<T> Default for Pin<Box<T>> where Box<T>: Default, T: ?Sized
- [/url]impl<T> Default for Pin<Rc<T>> where Rc<T>: Default, T: ?Sized
- [/url]impl<T> Default for Pin<Arc<T>> where Arc<T>: Default, T: ?Sized
- [/url]Cell::as_array_of_cells
- [/url]u{N}::carrying_add
- [/url]u{N}::borrowing_sub
- [/url]u{N}::carrying_mul
- [/url]u{N}::carrying_mul_add
- [/url]BTreeMap::extract_if
- [/url]BTreeSet::extract_if
- [/url]impl Debug for windows::ffi::EncodeWide<'_>
- [/url]str::ceil_char_boundary
- [/url]str::floor_char_boundary
- [/url]impl Sum for Saturating<u{N}>
- [/url]impl Sum<&Self> for Saturating<u{N}>
- [/url]impl Product for Saturating<u{N}>
- [/url]impl Product<&Self> for Saturating<u{N}>
- [/url]<[T; N]>::each_ref
- [/url]<[T; N]>::each_mut
- [/url]OsString::new
- [/url]PathBuf::new
- [/url]TypeId::of
- [/url]ptr::with_exposed_provenance
- [/url]ptr::with_exposed_provenance_mut
Новость позаимствована с opennet.ru
Ссылка на оригинал: https://www.opennet.ru/opennews/art.shtml?num=64149
