Opublikowano wersję 1.84 ogólnodostępnego języka programowania Rust, który powstał dzięki projektowi Mozilla, a obecnie rozwijany jest pod patronatem niezależnej organizacji non-profit Rust Foundation. Język koncentruje się na bezpiecznym zarządzaniu pamięcią i oferuje środki do osiągania wysokiego poziomu równoległości w wykonywaniu zadań, jednocześnie nie wykorzystując zbieracza śmieci ani runtime'u (runtime ogranicza się do podstawowej inicjalizacji i utrzymania 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:
- W menedżerze pakietów Cargo ustabilizowano mechanizm obsługi zależności, który wybiera wersje komponentów pomocniczych z uwzględnieniem ich zgodności z wersjami kompilatora Rust, uznawanymi za minimalnie obsługiwane przez projekt (MSRV, Minimalnie Obsługiwana Wersja Rust). Nowa funkcjonalność pozwala deweloperom na uniknięcie ręcznego wybierania starszych wersji każdej zależności w projektach, które mają być zgodne ze starszymi wersjami narzędzi Rust. Nowy tryb określania zależności zostanie aktywowany domyślnie w wersji Rust 1.85, a na razie dostępny jest w formie opcji, którą można włączyć w sekcji '[resolver]' w pliku '.cargo/config.toml', podając 'incompatible-rust-versions = "fallback"'.
- Rozpoczęto prace nad kompilatorem, który korzysta z nowego rozwiązania dla typów (trait solver), przeznaczonego do sprawdzania granic zastosowania typów, normalizacji typów i oceniania ich zgodności. W wersji 1.84 nowy mechanizm jest wykorzystywany do weryfikacji spójności implementacji typów, tj. oceny istnienia nie więcej niż jednego typu dla rozpatrywanego przypadku, uwzględniając kod z innych paczek crate. Wspomniane sprawdzenie pozwoliło na wyeliminowanie problemów w starej implementacji, które mogły prowadzić do konfliktów z powodu kolizji różnych implementacji typów.
- Wprowadzono nowe API „Strict Provenance”, które można wykorzystać do rzutowania wskaźnika na liczbę całkowitą i z powrotem, z uwzględnieniem dołączonych do wskaźnika metadanych zawierających informacje o jego pochodzeniu i zakresie użycia (oprócz adresu do wskaźnika dołączona jest wartość „provenance” z informacjami o relacjach z innymi wskaźnikami, co pozwala ustalić, gdzie i kiedy wskaźnik może uzyskiwać dostęp do pamięci). Rzutowanie wskaźnika na liczbę całkowitą i z powrotem powoduje nieokreślone zachowanie z powodu trudności w śledzeniu pochodzenia wynikowego wskaźnika. Nowe API umożliwia przeprowadzanie operacji na niskim poziomie z wskaźnikami, takich jak przechowywanie dodatkowych informacji w niższych bitach wskaźnika, bez rzutowania wskaźnika na liczbę całkowitą.
- Nowa porcja API została wprowadzona do stabilnej wersji, w tym ustabilizowane metody i implementacje traitów:
- Ipv6Addr::is_unique_local
- Ipv6Addr::is_unicast_link_local
- core::ptr::with_exposed_provenance
- core::ptr::with_exposed_provenance_mut
- ::addr
- ::expose_provenance
- ::with_addr
- ::map_addr
- ::isqrt
- ::checked_isqrt
- ::isqrt
- NonZero::isqrt
- core::ptr::without_provenance
- core::ptr::without_provenance_mut
- core::ptr::dangling
- core::ptr::dangling_mut
- Pin::as_deref_mut
- Wskaźnik „const” zastosowany w funkcjach:
- AtomicBool::from_ptr
- AtomicPtr::from_ptr
- AtomicU8::from_ptr
- AtomicU16::from_ptr
- AtomicU32::from_ptr
- AtomicU64::from_ptr
- AtomicUsize::from_ptr
- AtomicI8::from_ptr
- AtomicI16::from_ptr
- AtomicI32::from_ptr
- AtomicI64::from_ptr
- AtomicIsize::from_ptr
- ::is_null
- ::as_ref
- ::as_mut
- Pin::new
- Pin::new_unchecked
- Pin::get_ref
- Pin::into_ref
- Pin::get_mut
- Pin::get_unchecked_mut
- Pin::static_ref
- Pin::static_mut
- Zaimplementowano wsparcie dla osadzania assemblerowych inline dla architektur s390x i Arm64EC.
- Dla docelowej platformy WebAssembly zaimplementowano wsparcie dla funkcjonalności multivalue, reference-types i tail-call.
- Wprowadzono drugi poziom wsparcia dla platformy wasm32v1-none. Drugi poziom wsparcia oznacza gwarancję kompilacji.
Dodatkowo można odnotować kilka projektów związanych z Rust:
- Opublikowano wydanie systemu operacyjnego Tock 2.2, napisanego w języku Rust i przeznaczonego do użytku w mikrokontrolerach. System umożliwia równoległe wykonywanie kilku niezweryfikowanych aplikacji na wbudowanych urządzeniach o ograniczonej pamięci RAM, takich jak czujniki, TPM (Trusted Platform Module), piloty do autoryzacji i urządzenia noszone. Wspierane są platformy z mikrokontrolerami opartymi na architekturach ARM Cortex-M i RISC-V. Kluczową cechą Tock jest izolacja poziomów aplikacji, jądra i warstwy sterowników, a także izolacja każdego pojedynczego aplikacji i sterownika. Do izolacji wykorzystywane są zarówno możliwości języka Rust, jak i podział na poziomie ochrony pamięci.
- Projekt VEKOS (Verified Experimental Kernel OS) rozwija jądro systemu operacyjnego w języku Rust, zapewniając weryfikację wykonywanych komponentów. Przy każdej operacji na systemie plików, tworzeniu procesu i alokacji pamięci generowane jest kryptograficzne potwierdzenie, które pozwala weryfikować operację w czasie rzeczywistym (realizacja porównywana jest z zastosowaniem technologii blockchain do weryfikacji działań w systemie operacyjnym). W systemie plików VKFS, w celu zapewnienia integralności i ochrony przed modyfikacjami wstecznymi, używana jest struktura „drzewo Merkle” (Merkle Tree), w której każda gałąź weryfikuje wszystkie podległe gałęzie i węzły dzięki drzewiastej funkcji skrótu. Alokacja pamięci odbywa się w trybie COW (Copy-On-Write).
- Grupa badaczy z Microsoft i Inria rozwija podzbiór języka C — Mini-C, przeznaczony do automatycznej translacji programów napisanych w języku C do reprezentacji w języku Rust. W przeciwieństwie do kompilatora c2rust, nowy projekt pozwala na generowanie kodu Rust bez użycia unsafe, ale głównie koncentruje się na przekształceniu projektów C, które mają formalne dowody niezawodności. Zakłada się, że łatwiej będzie początkowo przetłumaczyć projekt C do reprezentacji w Mini-C, gdzie operacje arytmetyczne na wskaźnikach są zabronione, niż przepisywać bloki unsafe po bezpośredniej kompilacji z C do Rust.
Realizacja kompilatora opiera się na narzędziach KaRaMeL. Mini-C został opracowany i przetestowany w ramach projektu przepisania na Rust biblioteki kryptograficznej HACL*, dla której została dostarczona formalna gwarancja niezawodności. Takie dowody zostały wykorzystane do wykazania, że Mini-C może generować bezpieczny kod w Rust.
- Daniel Stenberg, autor narzędzia curl, ogłosił zakończenie prac nad projektem Curl, alternatywnym backendem HTTP napisanym w Rust przy użyciu biblioteki Hyper. Powodem jest brak zainteresowania ze strony deweloperów i użytkowników.
- Ogłoszono beta-wydanie powłoki poleceń Fish 4.0, przepisanej w języku Rust. Zauważono, że po dwóch latach rozwoju baza kodu Fish została całkowicie przeniesiona z C++ na Rust. Przejście na Rust pozwoliło rozwiązać problemy związane z wielowątkowością, uzyskać nowoczesne narzędzia do wykrywania błędów na etapie kompilacji, zwiększyć bezpieczeństwo pracy z pamięcią i uczynić projekt bardziej atrakcyjnym dla nowych deweloperów.
- Projekt Tor opublikował wersję Arti 1.3.2, alternatywnej implementacji klienta Tor w języku Rust. Arti oferuje wbudowaną bibliotekę, z której mogą korzystać różne aplikacje. Podczas tworzenia Arti uwzględniono wcześniejsze doświadczenia z rozwoju Tor, aby uniknąć znanych problemów architektonicznych, uczynić projekt bardziej modułowym i efektywnym. Wersja 1.x została oznaczona jako odpowiednia do użytku przez zwykłych użytkowników, zapewniając ten sam poziom prywatności, użyteczności i stabilności co główna implementacja w języku C. W nowej wersji kontynuowano rozwój RPC, przygotowano wsparcie dla relacji i dodano ochronę przed atakami DoS na usługi Onion.
- Opublikowano wydanie silnika gier Bevy 0.15, napisanego w Rust. W silniku zastosowano datacenter-driven (Data Driven) model określania logiki gry, oparty na zestawie gotowych komponentów Bevy ECS (Entity Component System), które mogą działać równolegle. Obsługiwane jest renderowanie 2D i 3D, animacja szkieletowa, określanie grafu renderowania, system tworzenia scen, framework do budowania interfejsu użytkownika oraz wprowadzanie zmian w scenach i zasobach bez konieczności ponownego uruchamiania.
- Opublikowano konsolowy edytor tekstowy Helix 25.01, napisany w Rust, rozszerzający pomysły zawarte w vim i neovim. Obsługiwane jest zintegrowanie z serwerami LSP oraz Tree-sitter, jednoczesne zaznaczanie wielu bloków, użycie wielu kursorów podczas edycji, motywy graficzne oraz protokół debugowania DAP (Debug Adapter Protocol).
- Do silnika przeglądarki Servo, napisanego w Rust, dodano wsparcie dla trybu ciemnego. Rozmiar przeglądarki ServoShell został zmniejszony o 20%. Obsługa specyfikacji sieciowych została rozszerzona o możliwość logowania i czytania wiadomości w Discordzie (wysyłanie wiadomości na razie nie jest możliwe).
- Firma Mozilla zaprezentowała narzędzie Uniffi for React Native do tworzenia modułów dla React Native w języku Rust.
- Przeprowadzono testy wydajności kodowników obrazów w formacie PNG. Dekodery w Rust (png, zune-png, wuffs) okazały się szybsze od dekoderów w C (libpng, spng, stb_image). Na przykład, pakiet crate png (image-rs) przewyższył libpng 1.8 razy na systemie x86 i 1.5 razy na systemie ARM. image-rs: 375.401 MP/s (średnia) 318.632 MP/s (średnia geometryczna) zune-png: 376.649 MP/s (średnia) 302.529 MP/s (średnia geometryczna) wuffs: 376.205 MP/s (średnia) 287.181 MP/s (średnia geometryczna) libpng: 208.906 MP/s (średnia) 173.034 MP/s (średnia geometryczna) spng: 299.515 MP/s (średnia) 235.495 MP/s (średnia geometryczna) stb_image: 234.353 MP/s (średnia) 171.505 MP/s (średnia geometryczna)
Źródło: opennet.ru
