Апублікаваны рэліз мовы праграмавання агульнага прызначэння Rust 1.77, заснаванага праектам Mozilla, але цяпер які развіваецца пад заступніцтвам незалежнай некамерцыйнай арганізацыі Rust Foundation. Мова сфакусаваная на бяспечнай працы з памяццю і дае сродкі для дасягнення высокага паралелізму выканання заданняў, пры гэтым абыходзячыся без выкарыстання зборшчыка смецця і runtime (runtime зводзіцца да базавай ініцыялізацыі і суправаджэння стандартнай бібліятэкі).
Метады працы з памяццю ў Rust пазбаўляюць распрацоўніка ад памылак пры маніпуляванні паказальнікамі і абараняюць ад праблем, якія ўзнікаюць з-за нізкаўзроўневай працы з памяццю, такіх як зварот да вобласці памяці пасля яе вызвалення, разнайменаванне нулявых паказальнікаў, вынахад за межы буфера і да т.п. Для распаўсюджвання бібліятэк, забеспячэнні зборкі і кіраванні залежнасцямі праектам развіваецца пакетны мэнэджар Cargo. Для размяшчэння бібліятэк падтрымліваецца рэпазітар crates.io.
Бяспечная праца з памяццю забяспечваецца ў Rust падчас кампіляцыі праз праверку спасылак, адсочванне валодання аб'ектамі, улік часу жыцця аб'ектаў (вобласці бачнасці) і адзнаку карэктнасці доступу да памяці падчас выканання кода. Rust таксама дае сродкі для абароны ад цэлалікіх перапаўненняў, патрабуе абавязковай ініцыялізацыі значэнняў зменных перад выкарыстаннем, лепш апрацоўвае памылкі ў стандартнай бібліятэцы, ужывае канцэпцыю нязменнасці (immutable) спасылак і зменных па змаўчанні, прапануе моцную статычную тыпізацыю для мінімізацыі лагічных памылак.
Асноўныя навіны:
- Добавлена поддержка литералов для Си-строк (c»текст»), которые хранятся в памяти с завершающим нулевым символом и ассоциированы с типом «CStr». Предполагается, что поддержка Си-строк упростит написание кода, взаимодействующего с прослойками на языках программирования, в которых применяются завершаемые нулевым байтом строки, и позволит выполнять необходимые проверки на стадии компиляции. const HELLO: &core::ffi::CStr = c»Hello, world!»;
- В асинхронно выполняемых функциях, объявленных при помощи выражения «async fn», разрешено использование рекурсии, т.е. подобные функции теперь могут вызывать сами себя. async fn fib(n: u32) -> u32 { match n { 0 | 1 => 1, _ => Box::pin(fib(n-1)).await + Box::pin(fib(n-2)).await } }
- Стабилизирован макрос offset_of!, позволяющий определить байтовое смещение полей структур, перечислений, объединений и кортежей, относительно начала типа. На практике макрос может быть полезен в ситуациях, когда требуется работа на уровне смещения полей при отсутствии экземпляра типа. В частности, функциональность offset_of необходима при разработке низкоуровневых компонентов, таких как драйверы. use std::mem; #[repr(C)] struct FieldStruct { first: u8, second: u16, third: u8 } assert_eq!(mem::offset_of!(FieldStruct, first), 0); assert_eq!(mem::offset_of!(FieldStruct, second), 2); assert_eq!(mem::offset_of!(FieldStruct, third), 4);
- В пакетном менеджере Cargo в профилях релизов по умолчанию включена очистка файлов от отладочных данных (strip = «debuginfo»), если в профиле Cargo явно не включён режим отладки, т.е. если параметр debug = 0.
- Включена по умолчанию опция «-Zthir-unsafeck=on», обеспечивающая проверку unsafe для промежуточного представления THIR («Typed High-Level Intermediate Representation»).
- Добавлена lint-проверка static_mut_refs для вывода предупреждения при использовании ссылок на изменяемые статические значения.
- Реализована возможность применения типажа «From<&[T; N]>» для типа «Cow<[T]>». fn foo(data: impl Into<Cow<‘static, [&’static str]>>) { /* … */ } fn main() { foo(&[«hello», «world»]); }
- В компиляторе обеспечено выравнивание 16-байтовых типов i128 и u128 для систем x86.
- У разрад стабільных пераведзена новая порцыя API, у тым ліку стабілізаваны метады і рэалізацыі тыпажоў:
- array::each_ref
- array::each_mut
- core::net
- f32::round_ties_even
- f64::round_ties_even
- mem::offset_of!
- slice::first_chunk
- slice::first_chunk_mut
- slice::split_first_chunk
- slice::split_first_chunk_mut
- slice::last_chunk
- slice::last_chunk_mut
- slice::split_last_chunk
- slice::split_last_chunk_mut
- slice::chunk_by
- slice::chunk_by_mut
- Bound::map
- File::create_new
- Mutex::clear_poison
- RwLock::clear_poison
- Реализован третий уровень поддержки для платформ aarch64-unknown-illumos, hexagon-unknown-none-elf, riscv32imafc-esp-espidf и riscv32im-risc0-zkvm-elf. Третий уровень подразумевает базовую поддержку, но без автоматизированного тестирования, публикации официальных сборок и проверки возможности сборки кода.
Крыніца: opennet.ru