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

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

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