Programmeerimiskeele Rust 1.51 väljaanne

Avaldatud on Mozilla projektil põhineva programmisüsteemi keele Rust 1.51 versioon, mida arendab nüüd sõltumatu mittetulundusühing Rust Foundation. Keel keskendub mäluhalduse ohutusele, tagab automaatse mäluhalduse ja pakub vahendeid ülesannete kõrge paralleelsuse saavutamiseks, kasutamata samas prügikoristajat ja runtime'i (runtime piirdub baine algseadistamise ja standardraamatukogu hooldusega).

Rustis tagab automaatne mälu haldus arendajale kaitse, vabastades ta erinevate näidikute käsitlemise vigadest ja kaitstes mäluga madalat tööd tehes tekkivate probleemide eest, nagu juurdepääs vabastatud mälu alale, nullviidete lahtimuukimine, puutumatuse ületamine jne. Raamatukogude jagamiseks, ehitamise tagamiseks ja sõltuvuste haldamiseks arendatakse pakihaldur Cargo. Raamatukogude majutamiseks toetatakse reposiiti crates.io.

Põhilised uuendused:

  • Konstantsed generikud on saanud minimaalsete elujõuliste toodete (MVP) staatuse, mis avab ukse nende laialdasemale kasutusele. Konstantsed generikud võimaldavad tüüpide üldistamist konstantsite väärtuste jaoks, st kasutada geneerilisi argumente, mis on piiratud konstantsite väärtuste vahemikuga, mitte tüüpide või elutsüklitega. See võimalus võimaldab kasutada terveid arve parametreeritud tüüpe ning abstraheerida, luues tüüpe igasuguste massiivide jaoks, ilma et oleks vaja iga lubatud väärtuste vahemiku jaoks eraldi tüüpi luua, et tagada lubatud vahemikust väljapääsu välistamine.

    Alates käesolevast versioonist on tüüpi "[T; N]" (tüüp T ja suurus N) massiivide jaoks olemas võimalus abstraktsiooniks tüübi ja suuruse suhtes, kasutades mistahes täisarve, booli ja sümbolitüüpe (struktuuri- ja enumeratsioonitüüpe ei toetata). Konstantsete generikate kasutamine oluliselt lihtsustab teekide arendamist, näiteks massiivi, mis ei ole seotud konkreetse tüübi ja suurusega, saab määrata: struct Array { // ^^^^^^^^^^^^^^^^^^^ konstantse generika määratlemine list: [T; LENGTH] // ^^^^^^ selle kasutamine }

    Tegelikul kasutamisel selle määratluse "Array" puhul genereerib kompilaator monomorfse versiooni Array: struct Array { list: [u8; 32] }

  • Konstantsetel generikatel põhinev API std::array::IntoIter on stabiliseeritud, mille abil saab mistahes massiivi jaoks luua iteratoreid väärtuse kaudu: fn main() { let array = [1, 2, 3, 4, 5]; // Varem oli väärtuse iteratsiooniks vajalik kutsuda üles meetod .iter() for item in array.iter().copied() { println!("{}", item); } // Nüüd on võimalik määrata for item in std::array::IntoIter::new(array) { println!("{}", item); } }
  • Paketihaldur cargo toetab uut resolver väljade lahendust failis Cargo.toml, mille abil saab lubada teise versiooni funktsioonide määramist (feature resolver). Uus versioon väldib sõltuvuste funktsioonide ühendamist jaotises „[features]”, kus see ei ole kohane, näiteks sõltuvuse lisamisel, mis nõuab mingit standardset funktsiooni ehitusskriptides ja makrodega, kuid kasutab mittestandardset funktsiooni lõplikus täidetavas failis.

    Pakettide võimalused, mida mainitakse mitmel korral sõltuvuste veerus, on seni olnud kombineeritud. Näiteks, kui projekt ühendab sõltuvuse foo, kus on määratletud võimalused A ja B, ja seda paketti kasutatakse teistes pakettides bar ja baz, kusjuures bar sõltub foo-st võimaluse A poolest, aga baz sõltub foo-st võimaluse B poolest, siis lõpuks ühendab cargo need võimalused ning kompilatsioon toimub foo koos kõikide A ja B võimalustega. Selline meetod võib viia selleni, et mõni võimalus, mis on aktiveeritud mingi sõltuvuse tõttu, võib osutuda ühilduvaks sihtsüsteemiga, mille jaoks lõplik kompilatsioon toimub. Näiteks, kui on vajalik kasutada foo versiooni koos "#![no_std]" täitmisfailis, mis on kompileeritud koos "#![no_std]" ja samal ajal kasutada foo-t koos "std" build.rs kompilatsiooni ajal. Kui Cargo.toml-s märgitakse resolver="2", proovib paketihaldur nüüd tõhusalt lahendada seda konflikti, eraldades dev-, host- ja target-sõltuvused.

  • Cargo's split-debuginfo option is implemented and set in the [profile] section along with the corresponding flag -Csplit-debuginfo=unpacked in rustc. This introduces a new method for saving debug information that eliminates the need to call the dsymutil utility and significantly speeds up the build process with debug information on macOS.
  • The macOS features ptr::addr_of! and ptr::addr_of_mut! are stabilized, allowing the creation of raw pointers for unaligned fields. use std::ptr; #[repr(packed)] struct Packed { f1: u8, f2: u16, } let packed = Packed { f1: 1, f2: 2 }; // &packed.f2 will create an unaligned pointer, leading to undefined behavior let raw_f2 = ptr::addr_of!(packed.f2); assert_eq!(unsafe { raw_f2.read_unaligned() }, 2);
  • A new batch of APIs has been promoted to stable, including the stabilization of the following methods:
    • Arc::decrement_strong_count
    • Arc::increment_strong_count
    • Once::call_once_force
    • Peekable::next_if_eq
    • Peekable::next_if
    • Seek::stream_position
    • array::IntoIter
    • panic::panic_any
    • ptr::addr_of!
    • ptr::addr_of_mut!
    • slice::fill_with
    • slice::split_inclusive_mut
    • slice::split_inclusive
    • slice::strip_prefix
    • slice::strip_suffix
    • str::split_inclusive
    • sync::OnceState
    • task::Wake
  • Toetatud on kolmas tase platvormide i386-unknown-linux-gnu, i486-unknown-linux-gnu, aarch64_be-unknown-linux-gnu, aarch64-unknown-linux-gnu_ilp32 ja aarch64_be-unknown-linux-gnu_ilp32 jaoks. Kolmas tase tähendab põhitoetust, kuid ilma automatiseeritud testimise, ametlike versioonide avaldamise ja koodi kompileerimise võimaluste kontrollita.

Allikas: opennet.ru

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster