Opublikowano wydanie systemowego języka programowania Rust 1.53, założonego przez projekt Mozilla, ale obecnie rozwijanego pod auspicjami niezależnej organizacji non-profit Rust Foundation. Język koncentruje się na bezpieczeństwie pamięci, zapewnia automatyczne zarządzanie pamięcią i zapewnia środki do osiągnięcia dużej równoległości zadań bez użycia modułu zbierającego elementy bezużyteczne lub środowiska wykonawczego (czas działania jest zredukowany do podstawowej inicjalizacji i konserwacji biblioteki standardowej).
Automatyczne zarządzanie pamięcią Rusta eliminuje błędy podczas manipulowania wskaźnikami i chroni przed problemami wynikającymi z manipulacji pamięcią na niskim poziomie, takimi jak dostęp do obszaru pamięci po jego zwolnieniu, wyłuskiwanie wskaźników zerowych, przepełnienie bufora itp. Aby rozpowszechniać biblioteki, zapewniać montaż i zarządzać zależnościami, w ramach projektu opracowywany jest menedżer pakietów Cargo. Repozytorium crates.io jest obsługiwane w przypadku bibliotek hostujących.
Główne innowacje:
- Dla tablic zaimplementowano cechę IntoIterator, która pozwala organizować iterację elementów tablicy według wartości: for i in [1, 2, 3] { .. }
Możliwe jest także przekazywanie tablic do metod akceptujących iteratory, na przykład: let set = BTreeSet::from_iter([1, 2, 3]); for (a, b) w Some_iterator.chain([1]).zip([1, 2, 3]) { .. }
Wcześniej IntoIterator był implementowany tylko dla odwołań do tablic, tj. iteracja po wartościach wymagała użycia referencji („&[1, 2, 3]”) lub „[1, 2, 3].iter()”. Implementację IntoIterator dla tablic utrudniały problemy ze zgodnością spowodowane wcześniejszą konwersją kompilatora z array.into_iter() na (&array).into_iter(). Problemy te rozwiązano obejściem — kompilator będzie kontynuował konwersję array.into_iter() na (&array).into_iter() tak, jakby nie było implementacji cechy IntoIterator, ale tylko podczas wywoływania metody przy użyciu metody „.into_iter() )” i bez dotykania wywołań w postaci „in [1, 2, 3]”, „iter.zip([1, 2, 3])”, „IntoIterator::into_iter([1, 2, 3] )”.
- Możliwe jest określenie wyrażeń „|” (operacja logiczna OR) w dowolnej części szablonu, na przykład zamiast „Some(1) | Some(2)” możesz teraz zapisać „Some(1 | 2)”: wynik dopasowania { Ok(Some(1 | 2)) => { .. } Err(MyError { rodzaj: FileNotFound | PermissionDenied, .. }) = > { .. } _ => { .. } }
- Dozwolone jest używanie w identyfikatorach znaków innych niż ASCII, w tym wszelkich znaków narodowych zdefiniowanych w specyfikacji Unicode UAX 31, ale z wyłączeniem znaków emoji. Jeśli użyjesz różnych, ale podobnych znaków, kompilator wyświetli ostrzeżenie. const BLÅHAJ: &str = "🦈"; struct 人{名字: String, } niech α = 1; niechsos = 2; ostrzeżenie: para identyfikatorów może zostać pomylona pomiędzy „s” i „s”
- Do kategorii stabilnej została przeniesiona nowa porcja API, w tym następujące stabilizowane:
- tablica::z_ref
- tablica::from_mut
- AtomicBool::fetch_update
- AtomicPtr::fetch_update
- BTreeSet::zachowaj
- BTreeMap::zachowaj
- BufReader::seek_relative
- cmp::min_by
- cmp::min_by_key
- cmp::max_by
- cmp::max_by_key
- DebugStruct::finish_non_exhaustive
- Czas trwania::ZERO
- Czas trwania::MAX
- Czas trwania::jest_zero
- Czas trwania::saturating_add
- Czas trwania::nasycenie_sub
- Czas trwania::saturating_mul
- f32::is_subnormal
- f64::is_subnormal
- IntoIterator dla tablic
- {liczba całkowita}::BITY
- io::Error::Nieobsługiwane
- NonZero*::wiodące_zero
- NonZero*::trailing_zeros
- Opcja::wstaw
- Zamawianie::is_eq
- Zamawianie::is_ne
- Zamawianie::is_lt
- Zamawianie::is_gt
- Zamawianie::is_le
- Zamawianie::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::inkrement_strong_count
- Rc::dekrement_strong_count
- plasterek::IterMut::as_slice
- AsRef<[T]> dla plasterka::IterMut
- impl SliceIndex dla (Bound , Zobowiązany )
- Vec::extend_from_wewnątrz
- Wdrożono trzeci poziom wsparcia dla platformy wasm64-unknown-unknown. Trzeci poziom obejmuje podstawowe wsparcie, ale bez automatycznych testów, publikowania oficjalnych kompilacji i sprawdzania, czy kod da się zbudować.
- Menedżer pakietów Cargo został przeniesiony tak, aby domyślnie używał nazwy „main” dla głównej gałęzi repozytorium Git (HEAD). Zależności hostowane w repozytoriach, które używają nazwy main zamiast master, nie wymagają już skonfigurowania gałęzi = „main”.
- W kompilatorze wymagania dotyczące minimalnej wersji LLVM zostają podniesione do LLVM 10.
Dodatkowo możemy odnotować zapewnienie finansowania rozwoju integracji z jądrem Linuksa narzędzi do tworzenia komponentów w języku Rust. Prace będą prowadzone w ramach projektu Prossimo pod patronatem organizacji ISRG (Internet Security Research Group), która jest założycielem projektu Let's Encrypt i promuje protokół HTTPS oraz rozwój technologii zwiększających bezpieczeństwo Internet. Fundusze zapewni Google, które opłaci prace Miguela Ojedy, autora projektu Rust-for-Linux. Wcześniej ISRG i Google sfinansowały już utworzenie alternatywnego backendu HTTP dla narzędzia curl i rozwój nowego modułu TLS dla serwera HTTP Apache.
Według Microsoft i Google około 70% luk wynika z niebezpiecznej obsługi pamięci. Oczekuje się, że używanie języka Rust do tworzenia komponentów jądra, takich jak sterowniki urządzeń, zmniejszy ryzyko luk w zabezpieczeniach spowodowanych niebezpieczną obsługą pamięci i wyeliminuje błędy, takie jak dostęp do obszaru pamięci po jego zwolnieniu i przekroczenie granic bufora.
Bezpieczna obsługa pamięci w Rust jest zapewniona w czasie kompilacji poprzez sprawdzanie referencji, śledzenie własności obiektu i czasu życia obiektu (zakres), a także poprzez ocenę poprawności dostępu do pamięci podczas wykonywania kodu. Rust zapewnia również ochronę przed przepełnieniami liczb całkowitych, wymaga obowiązkowej inicjalizacji wartości zmiennych przed użyciem, lepiej radzi sobie z błędami w standardowej bibliotece, domyślnie stosuje koncepcję niezmiennych odniesień i zmiennych, oferuje silne typowanie statyczne w celu zminimalizowania błędów logicznych.
Źródło: opennet.ru