Opublikowano wydanie języka programowania Rust 1.89, początkowo stworzonego przez projekt Mozilla, a obecnie rozwijanego pod patronatem niezależnej organizacji non-profit Rust Foundation. Język koncentruje się na bezpiecznym zarządzaniu pamięcią i dostarcza narzędzi do osiągania wysokiego równoległego wykonania zadań, przy tym omijając użycie zbieracza śmieci oraz runtime (runtime ogranicza się do podstawowej inicjalizacji i wsparcia 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:
- Dodano możliwość używania symbolu „_” jako argumentu parametrów ogólnych z atrybutem „const” do wyprowadzania wartości tych parametrów na podstawie kontekstu otaczającego. pub fn all_false() -> [bool; LEN] { [false; _] }
- Dodano nowe ostrzeżenie lint „mismatched_lifetime_syntaxes” w celu rozwiązania problemu niejasnego określania czasu życia w sygnaturach funkcji przy użyciu mechanizmu „lifetime elision” (automatycznie określa czas życia referencji, pozwalając na pominięcie jego ręcznego określania). Ostrzeżenie sprawdza, czy parametry wejściowe i wyjściowe funkcji należą do tej samej grupy typów. Grupy są formowane na podstawie wsparcia dla jawnego określania czasu życia oraz możliwości automatycznego wyprowadzenia czasu życia przez kompilator (na przykład w typach „&’a T” i „ContainsLifetime” może jednoznacznie występować czas życia, ale kompilator nie może automatycznie określić czasu życia, w typach „&T”, „&’_ T” i „ContainsLifetime” dopuszczalne jest zarówno jawne określenie, jak i automatyczne wyprowadzenie).
- W atrybucie „target_feature” dla systemów x86 wprowadzono możliwość sprawdzenia wsparcia dla rozszerzonych zestawów instrukcji sha512, sm3, sm4, kl oraz widekl, a także dla poszczególnych funkcji avx512. #[target_feature(enable = „avx512bw”)] pub fn cool_simd_code(/* .. */) -> /* … */ { /* … */ }
- Zapewniono uruchomienie doctest (testy wbudowane w dokumentację) nie tylko dla obecnej platformy docelowej, ale także dla innych platform określonych podczas uruchamiania menedżera pakietów „cargo” („cargo test —doc —target other_target”).
- Dla funkcji ‘extern „C”‘ podczas kompilacji dla platformy docelowej „wasm32-unknown-unknown” wprowadzono standardowy interfejs ABI C dla WebAssembly.
- Z pewnymi zastrzeżeniami dotyczącymi zgodności typów, dozwolone jest użycie typów i128 i u128 w zewnętrznych funkcjach C (extern „C”), dla których wcześniej pojawiało się ostrzeżenie lint „improper_ctypes_definitions”.
- Nowa porcja API została wprowadzona do stabilnej wersji, w tym ustabilizowane metody i implementacje traitów:
- Wiele wbudowanych w kompilator funkcji (Intrinsics) dla procesorów x86, w tym funkcje dla AVX512, SHA512, SM3 i SM4.
- NonZero
- File::lock
- File::lock_shared
- File::try_lock
- File::try_lock_shared
- File::unlock
- NonNull::from_ref
- NonNull::from_mut
- NonNull::without_provenance
- NonNull::with_exposed_provenance
- NonNull::expose_provenance
- OsString::leak
- PathBuf::leak
- Result::flatten
- std::os::linux::net::TcpStreamExt::quickack
- std::os::linux::net::TcpStreamExt::set_quickack
Wskaźnik „const” zastosowany w funkcjach:
- ::as_mut_slice
- ::eq_ignore_ascii_case
- str::eq_ignore_ascii_case
- Rozpoczęto proces przenoszenia docelowej platformy „x86_64-apple-darwin” z pierwszego poziomu wsparcia na drugi (Apple planuje zakończenie wsparcia dla architektury x86_64). Pierwszy poziom wsparcia oznacza tworzenie binarnych kompilacji, przeprowadzanie dokładnych testów oraz zapewnienie najwyższej gwarancji wsparcia dla platformy — każda zmiana w kompilatorze jest weryfikowana przez pełny zestaw testów. Drugi poziom wsparcia przewiduje gwarancję kompilacji, ale bez gwarancji przejścia zestawu testów.
- Wprowadzono trzeci poziom wsparcia dla platform „loongarch32-unknown-none” i „loongarch32-unknown-none-softfloat”. Trzeci poziom przewiduje podstawowe wsparcie, ale bez automatyzacji testów, publikacji oficjalnych kompilacji oraz weryfikacji możliwości kompilacji kodu.
Dodatkowo można wspomnieć o wydarzeniach i projektach związanych z Rust:
- Opublikowano raport o stanie pakietów w języku Rust w Debianie. Zauważono, że w gałęzi Debian Unstable (Sid) około 8% pakietów src w repozytorium main jest powiązanych z co najmniej jednym pakietem „librust-*”. W Debianie 12 takich pakietów było 4.5%. Zauważono również, że ponad 3000 pakietów zawiera kod w języku Rust, umieszczony w pakietach librust-..-dev, a 150 pakietów src dostarcza skompilowane pliki wykonywalne lub biblioteki Rust.
Wśród interesujących pakietów dla Debiana wymieniono sudo-rs, ntpd-rs, uutils, Sequoia, rpgp, hickory (DNS), Rustls, rav1d oraz fish. Opcjonalne wsparcie dla Rust zaimplementowane zostało w APT, QEMU (virtiofsd), jądrze Linux oraz Mesa, a także oczekiwane jest w LibreOffice. Do konwersji pakietów crate na pakiety src Debiana został stworzony zestaw narzędzi debcargo.
- Zaprezentowano projekt tmux-rs, rozwijający klon multiplexer'a terminala tmux (menedżera okien konsoli), przepisany z C na Rust.
- Programista sterownika Tyr z firmy Collabora opublikował artykuł na temat urządzeń działających na poziomie jądra sterowników dla GPU oraz zasad tworzenia takich sterowników w języku Rust.
- Zademonstrowano uniwersalną aplikację w języku Rust, która może działać zarówno na CPU, jak i na różnych platformach GPU: CUDA dla NVIDIA, SPIR-V dla GPU z obsługą Vulkan, Metal dla Apple, DirectX 12 dla Windows, WebGPU dla przeglądarek.
Źródło: opennet.ru
