Bylo vydáno vydání programovacího jazyka Rust 1.53, který byl založen projektem Mozilla, ale nyní je vyvíjen pod záštitou nezávislé neziskové organizace Rust Foundation. Jazyk se zaměřuje na bezpečnou práci s pamětí, poskytuje automatickou správu paměti a nabízí prostředky pro dosažení vysokého paralelismu při vykonávání úloh, a to vše bez použití garbage collectoru a runtime (runtime se omezuje na základní inicializaci a správu standardní knihovny).
Automatická správa paměti v Rust zbavuje vývojáře chyb při manipulaci s ukazateli a chrání před problémy vyplývajícími z nízkoúrovňové práce s pamětí, jako je přístup do oblasti paměti po jejím uvolnění, dereference nulových ukazatelů, překročení hranice bufferu atd. Pro distribuci knihoven, zajištění sestavení a správu závislostí se vyvíjí balíčkový manažer Cargo. Pro umístění knihoven je podporován repozitář crates.io.
Hlavní novinky:
- Pro pole byl implementován trait IntoIterator, který umožňuje iteraci přes prvky pole podle hodnot: for i in [1, 2, 3] { .. }
Také byla přidána možnost předávat pole do metod, které přijímají iterátory, například: let set = BTreeSet::from_iter([1, 2, 3]); for (a, b) in some_iterator.chain([1]).zip([1, 2, 3]) { .. }
Dříve byl IntoIterator implementován pouze pro odkazy na pole, tj. pro iteraci po hodnotách bylo třeba použít odkazy („&[1, 2, 3]“) nebo „[1, 2, 3].iter()“. Implementaci IntoIterator pro pole komplikovaly problémy s kompatibilitou, způsobené dříve přidanou konverzí metody array.into_iter() na (&array).into_iter(). Tyto problémy se podařilo vyřešit obchvatem — kompilátor bude pokračovat v konverzi array.into_iter() na (&array).into_iter(), jako by nebyla implementace traitu IntoIterator, ale pouze při volání metody se syntaxí „.into_iter()“ a nedotýkající se volání ve formě „in [1, 2, 3]“, „iter.zip([1, 2, 3])“, „IntoIterator::into_iter([1, 2, 3])“.
- Byla poskytnuta možnost uvádění výrazů „|“ (logická operace OR) v jakékoli části vzoru, například místo „Some(1) | Some(2)“ nyní lze psát „Some(1 | 2)“: match result { Ok(Some(1 | 2)) => { .. } Err(MyError { kind: FileNotFound | PermissionDenied, .. }) => { .. } _ => { .. } }
- Použití ne-ASCII znaků v identifikátorech je povoleno, včetně všech národních znaků definovaných ve specifikaci Unicode UAX 31, kromě emoji znaků. Při použití různých, ale podobných znaků, kompilátor vyhodí varování. const BLÅHAJ: &str = „🦈“; struct 人 { 名字: String, } let α = 1; let sos = 2; warning: identifier pair considered confusable between ‘s’ and ‘s’
- Nová várka API byla převedena do kategorie stabilních verzí, včetně stabilizace:
- 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 pro pole
- {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]> pro slice::IterMut
- impl SliceIndex pro (Bound<usize>, Bound<usize>)
- Vec::extend_from_within
- Byl zaveden třetí level podpory pro platformu wasm64-unknown-unknown. Třetí level znamená základní podporu, ale bez automatizovaného testování, publikace oficiálních verzí a ověření možnosti sestavení kódu.
- Správce balíčků Cargo byl převeden na používání názvu „main“ pro hlavní větev Git repozitáře (HEAD). Pro závislosti umístěné v repositářích, které používají název main místo master, již není potřeba uvádět v nastavení branch = „main“.
- Požadavky na minimální verzi LLVM v kompilátoru byly zvýšeny na LLVM 10.
Dále stojí za zmínku poskytnutí financování pro vývoj integrace do jádra Linux nástrojů pro vývoj komponent v jazyce Rust. Práce bude probíhat v rámci projektu Prossimo pod záštitou organizace ISRG (Internet Security Research Group), která je zakladatelem projektu Let’s Encrypt a podporuje propagaci HTTPS a rozvoj technologií pro zvyšování bezpečnosti internetu. Finanční prostředky budou poskytnuty společností Google, která zaplatí práci Miguela Oheda (Miguel Ojeda), autora projektu Rust-for-Linux. Dříve ISRG a Google již financovaly vytvoření alternativního HTTP backendu pro nástroj curl a vývoj nového TLS modulu pro http server Apache.
Podle údajů společností Microsoft a Google přibližně 70 % zranitelností vyplývá z nebezpečného zacházení s pamětí. Předpokládá se, že použití jazyka Rust pro vývoj komponentů jádra, jako jsou ovladače zařízení, sníží riziko vzniku zranitelností způsobených nebezpečným zacházením s pamětí a vyloučí vznik chyb, jako je přístup do paměti po jejím uvolnění a přetečení bufferu.
Bezpečná práce s pamětí je zajištěna v Rustu během kompilace prostřednictvím kontroly odkazů, sledování vlastnictví objektů a zohlednění doby života objektů (oblastí viditelnosti), stejně jako hodnocením správnosti přístupu k paměti během vykonávání kódu. Rust také poskytuje prostředky k ochraně před přetečením celočíselných hodnot, vyžaduje povinnou inicializaci hodnot proměnných před použitím, lépe zpracovává chyby ve standardní knihovně, aplikuje koncept neměnnosti (immutable) odkazů a proměnných ve výchozím nastavení, a nabízí silnou statickou typizaci pro minimalizaci logických chyb.
Zdroj: opennet.ru
