Objavljen je novi izdanak jezika sistemskog programiranja Rust 1.53, koji je prvotno razvio projekt Mozilla, a sada ga razvija neprofitna organizacija Rust Foundation. Ovaj jezik usmjeren je na sigurnu manipulaciju memorijom, pruža automatsko upravljanje memorijom i nudi alate za postizanje visokog paralelizma izvršavanja zadataka, a pritom ne koristi sakupljač smeća i runtime (runtime se svodi na osnovnu inicijalizaciju i podršku standardne biblioteke).
Automatsko upravljanje memorijom u Rustu oslobađa programere od grešaka prilikom manipulacije pokazivačima i štiti od problema koji proizlaze iz niskonivoa rada s memorijom, poput pristupa oslobuđenoj memorijskoj jedinici, dereferenciranja nultih pokazivača, izlaska izvan granica bafera itd. Za distribuciju biblioteka, osiguravanje izgradnje i upravljanje ovisnostima, projekt se razvija pomoću paketnog manažera Cargo. Za hosting biblioteka podržava se repozitorij crates.io.
Glavne novosti:
- Za nizove je implementirana osobina IntoIterator, koja omogućava iteraciju preko elemenata niza po vrijednostima: for i in [1, 2, 3] { .. }
Također, uvedena je mogućnost prosljeđivanja nizova u metode koje primaju iteratore, na primjer: 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()’. Implementacija IntoIterator za nizove ometale su probleme s kompatibilnošću, uzrokovane ranije dodanom pretvorbom metodom array.into_iter() u (&array).into_iter(). Ti problemi su riješeni zaobilaznim putem – kompilator će i dalje pretvoriti array.into_iter() u (&array).into_iter(), kao da implementacija tipa IntoIterator ne postoji, ali samo prilikom poziva metode koristeći sintaksu ‘.into_iter()’ i ne dotičući pozive u formatu ‘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 obrasca, 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, .. }) => { .. } _ => { .. } }
- Uporaba ne-ASCII znakov v identifikatorjih je dovoljena, vključno z vsemi nacionalnimi znaki, določenimi v specifikaciji Unicode UAX 31, razen emoji znakov. Pri uporabi različnih, a podobnih znakov bo prevajalnik izdal opozorilo. const BLÅHAJ: &str = «🦈»; struct 人 { 名字: String, } let α = 1; let sos = 2; warning: identifier pair considered confusable between ‘s’ and ‘s’
- Nova serija API-jev je uvrščena med stabilne, med njimi so stabilizirani:
- 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 tabele
- {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<[T]> za slice::IterMut
- impl SliceIndex za (Bound<usize>, Bound<usize>)
- Vec::extend_from_within
- Nivo podpore za platformo wasm64-unknown-unknown je bil nadgrajen na tretjo raven. Tretja raven pomeni osnovno podporo, vendar brez avtomatiziranega testiranja, objavljanja uradnih različic in preverjanja možnosti za prevajanje kode.
- Upravitelj paketov Cargo je privzeto prešel na uporabo imena „main“ za glavno vejo Git repozitorija (HEAD). Za odvisnosti, ki so shranjene v repozitorijih, ki uporabljajo ime main namesto master, ni več potrebno v nastavitvah določiti branch = „main“.
- V prevajalniku so zahteve za minimalno različico LLVM povečane na LLVM 10.
Poleg tega je možno omeniti zagotavljanje financiranja za razvoj integracije v Linux jedro sredstev za razvoj komponent v jeziku Rust. Delo bo potekalo v okviru projekta Prossimo pod okriljem organizacije ISRG (Internet Security Research Group), ki je ustanovitelj projekta Let’s Encrypt in podpira širitev HTTPS ter razvoj tehnologij za povečanje varnosti interneta. Sredstva bo zagotovila družba Google, ki bo financirala delo Miguela Ohede (Miguel Ojeda), avtorja projekta Rust-for-Linux. Prej sta ISRG in Google že financirala razvoj alternativnega HTTP bizarja za orodje curl in razvoj novega TLS modula za http strežnik Apache.
Po podatkih podjetij Microsoft in Google je približno 70 % ranljivosti posledica nesigurnega dela z medpomnilnikom. Predvideva se, da bo uporaba jezika Rust za razvoj komponent jedra, kot so gonilniki naprav, zmanjšala tveganje za pojav ranljivosti, ki jih povzroča nesigurno delo z medpomnilnikom, ter odpravila napake, kot so dostop do pomnilnika po njem osvoboditvi in prekoračenje meja medpomnilnika.
V Rustu se varna obravnava pomnilnika zagotavlja med prevajanjem z verificiranjem sklicev, sledenjem lastništvu objektov in upoštevanjem življenjske dobe objektov (območja vidnosti), prav tako pa tudi z ocenjevanjem pravilnosti dostopa do pomnilnika med izvajanjem kode. Rust prav tako ponuja sredstva za zaščito pred prenasičenjem celoštevila, zahteva obvezno inicializacijo vrednosti spremenljivk pred uporabo, bolje obravnava napake v standardni knjižnici, uporablja koncept neprenosljivosti (immutable) sklicev in spremenljivk privzeto ter ponuja močno statično tipizacijo za minimizacijo logičnih napak.
Izvor: opennet.ru
