Opublikowano wydanie języka programowania systemowego Rust 1.53, który był rozwijany przez projekt Mozilla, a obecnie jest rozwijany pod egidą niezależnej organizacji non-profit Rust Foundation. Język koncentruje się na bezpiecznej pracy z pamięcią, zapewnia automatyczne zarządzanie pamięcią i dostarcza narzędzi do osiągnięcia wysokiego równoległego wykonania zadań, przy tym omijając użycie zbieracza śmieci i runtime (runtime sprowadza się do podstawowej inicjalizacji i wsparcia standardowej biblioteki).
Automatyczne zarządzanie pamięcią w Rust eliminuje błędy programisty związane z manipulowaniem wskaźnikami i chroni przed problemami, które mogą wystąpić w wyniku niskopoziomowej pracy z pamięcią, takimi jak dostęp do obszaru pamięci po jej zwolnieniu, dereferencjonowanie wskaźników zerowych, przekraczanie granic bufora itp. W celu rozwoju bibliotek, zapewnienia kompilacji oraz zarządzania zależnościami, rozwijany jest menedżer pakietów Cargo. Do przechowywania bibliotek dostępne jest repozytorium crates.io.
Główne nowości:
- Dla tablic zaimplementowano typ IntoIterator, który pozwala na iterację po elementach tablicy po ich wartościach: for i in [1, 2, 3] { .. }
Dodano także możliwość przesyłania tablic do metod, które przyjmują iteratory, na przykład: let set = BTreeSet::from_iter([1, 2, 3]); for (a, b) in some_iterator.chain([1]).zip([1, 2, 3]) { .. }
Wcześniej IntoIterator był zaimplementowany tylko dla referencji do tablic, co oznacza, że do iteracji po wartościach należało używać referencji („&[1, 2, 3]”) lub „[1, 2, 3].iter()”. Implementacja IntoIterator dla tablic była utrudniona przez problemy z kompatybilnością spowodowane wcześniejszym dodaniem do kompilatora konwersji metody array.into_iter() na (&array).into_iter(). Problemy te udało się rozwiązać poprzez obejście — kompilator nadal będzie przekształcał array.into_iter() na (&array).into_iter() tak, jakby brakowało implementacji typu IntoIterator, ale tylko przy wywołaniu metody z użyciem składni „.into_iter()” i nie dotykając wywołań w formie „in [1, 2, 3]”, „iter.zip([1, 2, 3])”, „IntoIterator::into_iter([1, 2, 3])”.
- Dodano możliwość używania wyrażeń „|” (operacja logiczna OR) w dowolnej części szablonu, na przykład zamiast „Some(1) | Some(2)” teraz można pisać „Some(1 | 2)”: match result { Ok(Some(1 | 2)) => { .. } Err(MyError { kind: FileNotFound | PermissionDenied, .. }) => { .. } _ => { .. } }
- Dozwolone jest używanie znaków nie-ASCII w identyfikatorach, w tym wszelkich znaków narodowych zdefiniowanych w specyfikacji Unicode UAX 31, z wyjątkiem znaków emoji. Przy użyciu różnych, ale podobnych wizualnie znaków kompilator wyświetli ostrzeżenie. const BLÅHAJ: &str = «🦈»; struct 人 { 名字: String, } let α = 1; let sos = 2; warning: identifier pair considered confusable between ‘s’ and ‘s’
- Nowa partia API została zakwalifikowana jako stabilna, w tym stabilizacje:
- 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 dla tablic
- {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]> dla slice::IterMut
- impl SliceIndex dla (Bound<usize>, Bound<usize>)
- Vec::extend_from_within
- Wprowadzono trzeci poziom wsparcia dla platformy wasm64-unknown-unknown. Trzeci poziom zakłada podstawowe wsparcie, ale bez zautomatyzowanego testowania, publikacji oficjalnych wydań i weryfikacji możliwości kompilacji kodu.
- Menadżer pakietów Cargo domyślnie przeszedł na używanie nazwy «main» dla głównej gałęzi repozytorium Git (HEAD). Dla zależności umieszczonych w repozytoriach używających nazwy main zamiast master, nie ma już potrzeby podawania ustawienia branch = «main».
- W kompilatorze wymagania dotyczące minimalnej wersji LLVM zostały podniesione do LLVM 10.
Dodatkowo można zauważyć zapewnienie finansowania pracy nad rozwojem integracji w jądro Linux środków do tworzenia komponentów w języku Rust. Prace będą prowadzone w ramach projektu Prossimo pod egidą organizacji ISRG (Internet Security Research Group), która jest założycielem projektu Let’s Encrypt i wspiera wdrażanie HTTPS oraz rozwój technologii na rzecz zwiększenia bezpieczeństwa internetu. Środki zostaną zapewnione przez firmę Google, która opłaci pracę Miguela Oheda (Miguel Ojeda), autora projektu Rust-for-Linux. Wcześniej ISRG i Google już sfinansowały stworzenie alternatywnego backendu HTTP dla narzędzia curl oraz opracowanie nowego modułu TLS dla serwera http Apache.
Według firm Microsoft i Google, około 70% luk bezpieczeństwa jest spowodowanych niebezpiecznym zarządzaniem pamięcią. Przyjmuje się, że użycie języka Rust do opracowywania komponentów jądra, takich jak sterowniki urządzeń, może zmniejszyć ryzyko wystąpienia luk związanych z niebezpiecznym zarządzaniem pamięcią oraz wykluczyć takie błędy jak dostęp do obszaru pamięci po jej zwolnieniu i przekroczenie granic bufora.
Bezpieczna praca z pamięcią w języku Rust jest zapewniana w czasie kompilacji poprzez sprawdzanie referencji, śledzenie własności obiektów oraz uwzględnianie czasu życia obiektów (zakresu widoczności), a także poprzez ocenę poprawności dostępu do pamięci w czasie wykonywania kodu. Rust zapewnia również środki ochrony przed przepełnieniami wartości całkowitych, wymaga obowiązkowego inicjowania wartości zmiennych przed ich użyciem, lepiej obsługuje błędy w standardowej bibliotece, stosuje koncepcję niezmienności (immutable) referencji i zmiennych domyślnie oraz oferuje silną statyczną typizację w celu minimalizacji błędów logicznych.
Źródło: opennet.ru
