Udgivelsen af programmeringssproget Rust 1.53, der blev udviklet af Mozilla, men som nu videreudvikles under beskyttelse af den uafhængige nonprofitorganisation Rust Foundation. Sproget fokuserer på sikker hukommelsesadgang, sørger for automatisk hukommelsesstyring og giver værktøjer til at opnå høj parallel udførelse af opgaver uden at bruge en garbage collector og runtime (runtime omfatter blot grundlæggende initialisering og vedligeholdelse af standardbiblioteket).
Den automatiske hukommelsesstyring i Rust frigør udviklere fra fejl ved manipulation af pointere og beskytter mod problemer, der opstår fra lavnivå hukommelsesarbejde, såsom adgang til hukommelsesområder efter de er blevet frigivet, dereferering af nulpointere, buffer-overløb mv. For distribution af biblioteker, opbygning og afhængighedsstyring udvikles en pakkehåndtering kaldet Cargo. Der understøttes et repository til biblioteker på crates.io.
Hovednyhederne:
- Der er implementeret en trait IntoIterator for arrays, der gør det muligt at iterere over elementer i et array baseret på værdier: for i in [1, 2, 3] { .. }
Det er også blevet muligt at videregive arrays til metoder, der tager iteratorer, for eksempel: let set = BTreeSet::from_iter([1, 2, 3]); for (a, b) in some_iterator.chain([1]).zip([1, 2, 3]) { .. }
Tidligere blev IntoIterator kun implementeret for referencer til arrays, hvilket betød, at iteration over værdier krævede brug af referencer ("&[1, 2, 3]") eller "[1, 2, 3].iter()". Implementeringerne af IntoIterator for arrays var besværet af kompatibilitetsproblemer forårsaget af den tidligere tilføjede transformationsmetode array.into_iter() til (&array).into_iter(). De nævnte problemer blev løst med en omgåelse — compileren fortsætter med at transformere array.into_iter() til (&array).into_iter(), som om implementeringen af IntoIterator ikke eksisterede, men kun ved opkald af metoden med syntaksen ".into_iter()" og uden at berøre opkald i formen "in [1, 2, 3]", "iter.zip([1, 2, 3])", "IntoIterator::into_iter([1, 2, 3])".
- Der er givet mulighed for at angive udtryk "|" (logisk OR operation) i enhver del af skabelonen, for eksempel i stedet for "Some(1) | Some(2)" kan man nu skrive "Some(1 | 2)": match result { Ok(Some(1 | 2)) => { .. } Err(MyError { kind: FileNotFound | PermissionDenied, .. }) => { .. } _ => { .. } }
- Brug af ikke-ASCII-tegn i identifikatorer er tilladt, herunder enhver national karakter defineret i Unicode-specifikationen UAX 31, men undtagen emoji-tegn. Når der anvendes forskellige, men lignende tegn, vil kompilatoren generere en advarsel. const BLÅHAJ: &str = «🦈»; struct 人 { 名字: String, } let α = 1; let sos = 2; warning: identifier pair considered confusable between ‘s’ and ‘s’
- En ny opdatering af API'en er blevet klassificeret som stabil, herunder stabilisering af:
- 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 for arrays
- {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]> for slice::IterMut
- impl SliceIndex for (Bound<usize>, Bound<usize>)
- Vec::extend_from_within
- Tredje niveau af support for platformen wasm64-unknown-unknown er blevet implementeret. Tredje niveau indebærer grundlæggende support, men uden automatiseret testning, offentliggørelse af officielle builds og verificering af opbygning af kode.
- Pakkehåndtereren Cargo er som standard blevet oversat til at bruge navnet «main» for hovedgrenen af Git-repositoriet (HEAD). For afhængigheder gemt i repositories, der anvender navnet main i stedet for master, er det ikke længere nødvendigt at angive branch = «main» i indstillingerne.
- Kravene til den minimale version af LLVM i kompilatoren er hævet til LLVM 10.
Derudover kan det bemærkes, at der er sikret finansiering til udviklingen af integrationen i Linux-kernen for udviklingsværktøjer til Rust. Arbejdet vil blive udført under projektet Prossimo, som er under ISRG's (Internet Security Research Group) vinger, som er grundlæggeren af projektet Let’s Encrypt og fremmer udbredelsen af HTTPS samt udviklingen af teknologier til at øge internetsikkerhed. Midlerne vil blive stillet til rådighed af Google, som vil betale for arbejdet af Miguel Ojeda, skaberen af Rust-for-Linux-projektet. Tidligere har ISRG og Google også finansieret oprettelsen af en alternativ HTTP-backend til curl og udviklingen af en ny TLS-modul til Apache webserveren.
Ifølge Microsoft og Google skyldes omkring 70% af sårbarhederne usikker håndtering af hukommelse. Det antages, at brugen af programmeringssproget Rust til udvikling af kernens komponenter, såsom enhedsdrivere, vil reducere risikoen for sårbarheder forårsaget af usikker hukommelseshåndtering og forhindre fejl som adgang til hukommelsesområder efter frigivelse og buffer overflow.
Sikker hukommelseshåndtering sikres i Rust under kompileringen gennem referencekontrol, overvågning af ejerskab af objekter og livscyklus (scope) af objekter, samt evaluering af korrekt hukommelsestilgang under kodeudførelse. Rust tilbyder også midler til beskyttelse mod heltalsoverskridelser, kræver obligatorisk initialisering af variabelværdier før brug, håndterer fejl bedre i standardbiblioteket, anvender konceptet med immutability (uændrede) referencer og variabler som standard, og tilbyder stærk statisk typekontrol for at minimere logiske fejl.
Kilde: opennet.ru
