Objavljen je izdanak programskog jezika Rust 1.99, koji je prvotno razvijen od strane projekta Mozilla, a danas se razvija pod pokroviteljstvom neovisne neprofitne organizacije Rust Foundation. Jezik se fokusira na sigurnu obradu memorije i nudi sredstva za postizanje visokog paralelizma izvršavanja zadataka, pri čemu ne koristi prikupljač smeća i runtime (runtime je sveden na osnovnu inicijalizaciju i upravljanje standardnom bibliotekom).
Metode upravljanja memorijom u Rust-u usmjerene su na isključivanje grešaka prilikom manipulacije pokazivačima i zaštitu od problema koji nastaju zbog niskonivojskog rada s memorijom, kao što su pristupanje memorijskom području nakon što je oslobođeno, dereferenciranje nultih pokazivača, izlazak iz okvira bafera itd. Za distribuciju biblioteka, osiguranje gradnje i upravljanje ovisnostima, projekt se razvija preko upravitelja paketa Cargo. Za hosting 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:
- Omogućena je izrada funkcija u jeziku Rust s varijabilnim brojem argumenata (variadic), koje se izvoze za pozivanje iz projekata na jeziku C (C ABI). Kao posljednji element popisa parametara u takvim funkcijama može se navesti konstrukcija „…”, koja se u Rustu obrađuje uz pomoć posebnog tipa VaList, koji funkcioniše slično kao va_list u C. unsafe extern „C” fn sum(mut args: …) -> i32 { let a = unsafe { args.next_arg::() }; let b = unsafe { args.next_arg::() }; a + b } fn foo() -> i32 { unsafe { sum(0i32, 2i32) } }
- Stabilizirane su funkcije Layout::for_value_raw, mem::size_of_val_raw i mem::align_of_val_raw, koje omogućuju sigurnu definiciju veličine i poravnanja prema sirovim pokazivačima (raw pointer), uključujući korištenje tipova s dinamičkom veličinom, poput rezova, bez potrebe za stvaranjem referenci na podatke.
- U dokumentaciju je dodana preporuka da se izbegava oslobađanje memorije na koju je dobivena statička referenca s neograničenim vremenom trajanja (&’static) pozivom Box::leak (round-trip unleaking), jer takva akcija potencijalno može dovesti do problema zbog nespojivosti s budućim optimizacijama kompajlera i uključenim mehanizmima alokacije memorije. Umesto stvaranja statičke reference za privremeno preneseno vlasništvo, preporučuje se korišćenje sirovih pokazivača, na primer, pozivom Box::into_non_null.
- U stabilne verzije prebačen je novi set API-ja, uključujući stabilizirane metode i implementacije tipa:
- IntoIterator for Box
- IntoIterator for &Box
- IntoIterator for &mut Box
- VecDeque::retain_back
- core::ffi::VaList
- Box::into_non_null
- Box::from_non_null
- Vec::into_parts
- Vec::from_parts
- core::mem::size_of_val_raw
- core::mem::align_of_val_raw
- core::alloc::Layout::for_value_raw
- String::from_utf8_lossy_owned
- string::FromUtf8Error::into_utf8_lossy
- FusedIterator for StepBy
- std::fs::set_times
- std::fs::set_times_nofollow
- U alatu za upravljanje paketima cargo uveden je novi ugrađeni profil „debug“, sličan profilu „dev“ (u budućnosti se planiraju odvojiti mogućnosti za debagiranje i razvoj). Tijekom izrade u CI, inkrementalno sastavljanje je prema zadanim postavkama isključeno.
- Ciljana platforma riscv64-unknown-linux-musl prebačena je na drugi nivo podrške, koji podrazumijeva garanciju izrade, ali bez garancija tijekom prolaska testnog skupa.
Dodatno se mogu istaknuti nedavno najavljeni projekti i događaji vezani za Rust:
- Tvrtka Microsoft prebacila je Rust među jezike prvog nivoa i osigurati će njegovu punu podršku u svim fazama razvoja unutar tvrtke. Prije toga, prvi nivo podrške unutar tvrtke bio je osiguran za jezike C++, C# i TypeScript. Napominje se da se Rust već koristi u više od 100 repozitorija Microsofta. između ostalog, komponente napisane u Rustu već se koriste u proizvodima poput Microsoft 365 i Copilota, a za MSVC kompajler pripremljen je poseban backend rustc_codegen_utc za Rust, temeljen na kompilatoru rustc.
Kao glavna svrha primjene Rusta u Microsoftu navodi se jačanje sigurnosti koda, koji je kritičan s aspekta sigurnosti. Prema riječima tehničkog direktora Microsoft Azure, oko 70% svih ranjivosti u Windows-u uzrokovano je problemima s memorijom, koje se može izbjeći korištenjem Rusta.
- Tvrtka Google uklonila je iz jezgre Linuxa staru implementaciju mehanizma međuprocesne komunikacije Binder, napisanu na jeziku C, u korist novog drajvera Binder IPC, ponovno napisanog u Rustu. Napominje se da je za 15 godina postojanja starog drajvera u njemu akumuliran značajan tehnički dug i obilje kompleksnosti, što je otežavalo pronalazak grešaka, održavanje i dodavanje novih mogućnosti. Drajver Binder IPC na Rustu proglašen je glavnim i više se ne smatra eksperimentalnom razvijenom.
- Objavljen je izdanak Arti 2.7.0, implementacije alata Tor, napisanog na jeziku Rust. Kada kod Arti dostigne razinu sposobnu potpuno zamijeniti verziju na C-u, programeri Tora planiraju dati Arti status glavne implementacije Tora i postupno prekinuti održavanje verzije na C-u. U novoj verziji razvijene su funkcionalnosti za relejeve i poslužitelja direktorij (Directory Authority), povezan s parsiranjem dokumenata, podrškom za zrcaljenje poslužitelja direktorija i obradom DNS prometa. Implementirana je RPC funkcionalnost za promjenu i provjeru konfiguracije. Uklonjene su neke ranjivosti — administratorima onion usluga preporučuje se hitno ažuriranje njihovih sustava.
Izvor: opennet.ru
