Opublikowano wydanie języka programowania Rust 1.91, opracowanego przez projekt Mozilla, ale obecnie rozwijanego pod auspicjami niezależnej organizacji non-profit Rust Foundation. Język koncentruje się na bezpiecznej pracy z pamięcią i zapewnia środki do osiągania wysokiego poziomu równoległości w wykonywaniu zadań, jednocześnie omijając wykorzystanie garbage collectora i runtime (który ogranicza się do podstawowej inicjalizacji i wsparcia dla standardowej biblioteki).
Metody zarządzania pamięcią w Rust eliminują błędy związane z manipulowaniem wskaźnikami oraz chronią przed problemami wynikającymi z niskopoziomowej obsługi pamięci, takimi jak dostęp do pamięci po jej zwolnieniu, dereferencjonowanie wskaźników zerowych, wychodzenie poza granice bufora itp. Dla rozprowadzania bibliotek, zapewnienia budowy i zarządzania zależnościami, rozwijany jest menedżer pakietów Cargo. Dla publikacji bibliotek wspierany jest repozytorium crates.io.
Bezpieczne zarządzanie pamięcią w Rust jest zapewnione podczas kompilacji poprzez kontrolę referencji, śledzenie własności obiektów, uwzględnianie czasu życia obiektów (zakresu widoczności) oraz ocenę prawidłowości dostępu do pamięci w czasie wykonywania kodu. Rust oferuje również narzędzia do ochrony przed przepełnieniami liczbowymi, wymaga obowiązkowej inicjalizacji wartości zmiennych przed użyciem, lepiej obsługuje błędy w standardowej bibliotece, stosuje koncepcję niemutowalności (immutable) referencji i zmiennych domyślnie oraz oferuje silne statyczne typowanie w celu minimalizacji błędów logicznych.
Główne nowości:
- Ulepszono wsparcie dla 64-bitowych systemów ARM z systemem Windows. Docelowa platforma „aarch64-pc-windows-msvc” została przeniesiona z drugiego na pierwszy poziom wsparcia. Zapewniono drugi poziom wsparcia dla architektur aarch64-pc-windows-gnullvm i x86_64-pc-windows-gnullvm. Pierwszy poziom wsparcia oznacza tworzenie binarnych zestawów, przeprowadzanie dokładnych testów i zapewnienie najwyższej gwarancji wsparcia platformy – każda zmiana w kompilatorze jest weryfikowana poprzez wykonanie pełnego zestawu testów. Drugi poziom wsparcia obejmuje tworzenie binarnych zestawów i gwarancję budowy, ale nie zapewnia przejścia zestawu testów. Trzeci poziom obejmuje podstawowe wsparcie, ale bez automatyzacji testów, publikacji oficjalnych wersji i weryfikacji możliwości kompilacji kodu.
- Dodano ostrzeżenie lint „dangling_pointers_from_locals” w celu wykrywania zwracania przez funkcje wiszących wskaźników raw (dangling raw pointer), wskazujących na dane przechowywane w zmiennych lokalnych zdefiniowanych w wywoływanej funkcji. Takie zmienne są usuwane po zakończeniu funkcji, a wskaźniki raw na związane z tymi zmiennymi dane stają się wiszące, tj. wskazują na zwolnioną pamięć. Późniejsze dereferencjonowanie takiego wskaźnika prowadzi do zachowania nieokreślonego. fn f() -> *const u8 { let x = 0; &x // ostrzeżenie: powstanie wiszący wskaźnik, ponieważ zmienna lokalna „x” zostanie usunięta }
- Dodano ostrzeżenie lint „integer_to_ptr_transmutes”, informujące o konwersji liczb całkowitych na wskaźniki za pomocą funkcji std::mem::transmute.
- W menedżerze pakietów Cargo ustabilizowano wsparcie dla parametru „build.build-dir”, określającego katalog do przechowywania tymczasowych artefaktów budowy, tworzonych przez cargo i rustc w trakcie budowy.
- Dla ABI sysv64, win64, efiapi i aapcs stabilizowano wsparcie dla deklaracji funkcji z zmienną liczbą argumentów w stylu C.
- Stabilizowano wsparcie dla inline-assembly dla architektury LoongArch32.
- Nowa porcja API została wprowadzona do stabilnej wersji, w tym ustabilizowane metody i implementacje traitów:
- Path::file_prefix
- AtomicPtr::fetch_ptr_add
- AtomicPtr::fetch_ptr_sub
- AtomicPtr::fetch_byte_add
- AtomicPtr::fetch_byte_sub
- AtomicPtr::fetch_or
- AtomicPtr::fetch_and
- AtomicPtr::fetch_xor
- {integer}::strict_add
- {integer}::strict_sub
- {integer}::strict_mul
- {integer}::strict_div
- {integer}::strict_div_euclid
- {integer}::strict_rem
- {integer}::strict_rem_euclid
- {integer}::strict_neg
- {integer}::strict_shl
- {integer}::strict_shr
- {integer}::strict_pow
- i{N}::strict_add_unsigned
- i{N}::strict_sub_unsigned
- i{N}::strict_abs
- u{N}::strict_add_signed
- u{N}::strict_sub_signed
- PanicHookInfo::payload_as_str
- core::iter::chain
- u{N}::checked_signed_diff
- core::array::repeat
- PathBuf::add_extension
- PathBuf::with_added_extension
- Duration::from_mins
- Duration::from_hours
- impl PartialEq<str> for PathBuf
- impl PartialEq<String> for PathBuf
- impl PartialEq<str> for Path
- impl PartialEq<String> for Path
- impl PartialEq<PathBuf> for String
- impl PartialEq<Path> for String
- impl PartialEq<PathBuf> for str
- impl PartialEq<Path> for str
- Ipv4Addr::from_octets
- Ipv6Addr::from_octets
- Ipv6Addr::from_segments
- impl<T> Default for Pin<Box<T>> where Box<T>: Default, T: ?Sized
- impl<T> Default for Pin<Rc<T>> where Rc<T>: Default, T: ?Sized
- impl<T> Default for Pin<Arc<T>> where Arc<T>: Default, T: ?Sized
- Cell::as_array_of_cells
- u{N}::carrying_add
- u{N}::borrowing_sub
- u{N}::carrying_mul
- u{N}::carrying_mul_add
- BTreeMap::extract_if
- BTreeSet::extract_if
- impl Debug for windows::ffi::EncodeWide<‘_>
- str::ceil_char_boundary
- str::floor_char_boundary
- impl Sum for Saturating<u{N}>
- impl Sum<&Self> for Saturating<u{N}>
- impl Product for Saturating<u{N}>
- impl Product<&Self> for Saturating<u{N}>
- Wskaźnik „const” zastosowany w funkcjach:
- <[T; N]>::each_ref
- <[T; N]>::each_mut
- OsString::new
- PathBuf::new
- TypeId::of
- ptr::with_exposed_provenance
- ptr::with_exposed_provenance_mut
- Komputer został zaktualizowany do gałęzi LLVM 21.
Źródło: opennet.ru
