Рэліз мовы праграмавання Rust 2021 (1.56)

Апублікаваны рэліз мовы сістэмнага праграмавання Rust 1.56, заснаванага праектам Mozilla, але цяпер які развіваецца пад заступніцтвам незалежнай некамерцыйнай арганізацыі Rust Foundation. Акрамя штатнага нумара версіі выпуск таксама пазначаны як Rust 2021 і азначае сабой стабілізацыю змен, прапанаваных за апошнія тры гады. Rust 2021 таксама выступіць асновай для нарошчвання функцыянальнасці ў наступныя тры гады, па аналогіі з тым, як выпуск Rust 2018 стаў базісам для развіцця мовы ў мінулыя тры гады.

Для захавання сумяшчальнасці распрацоўшчыкі могуць выкарыстоўваць у сваіх праграмах пазнакі "2015", "2018" і "2021", якія дазваляюць прывязаць праграмы да зрэзаў стану мовы, якія адпавядаюць абраным рэдакцыям Rust. Рэдакцыі былі ўведзеныя для падзелу несумяшчальных змен і наладжваюцца ў метададзеных cargo-пакетаў праз поле "edition" у секцыі "[package]". Напрыклад, рэдакцыя «2018» уключае стабілізаваную на канец 2018 года функцыянальнасць і таксама ахоплівае ўсе далейшыя змены, якія не парушаюць сумяшчальнасць. Рэдакцыя «2021» дадаткова ўключае парушаючыя сумяшчальнасць новаўвядзенні, прапанаваныя ў бягучым выпуску 1.56 і зацверджаныя для рэалізацыі ў будучыні. Апроч самой мовы рэдакцыі таксама ўлічваюць стан інструментара і дакументацыі.

Асноўныя несумяшчальнасці, зафіксаваныя ў Rust 2021:

  • Паасобны захоп у замыканнях - замыканні зараз могуць захопліваць асобныя імёны палёў замест усяго ідэнтыфікатара. Напрыклад, «|| ax + 1» захопіць толькі "ax" замест "a".
  • Тыпаж IntoIterator для масіваў: array.into_iter() дазваляе арганізаваць перабор элементаў масіва па значэннях, а не па спасылках.
  • У macro_rules зменена апрацоўка выразаў "|" (лагічная аперацыя OR) у шаблонах - спецыфікатар «: pat» у супастаўленнях зараз улічвае шаблоны «A | B».
  • У пакетным мэнэджары cargo уключаная па змаўчанні другая версія вызначальніка даступных магчымасцяў (feature resolver), падтрымка якой з'явілася ў Rust 1.51.
  • Тыпажы (trait) TryFrom, TryInto і FromIterator дададзены ў склад модуля стандартнай бібліятэкі prelude.
  • Макрасы panic!(..) і assert!(expr, ..) зараз заўсёды выкарыстоўваюць format_args!(..) для фарматавання радкоў па аналогіі з println!().
  • У сінтаксісе мовы зарэзерваваны выразы ident#, ident»…» і ident'…'.
  • Папярэджанні bare_trait_objects і ellipsis_inclusive_range_patterns пераведзены ў катэгорыю памылак.

Новаўвядзенні Rust 1.56:

  • У Cargo.toml у секцыі "[package]" дададзена поле rust-version, праз якое можна вызначыць мінімальна падтрымоўваную версію Rust для crate-пакета. Калі бягучая версія не адпавядае паказанаму параметру Cargo спыніць працу з высновай памылкі.
  • Пры супастаўленні з узорам пры дапамозе выразаў "binding @ pattern" рэалізавана падтрымка ўказання дадатковых прывязак (напрыклад, "let matrix @ Matrix {row_len,..} = get_matrix();").
  • У разрад стабільных пераведзена новая порцыя API, у тым ліку стабілізаваны метады і рэалізацыі тыпажоў:
    • std::os::unix::fs::chroot
    • UnsafeCell::raw_get
    • BufWriter::into_parts
    • core::panic::{UnwindSafe, RefUnwindSafe, AssertUnwindSafe}
    • Vec::shrink_to
    • String::shrink_to
    • OsString::shrink_to
    • PathBuf::shrink_to
    • BinaryHeap::shrink_to
    • VecDeque::shrink_to
    • HashMap::shrink_to
    • HashSet::shrink_to
  • Прыкмета "const", які вызначае магчымасць выкарыстання ў любым кантэксце замест канстант, ужыты ў функцыях
    • std::mem::transmute
    • [T]::first
    • [T]::split_first
    • [T]::last
    • [T]::split_last
  • Кампілятар перакладзены на выкарыстанне версіі LLVM 13.
  • Рэалізаваны другі ўзровень падтрымкі для платформы aarch64-apple-ios-sim і трэці ўзровень для платформаў powerpc-unknown-freebsd і riscv32imc-esp-espidf. Трэці ўзровень мае на ўвазе базавую падтрымку, але без аўтаматызаванага тэсціравання, публікацыі афіцыйных зборак і праверкі магчымасці зборкі кода.

Нагадаем, што мова Rust сфакусаваная на бяспечнай працы з памяццю, забяспечвае аўтаматычнае кіраванне памяццю і дае сродкі для дасягнення высокага паралелізму выканання заданняў, пры гэтым абыходзячыся без выкарыстання зборшчыка смецця і runtime (runtime зводзіцца да базавай ініцыялізацыі і суправаджэнню стандартнай бібліятэкі).

Аўтаматычнае кіраванне памяццю ў Rust пазбаўляе распрацоўніка ад памылак пры маніпуляванні паказальнікамі і абараняе ад праблем, якія ўзнікаюць з-за нізкаўзроўневай працы з памяццю, такіх як зварот да вобласці памяці пасля яе вызвалення, разнайменаванне нулявых паказальнікаў, вынахад за межы буфера і да т.п. Для распаўсюджвання бібліятэк, забеспячэнні зборкі і кіраванні залежнасцямі праектам развіваецца пакетны мэнэджар Cargo. Для размяшчэння бібліятэк падтрымліваецца рэпазітар crates.io.

Крыніца: opennet.ru

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