Апублікаваны рэліз мовы сістэмнага праграмавання Rust 1.57, заснаванага праектам Mozilla, але цяпер які развіваецца пад заступніцтвам незалежнай некамерцыйнай арганізацыі Rust Foundation. Мова сфакусаваная на бяспечнай працы з памяццю, забяспечвае аўтаматычнае кіраванне памяццю і дае сродкі для дасягнення высокага паралелізму выканання заданняў, пры гэтым абыходзячыся без выкарыстання зборшчыка смецця і runtime (runtime зводзіцца да базавай ініцыялізацыі і суправаджэнню стандартнай бібліятэкі).
Аўтаматычнае кіраванне памяццю ў Rust пазбаўляе распрацоўніка ад памылак пры маніпуляванні паказальнікамі і абараняе ад праблем, якія ўзнікаюць з-за нізкаўзроўневай працы з памяццю, такіх як зварот да вобласці памяці пасля яе вызвалення, разнайменаванне нулявых паказальнікаў, вынахад за межы буфера і да т.п. Для распаўсюджвання бібліятэк, забеспячэнні зборкі і кіраванні залежнасцямі праектам развіваецца пакетны мэнэджар Cargo. Для размяшчэння бібліятэк падтрымліваецца рэпазітар crates.io.
Асноўныя навіны:
- Стабілізавана выкарыстанне макраса "panic!" у кантэкстах, якiя ствараюцца пры кампіляцыі, такіх як аб'явы «const fn». Акрамя таго, акрамя выкарыстання "panic!" у const-аб'явах дазволена выкарыстанне макраса «assert!» і некаторых іншых API стандартнай бібліятэкі. Стабілізацыя пакуль не ахоплівае ўсю інфраструктуру фарматавання, таму ў бягучым выглядзе макрас "panic!" можа выкарыстоўвацца толькі са статычнымі радкамі (panic!(«…»)) або з адным інтэрпаліраваным значэннем «&str» пры падстаноўцы (panic!(«{}», a)), якое павінна абмяжоўвацца падстаноўкай «{}» без спецыфікатараў фарматавання і іншых тыпажоў. У будучыні дастасавальнасць макрасаў у канстантных кантэкстах будзе пашырана, але стабілізаваных магчымасцяў ужо дастаткова для выканання assert-праверак на этапе кампіляцыі: const _: () = assert!(std::mem::size_of:: () == 64); const _: () = assert!(std::mem::size_of:: () == 8);
- У пакетным мэнэджары Cargo дазволена выкарыстанне профіляў з адвольнымі імёнамі, не абмежаванымі "dev", "release", "test" і "bench". Напрыклад, для ўключэння аптымізацыі на этапе звязвання (LTO) толькі пры фармаванні фінальных зборак прадукта можна ў Cargo.toml стварыць профіль "production" і дадаць у яго сцяг "lto = true". Пры гэтым пры азначэнні ўласных профіляў абавязкова патрабуецца паказаць існуючы профіль для ўспадкоўвання з яго налад па змаўчанні. У прыкладзе ніжэй ствараецца профіль "production", які дапаўняе профіль "release" уключэннем сцяга "lto = true". Сам профіль актывуецца пры выкліку cargo з опцыяй «profile production», а зборачныя артэфакты будуць размешчаны ў каталогу «target/production». [profile.production] inherits = "release" lto = true
- Стабілізавана выкарыстанне try_reserve для тыпаў Vec, String, HashMap, HashSet і VecDeque, што дазваляе загадзя рэзерваваць месца для вызначанага ліку элементаў зададзенага тыпу для таго, каб зменшыць частату выканання аперацый вылучэння памяці і пазбегнуць аварыйнага завяршэння падчас прац з-за недахопу памяці.
- Дазволена ўказанне макрасаў з фігурнымі дужкамі ў выразах падобных «m!{..}.method()» і «m!{..}?».
- Аптымізавана выкананне функцый File::read_to_end і read_to_string.
- Падтрымка спецыфікацыі Unicode абноўлена да версіі 14.0.
- Пашырана колькасць функцый, пазначаных «#[must_use]» для вываду папярэджання ў выпадку ігнаравання якое вяртаецца значэння, што дапамагае выявіць памылкі, выкліканыя здагадкай, што функцыя зменіць значэнні, а не верне новае значэнне.
- Дададзены эксперыментальны бэкенд для генерацыі кода з выкарыстаннем libgccjit.
- У разрад стабільных пераведзена новая порцыя API, у тым ліку стабілізаваны метады і рэалізацыі тыпажоў:
- [T; N]::as_mut_slice
- [T; N]::as_slice
- collections::TryReserveError
- HashMap::try_reserve
- HashSet::try_reserve
- String::try_reserve
- String::try_reserve_exact
- Vec::try_reserve
- Vec::try_reserve_exact
- VecDeque::try_reserve
- VecDeque::try_reserve_exact
- Iterator::map_while
- iter::MapWhile
- proc_macro::is_available
- Command::get_program
- Command::get_args
- Command::get_envs
- Command::get_current_dir
- CommandArgs
- CommandEnvs
- Прыкмета "const", вызначальны магчымасць выкарыстання ў любым кантэксце замест канстант, ужыты ў функцыі hint::unreachable_unchecked.
- Рэалізаваны трэці ўзровень падтрымкі для платформаў armv6k-nintendo-3ds, armv7-unknown-linux-uclibceabihf, m68k-unknown-linux-gnu, aarch64-kmc-solid_asp3, armv7a-kmc-solid_asp3-abi Трэці ўзровень мае на ўвазе базавую падтрымку, але без аўтаматызаванага тэсціравання, публікацыі афіцыйных зборак і праверкі магчымасці зборкі кода.
Крыніца: opennet.ru