Апублікаваны рэліз мовы праграмавання агульнага прызначэння Rust 1.60, заснаванага праектам Mozilla, але цяпер які развіваецца пад заступніцтвам незалежнай некамерцыйнай арганізацыі Rust Foundation. Мова сфакусаваная на бяспечнай працы з памяццю і дае сродкі для дасягнення высокага паралелізму выканання заданняў, пры гэтым абыходзячыся без выкарыстання зборшчыка смецця і runtime (runtime зводзіцца да базавай ініцыялізацыі і суправаджэння стандартнай бібліятэкі).
Метады працы з памяццю ў Rust пазбаўляюць распрацоўніка ад памылак пры маніпуляванні паказальнікамі і абараняюць ад праблем, якія ўзнікаюць з-за нізкаўзроўневай працы з памяццю, такіх як зварот да вобласці памяці пасля яе вызвалення, разнайменаванне нулявых паказальнікаў, вынахад за межы буфера і да т.п. Для распаўсюджвання бібліятэк, забеспячэнні зборкі і кіраванні залежнасцямі праектам развіваецца пакетны мэнэджар Cargo. Для размяшчэння бібліятэк падтрымліваецца рэпазітар crates.io.
Бяспечная праца з памяццю забяспечваецца ў Rust падчас кампіляцыі праз праверку спасылак, адсочванне валодання аб'ектамі, улік часу жыцця аб'ектаў (вобласці бачнасці) і адзнаку карэктнасці доступу да памяці падчас выканання кода. Rust таксама дае сродкі для абароны ад цэлалікіх перапаўненняў, патрабуе абавязковай ініцыялізацыі значэнняў зменных перад выкарыстаннем, лепш апрацоўвае памылкі ў стандартнай бібліятэцы, ужывае канцэпцыю нязменнасці (immutable) спасылак і зменных па змаўчанні, прапануе моцную статычную тыпізацыю для мінімізацыі лагічных памылак.
Асноўныя навіны:
- У кампілятары rustc стабілізаваная заснаваная на LLVM сістэма для генерацыі coverage-дадзеных, выкарыстоўваных для адзнакі ахопу кода пры тэставанні. Для ўключэння coverage-дадзеных пры зборцы неабходна выкарыстоўваць сцяг "-Cinstrument-coverage", напрыклад, запускаючы зборку камандай "RUSTFLAGS="-C instrument-coverage" cargo build". Пасля запуску сабранага такім чынам выкананага файла ў бягучым каталогу будзе захаваны файл default.profraw, для апрацоўкі якога можна выкарыстоўваць утыліту llvm-profdata з кампанента llvm-tools-preview. Апрацаваны ўтылітай llvm-profdata выснову затым можна перадаць праграме llvm-cov для генерацыі анатаванай справаздачы са звесткамі аб ахопе кода. Інфармацыя аб прывязцы да зыходных тэкстаў бярэцца з доследнага выкананага файла, у які ўключаюцца неабходныя дадзеныя аб сувязі coverage-лічыльнікаў з кодам. 1| 1|fn main() { 2| 1| println!(«Hello, world!»); 3| 1|}
- У пакетным менеджэры cargo стабілізавана падтрымка сцяга «timings», які ўключае фармаванне дэталёвай справаздачы аб ходзе зборкі і часе выканання кожнага кроку. Справаздача можа быць карыснай для аптымізацыі прадукцыйнасці зборачнага працэсу.
- У пакетным мэнэджары cargo прапанаваны новы сінтаксіс для механізму ўмоўнай кампіляцыі і выбару неабавязковых залежнасцяў, які наладжваецца ў файле Cargo.toml праз пералік спісу найменных уласцівасцяў у секцыі [features] і які актывуецца праз уключэнне ўласцівасцяў падчас зборкі пакета пры дапамозе сцяга «—features». У новай версіі дададзена падтрымка залежнасцяў у асобных прасторах імёнаў і слабых (weak) залежнасцяў.
У першым выпадку рэалізавана магчымасць выкарыстання ўсярэдзіне секцый "[features]" элементаў з прэфіксам "dep:" для відавочнай прывязкі да неабавязковай залежнасці без няяўнага падання гэтай залежнасці як уласцівасці (feature). У другім выпадку дададзеная падтрымка пазнакі знакам "?" («package-name?/feature-name») неабавязковых залежнасцяў, якія варта ўключыць толькі, калі нейкая іншая ўласцівасць уключае дадзеную неабавязковую залежнасць. Напрыклад, у прыкладзе ніжэй уключэнне ўласцівасці serde прывядзе да ўключэння залежнасці "serde", а таксама ўласцівасці "serde" для залежнасці "rgb", але толькі калі дзесьці яшчэ ўключаная залежнасць "rgb": [dependencies] serde = { version = « 1.0.133", optional = true} rgb = {version = "0.8.25", optional = true} [features] serde = ["dep:serde", "rgb?/serde"]
- Вернута адключаная ў мінулым выпуску падтрымка інкрыментальнай кампіляцыі. Памылка ў кампілятары, з-за якой функцыя была адключаная, ухіленая.
- Вырашаны некаторыя праблемы з прадастаўленнем для таймераў Instant гарантыі манатоннага разліку часу, пры якім улічваецца час праведзенае сістэмай у спячым рэжыме. Раней для працы таймера па магчымасці выкарыстоўваўся OS API, які не ўлічваў праблемныя сітуацыі, якія парушаюць манатоннасць часу, такія як праблемы з абсталяваннем, ужыванне віртуалізацыі ці памылкі ў аперацыйнай сістэме.
- У разрад стабільных пераведзена новая порцыя API, у тым ліку стабілізаваны метады і рэалізацыі тыпажоў:
- Arc::new_cyclic
- Rc::new_cyclic
- slice::EscapeAscii
- <[u8]>::escape_ascii
- u8::escape_ascii
- Vec::spare_capacity_mut
- MaybeUninit::assume_init_drop
- MaybeUninit::assume_init_read
- i8::abs_diff
- i16::abs_diff
- i32::abs_diff
- i64::abs_diff
- i128::abs_diff
- isize::abs_diff
- u8::abs_diff
- u16::abs_diff
- u32::abs_diff
- u64::abs_diff
- u128::abs_diff
- usize::abs_diff
- Display для io::ErrorKind
- From для ExitCode
- Not для! (тып "never")
- _Op_Assign<$t>
- arch::is_aarch64_feature_detected!
- Рэалізаваны трэці ўзровень падтрымкі для платформаў mips64-openwrt-linux-musl* і armv7-unknown-linux-uclibceabi (softfloat). Трэці ўзровень мае на ўвазе базавую падтрымку, але без аўтаматызаванага тэсціравання, публікацыі афіцыйных зборак і праверкі магчымасці зборкі кода.
- Кампілятар пераведзены на выкарыстанне LLVM 14.
Дадаткова можна адзначыць:
- Дададзена падтрымка раскруткі кампілятара (bootstrapping) rustc пры дапамозе бэкенда rustc_codegen_gcc, які дазваляе выкарыстоўваць бібліятэку libgccjit ад праекта GCC у якасці генератара кода ў rustc, што дазваляе забяспечыць у rustc падтрымку даступных у GCC архітэктур і аптымізацый. Пад раскруткай кампілятара разумеецца магчымасць выкарыстання ў rustc генератара кода на аснове GCC для зборкі самага кампілятара rustc. З практычнага боку падобная магчымасць дазваляе збіраць rust-праграмы для архітэктур, якія раней не падтрымліваюцца ў rustc.
- Даступны выпуск інструментара uutils coreutils 0.0.13, у рамках якога развіваецца аналаг пакета GNU Coreutils, перапісаны на мове Rust. У склад coreutils уваходзіць больш за сто ўтыліт, уключаючы sort, cat, chmod, chown, chroot, cp, date, dd, echo, hostname, id, ln і ls. Мэтай праекту з'яўляецца стварэнне крос-платформавай альтэрнатыўнай рэалізацыі Coreutils, здольнай працаваць у тым ліку на платформах Windows, Redox і Fuchsia, а таксама распаўсюджванне пад пермісіўнай ліцэнзіяй MIT, замест капілефт-ліцэнзіі GPL.
У новай версіі палепшаны рэалізацыі многіх утыліт, у тым ліку значна палепшана сумяшчальнасць утыліт cp, dd, df, split і tr з аналагамі ад праекта GNU. Прадастаўлена online-дакументацыя. Для разбору аргументаў каманднага радка задзейнічаны парсер clap, што дазволіла палепшыць выснову для сцяга "-help" і дадаць падтрымку абрэвіятур доўгіх каманд (напрыклад, можна паказваць "ls -col" замест "ls -color").
Крыніца: opennet.ru