Objavljen je izdanak programskog jezika Rust 1.53, koji je razvijen od strane projekta Mozilla, a sada se razvija pod pokroviteljstvom neovisne neprofitne organizacije Rust Foundation. Jezik se fokusira na sigurnu manipulaciju memorijom, osigurava automatsko upravljanje memorijom i pruža alate za postizanje visoke paralelnosti izvršenja zadataka, pritom se oslanjajući na bazno inicijaliziranje i održavanje standardne biblioteke, bez korištenja sakupljača smeća i runtime okruženja.
Automatsko upravljanje memorijom u Rustu oslobađa programere od grešaka prilikom manipulacije pokazivačima i štiti ih od problema koji nastaju zbog niskonivojskog rada s memorijom, kao što su pristup području memorije nakon što je oslobođeno, dereferenciranje nultih pokazivača, izlazak iz granica bafera itd. Za distribuciju biblioteka, osiguranje izgradnje i upravljanje ovisnostima, projekt razvija upravitelja paketa Cargo. Za hostanje biblioteka podržava se repozitorij crates.io.
Glavne novine:
- Za nizove je implementiran trait IntoIterator, koji omogućava iteraciju preko elemenata niza po vrijednostima: for i in [1, 2, 3] { .. }
Također je dodana mogućnost prosljeđivanja nizova u metode koje primaju iteratore, primjerice: let set = BTreeSet::from_iter([1, 2, 3]); for (a, b) in some_iterator.chain([1]).zip([1, 2, 3]) { .. }
Ranije je IntoIterator bio implementiran samo za reference na nizove, tj. za iteraciju po vrijednostima bilo je potrebno koristiti reference („&[1, 2, 3]”) ili „[1, 2, 3].iter()”. Implementacije IntoIterator za nizove ometali su problemi s kompatibilnošću uzrokovani ranije dodanom pretvorbom u prevoditelju metoda array.into_iter() u (&array).into_iter(). Ovi problemi su riješeni alternativnim pristupom — prevoditelj će nastaviti pretvorbu array.into_iter() u (&array).into_iter(), kao da implementacija traita IntoIterator ne postoji, ali samo kada se metoda poziva koristeći sintaksu „.into_iter()”, a ne u pozivima u obliku „in [1, 2, 3]”, „iter.zip([1, 2, 3])”, „IntoIterator::into_iter([1, 2, 3])”.
- Omogućena je upotreba izraza «|» (logička operacija OR) u bilo kojem dijelu predloška, na primjer, umjesto «Some(1) | Some(2)» sada se može pisati «Some(1 | 2)»: match result { Ok(Some(1 | 2)) => { .. } Err(MyError { kind: FileNotFound | PermissionDenied, .. }) => { .. } _ => { .. } }
- Dopuštena je upotreba ne-ASCII znakova u identifikatorima, uključujući bilo koje nacionalne znakove definirane u Unicode specifikaciji UAX 31, osim emoji znakova. Kada se koriste različiti, ali slični znakovi, prevodilac će izbaciti upozorenje. const BLÅHAJ: &str = «🦈»; struct 人 { 名字: String, } let α = 1; let sos = 2; warning: identifier pair considered confusable between ‘s’ and ‘s’
- Nova serija API-ja prešla je u stabilnu fazu, uključujući stabilizirane:
- array::from_ref
- array::from_mut
- AtomicBool::fetch_update
- AtomicPtr::fetch_update
- BTreeSet::retain
- BTreeMap::retain
- BufReader::seek_relative
- cmp::min_by
- cmp::min_by_key
- cmp::max_by
- cmp::max_by_key
- DebugStruct::finish_non_exhaustive
- Duration::ZERO
- Duration::MAX
- Duration::is_zero
- Duration::saturating_add
- Duration::saturating_sub
- Duration::saturating_mul
- f32::is_subnormal
- f64::is_subnormal
- IntoIterator za nizove
- {integer}::BITS
- io::Error::Unsupported
- NonZero*::leading_zeros
- NonZero*::trailing_zeros
- Option::insert
- Ordering::is_eq
- Ordering::is_ne
- Ordering::is_lt
- Ordering::is_gt
- Ordering::is_le
- Ordering::is_ge
- OsStr::make_ascii_lowercase
- OsStr::make_ascii_uppercase
- OsStr::to_ascii_lowercase
- OsStr::to_ascii_uppercase
- OsStr::is_ascii
- OsStr::eq_ignore_ascii_case
- Peekable::peek_mut
- Rc::increment_strong_count
- Rc::decrement_strong_count
- slice::IterMut::as_slice
- AsRef za slice::IterMut
- impl SliceIndex za (Bound, Bound)
- Vec::extend_from_within
- Implementirana je treća razina podrške za platformu wasm64-unknown-unknown. Treća razina podrazumijeva osnovnu podršku, ali bez automatiziranog testiranja, objavljivanja službenih verzija i provjere mogućnosti gradnje koda.
- Upravitelj paketa Cargo prema zadanim postavkama prebačen je na korištenje imena «main» za glavnu granu Git repozitorija (HEAD). Za ovisnosti smještene u repozitorijima koji koriste naziv main umjesto master, više nije potrebno navoditi u postavkama branch = «main».
- U prevodiocu su zahtjevi za minimalnu verziju LLVM podignuti na LLVM 10.
Dodatno se može istaknuti pružanje financiranja za razvoj integracije alata za razvoj komponenti na jeziku Rust u Linux jezgru. Rad će se odvijati unutar projekta Prossimo pod okriljem organizacije ISRG (Internet Security Research Group), koja je osnivač projekta Let's Encrypt i potiče promociju HTTPS-a te razvoj tehnologija za povećanje sigurnosti interneta. Sredstva će osigurati tvrtka Google, koja će platiti rad Miguela Ohede (Miguel Ojeda), autora projekta Rust-for-Linux. Ranije su ISRG i Google već financirali izradu alternativnog HTTP backend-a za alat curl i razvoj novog TLS modula za http-server Apache.
Prema podacima tvrtki Microsoft i Google, oko 70% ranjivosti uzrokovano je nesigurnim radom s memorijom. Pretpostavlja se da će korištenje jezika Rust za razvoj komponenti jezgre, poput upravljačkih programa, smanjiti rizik od ranjivosti uzrokovanih nesigurnim radom s memorijom i isključiti mogućnost pojave grešaka poput pristupa memoriji nakon njenog oslobađanja i izlaska iz granica bafera.
Siguran rad s memorijom osigurava se u Rust-u tijekom kompajlacije putem provjere referenci, praćenja vlasništva nad objektima i uzimanja u obzir vremena života objekata (opseg vidljivosti), kao i procjenom ispravnosti pristupa memoriji tijekom izvođenja koda. Rust također pruža alate za zaštitu od prelivanja cijelih brojeva, zahtijeva obveznu inicijalizaciju vrijednosti varijabli prije upotrebe, bolje obrađuje greške u standardnoj biblioteci, primjenjuje koncept nepromjenjivosti (immutable) referenci i varijabli prema zadanim postavkama te nudi snažnu statičku tipizaciju za minimiziranje logičkih grešaka.
Izvor: opennet.ru
