Выпуск мовы праграмавання Rust 1.57

Апублікаваны рэліз мовы сістэмнага праграмавання 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

Дадаць каментар