Objavljen je izlaz programskog jezika Rust 1.93, koji je prvotno razvijen od strane projekta Mozilla, a sada se razvija pod pokroviteljstvom neovisne neprofitne organizacije Rust Foundation. Jezik se fokusira na sigurnu upotrebu memorije i pruža sredstva za postizanje visoke razine paralelizma izvršavanja zadataka, pri čemu se ne koristi sakupljač smeća i runtime (runtime se svodi na osnovnu inicijalizaciju i podršku standardne biblioteke).
Metode manipulacije memorijom u Rustu oslobodile su programere od grešaka prilikom rukovanja pokazivačima i štite od problema koji proizlaze iz niskorazredne obrade memorije, poput pristupanja memoriji nakon što je oslobođena, dereferenciranja nul pokazivača, izlaska iz granica bafera itd. Za distribuciju biblioteka, osiguranje izgradnje i upravljanje ovisnostima, projekat se razvija putem upravitelja paketa Cargo. Za pohranu biblioteka podržava se repozitorij crates.io.
Sigurna manipulacija memorijom osigurava se u Rustu tijekom kompilacije provjerom referenci, praćenjem vlasništva nad objektima, uzimanjem u obzir vremena života objekata (opseg vidljivosti) i ocjenom točnosti pristupa memoriji tijekom izvršavanja koda. Rust također pruža sredstva za zaštitu od cjelobrojnih prekoračenja, zahtijeva obaveznu inicijalizaciju vrijednosti varijabli prije upotrebe, bolje obrađuje greške u standardnoj biblioteci, primjenjuje koncept nepromjenjivosti (immutable) referenci i varijabla kao zadano te nudi snažnu statičku tipizaciju za minimiziranje logičkih grešaka.
Glavne novine:
- Ugrađena standardna C biblioteka Musl, korištena za statičko povezivanje za ciljne platforme „*-linux-musl“ (aarch64-unknown-linux-musl, x86_64-unknown-linux-musl, powerpc64le-unknown-linux-musl itd.) na sustavima bez Musl, ažurirana je na verziju 1.2.5. Minimalno podržavana verzija Musl za dinamičko povezivanje također je podignuta na izdanje 1.2.5. Ranije je u Rastu korištena verzija Musl 1.2.3, koja je imala probleme s implementacijom DNS-resolvera. U verziji Musl 1.2.4 u DNS-resolver je dodana mogućnost slanja zahtjeva putem TCP-a u slučaju neuspješnog poziva putem UDP-a, što je riješilo problem s velikim DNS zapisima i uspostavilo kompatibilnost s rekursivnim DNS poslužiteljima koji ne podržavaju slanje dijela rezultata u skraćenim UDP odgovorima. U verziji Musl 1.2.5 u DNS-resolveru implementirana je obrada odgovora s dugim CNAME nizovima i riješen je problem zbog kojeg su neki veliki odgovori, koji su slani kroz TCP, bili odbijeni.
- Standardna biblioteka je preradila radi rješavanja problema s reenterabilnošću prilikom korištenja u globalnim alokatorima memorije napisanih na Rastu, makrona std::thread_local! i funkcije std::thread::current, što je dovodilo do beskonačne rekurzije. Kako bi se isključila situacija u kojoj std::thread_local! i std::thread::current prilikom pokušaja alokacije memorije pozivaju isti alokator u kojem se koriste, sada se direktno primjenjuje sistemski mehanizam alokacije memorije.
- Unutar blokova «asm!» s asembler kodom dopušteno je korištenje atributa «cfg», što, na primjer, omogućava upravljanje aktivacijom proširenih skupova instrukcija CPU u kontekstu pojedinih izraza unutar asm-bloka (ranije su se atributi «cfg» mogli postaviti samo za cijeli asm-blok). asm!( // ili global_asm! ili naked_asm! "nop", #[cfg(target_feature = "sse2")] "nop", // … #[cfg(target_feature = "sse2")] a = const 123, // koristi se samo na sse2 );
- U stabilne verzije prebačen je novi set API-ja, uključujući stabilizirane metode i implementacije tipa:
- <[MaybeUninit]>::assume_init_drop
- <[MaybeUninit]>::assume_init_ref
- <[MaybeUninit]>::assume_init_mut
- <[MaybeUninit]>::write_copy_of_slice
- <[MaybeUninit]>::write_clone_of_slice
- String::into_raw_parts
- Vec::into_raw_parts
- ::unchecked_neg
- ::unchecked_shl
- ::unchecked_shr
- ::unchecked_shl
- ::unchecked_shr
- ::as_array
- ::as_array_mut
- ::as_array
- ::as_mut_array
- VecDeque::pop_front_if
- VecDeque::pop_back_if
- Duration::from_nanos_u128
- char::MAX_LEN_UTF8
- char::MAX_LEN_UTF16
- std::fmt::from_fn
- std::fmt::FromFn
- Ciljna platforma «riscv64a23-unknown-linux-gnu» prebačena je na drugi nivo podrške, što podrazumeva garanciju izgradnje, ali ne i garancije tokom prolaska testnog skupa.
Takođe možemo napomenuti nekoliko povezanih projekata sa Rust-om:
- Za Linux jezgro se razvija okvir Rex, koji omogućava stvaranje dodataka za jezgro Linux-a na jeziku Rust, koje se mogu koristiti za proširenje funkcionalnosti jezgra umesto eBPF-a. Rex pruža iste bezbednosne garancije kao i eBPF, ali koristi mogućnosti jezika Rust i lagani Runtime za izolaciju i obezbeđivanje bezbednosti. Za ovakve programe se ne primenjuje verifikator, a programi se kompajliraju u nativni kod Rust kompajlerom.
U Rex programima se može koristiti podskup jezika Rust, koji pruža garancije bezbednosti. U trenutnoj verziji podržano je 5 tipova eBPF programa: kprobe, perf_event, tracepoint, xdp i tc. Postoji mogućnost pozivanja pomoćnih eBPF funkcija, interakcije sa map struktura eBPF, upravljanja resursima jezgra, obrade izuzetaka i korišćenja obradnih i apstrakcija nad strukturnim jezgrima.
- Dostupan je izlaz Fjall 3, ugrađenog skladišta koje je napisano na Rust-u i radi sa podacima u formatu ključ-vrednost. Skladištenje podataka se vrši u obliku loga koristeći LSM drvo (Log-Structured-Merge), kao u RocksDB-u, gde se promene beleže dodavanjem podataka na kraj datoteke. Za pristup Bazi podataka nudi se API u stilu BTreeMap. Podržane su mogućnosti kao što su prostori imena, direktno i obrnuto pretraživanje po opsegu, ugrađeno kompresovanje, serijalizovane transakcije, odvojeno skladištenje ključeva i povezanih vrlo velikih vrednosti, automatsko pozadinsko održavanje Baze podataka. Kod je otvoren pod Apache 2.0 licencom.
- Projekt Tor objavio je izdanja Arti 1.9.0, implementaciju alata Tor napisanog na jeziku Rust. Kada kod Arti postigne razinu koja može u potpunosti zamijeniti verziju napisana u C-u, programeri Tor planiraju dodijeliti Arti status glavne implementacije Tora i postupno prestati s podrškom za implementaciju u C-u. U novoj verziji nastavlja se implementacija funkcionalnosti za releje i poslužitelja direktorije (Directory Authority), poboljšana je podrška za rad s dinamički dodijeljenim portovima (proxy.socks_listen = "auto"), dodan je eksperimentalni API za upravljanje ključevima za onion-usluge.
Izvor: opennet.ru
