Üldotstarbelise programmeerimiskeele Rust 1.75 versioon, mis on algselt välja töötatud Mozilla projekti poolt, kuid mille arengut toetab nüüd iseseisev mittetulundusühing Rust Foundation. Keel keskendub mälu ohutule kasutamisele ja pakub vahendeid ülesannete kõrge paralleelsuse saavutamiseks, samal ajal vältides prügikoristaja ja runtime'i kasutamist (runtime piirdub põhiinitsialiseerimise ja standardteegi hooldamisega).
Rustis olevad mäluhaldusmeetodid vabastavad arendajad probleemidest, mis on seotud osutitega, ning kaitsevad madala taseme mälutöötlusest tulenevate probleemide, nagu vabanenud mälu alale juurdepääs, nullosutite de-referentseerimine, mälupiiride ületamine jne. Raamatukogude levitamiseks, projekti koostamise ja sõltuvuste haldamiseks arendatakse pakihaldurit Cargo. Raamatukogude paigutamiseks toetatakse repo crates.io.
Rust tagab turvalise mälutöötluse kompilatsiooni ajal, kontrollides viiteid, jälgides objektide omandit, arvestades objektide elutsüklit (nähtavust) ja hinnates mälule juurdepääsu õigsust koodi käitamise ajal. Rust pakub ka meetmeid enamike täisarvude ületamiste vältimiseks, nõuab muutujate väärtuste algväärtustamist enne kasutamist, käsitleb vigasid paremini oma standardraamatukogus, rakendab immutamatuse (immutable) kontseptsiooni viidetes ja muutujates vaikimisi ning pakub tugevat staatilist tüüpimist loogiliste vigade minimeerimiseks.
Põhilised uuendused:
- Lisatud on võimalus kasutada «async fn» ja märkuseid «->impl Trait» privaatsetes tüüpides. Näiteks, kasutades «->impl Trait», saab kirjutada meetodi tüübile, mis tagastab iteratsioonigruppi: trait Container { fn items(&self) -> impl Iterator; } impl Container for MyContainer { fn items(&self) -> impl Iterator { self.items.iter().cloned() } }
Samuti saab luua tüüpe, mis kasutavad «async fn»: trait HttpService { async fn fetch(&self, url: Url) -> HtmlBody; // laieneb: // fn fetch(&self, url: Url) -> impl Future; }
- Lisatud API, mis arvutab baitide nihete kohta näidikute suhtes. Nakkuse näidikute töötamisel («*const T» ja «*mut T») võib olla vajalik lisada nihkeid näidikule. Varasemalt sai selleks kasutada konstruktsiooni «<*const T>::add(1)», mis lisab baitide arvu, vastavalt «size_of::()» suurusele. Uus API lihtsustab seda toimingut ja võimaldab manipuleerida nihetega baitides ilma eelneva tüüpide konverteerimiseta «*const u8» või «*mut u8».
- pointer::byte_add
- pointer::byte_offset
- pointer::byte_offset_from
- pointer::byte_sub
- pointer::wrapping_byte_add
- pointer::wrapping_byte_offset
- pointer::wrapping_byte_sub
- Tööd jätkatakse rustc kompilaatori jõudluse parandamise nimel. Lisatud on BOLT optimeerija, mis töötab pärast lingimist ning kasutab eelnevalt koostatud täitmisprofiili andmeid. BOLT-i rakendamine võimaldab kiirendada kompilaatori toimimist umbes 2% võrra, muutes librustc_driver.so teegi koodiseadet, et efektiivsemalt kasutada protsessori vahemälu.
Kompilaatori rustc koostamine on aktiveeritud valikuga „-Ccodegen-units=1”, mis parandab LLVMi optimeerimise kvaliteeti. Tehtud testid näitavad, et „-Ccodegen-units=1” koostamisel suureneb jõudlus ligikaudu 1,5%. Lisatud optimeerimised aktiveeritakse vaikimisi ainult platvormil x86_64-unknown-linux-gnu.
Varem nimetatud optimeerimisi on katsetanud Google, et vähendada Androidi platvormi komponentide, mis on kirjutatud Rustis, koostamisaja pikkust. Valiku „-C codegen-units=1” rakendamine Androidi koostamisel aitas vähendada tööriistade suurust 5,5% ja suurendada nende jõudlust 1,8%, samas kui tööriistade enda koostamisaeg suurenes peaaegu kaks korda.
Jäätmete kogumise aktiveerimine linkimise ajal („—gc-sections”) võimaldas suurendada jõudlust 1,9%-ni, linkimise optimeerimine (LTO) tõstis selle 7,7%-ni, ja koodi tegevuse põhjalik optimeerimine (PGO) saavutas 19,8%. Lõpuks rakendati kiirusoptimeerimisi BOLTi utiliidiga, mis tõi kaasa kogukaalu kasvu 24,7%, kuid tööriistade suurus suurenes 10,9%.

- Stabiilsete versioonide hulka on lisatud uus komplekt API-sid, sealhulgas on stabiliseeritud meetodid ja tüüpide rakendused:
- Atomic*::from_ptr
- FileTimes
- FileTimesExt
- File::set_modified
- File::set_times
- IpAddr::to_canonical
- Ipv6Addr::to_canonical
- Option::as_slice
- Option::as_mut_slice
- pointer::byte_add
- pointer::byte_offset
- pointer::byte_offset_from
- pointer::byte_sub
- pointer::wrapping_byte_add
- pointer::wrapping_byte_offset
- pointer::wrapping_byte_sub
- Konstantse märgendiga `const`, mis määrab võimaluse kasutada konstandina igas kontekstis, on rakendatud funktsioonides:
- Ipv6Addr::to_ipv4_mapped
- MaybeUninit::assume_init_read
- MaybeUninit::zeroed
- mem::discriminant
- mem::zeroed
- Tugem kolmandat taset toetust platvormile csky-unknown-linux-gnuabiv2hf, i586-unknown-netbsd ja mipsel-unknown-netbsd. Kolmas tase eeldab põhitoetust, kuid ilma automatiseeritud testimiseta, ametlike kogumite avaldamiseta ja koodi kokkupaneku kontrollimiseta.
Lisaks tuleb märkida uue Hermit projekti versiooni, mis arendab spetsiaalset kernelit (unikernel), kirjutatud Rust keeles, pakkudes tööriistu iseseisvate rakenduste koostamiseks, mis saavad töötada hüperviisori või palja riistvara peal ilma täiendavate kihideta ja operatsioonisüsteemita. Rakenduse koostamisel sidus see staatiliselt raamatukoguga, mis realiseerib kogu vajaliku funktsionaalsuse, mitte ei sõltu operatsioonisüsteemi kernelist ja süsteemiraamatukogudest. Projekti kood levitakse litsentside Apache 2.0 ja MIT alusel. Toetatakse iseseisva täitmise rakenduste koostamist, kirjutatud Rust, Go, Fortran, C ja C++ keeltes. Lisaks arendab projekt oma laadijat, mis võimaldab Hermiti käivitamist QEMU abil ja KVM.
Allikas: opennet.ru

