Opublikowana została wersja 1.93 języka programowania Rust, rozwijanego przez niezależną organizację Rust Foundation, dawniej projekt Mozilla. Język koncentruje się na bezpiecznym zarządzaniu pamięcią i oferuje narzędzia do osiągania wysokiego poziomu równoległości, działając przy tym bez użycia garbage collector 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:
- Standardowa biblioteka C Musl, wbudowana w dostawę Rust, wykorzystywana przy statycznej kompozycji dla platform docelowych „*-linux-musl” (aarch64-unknown-linux-musl, x86_64-unknown-linux-musl, powerpc64le-unknown-linux-musl itp.) na systemach bez Musl, została zaktualizowana do wersji 1.2.5. Minimalnie wspierana wersja Musl przy dynamicznej kompozycji również została podniesiona do wydania 1.2.5. Wcześniej w Rust używana była wersja Musl 1.2.3, która miała problemy z implementacją DNS-resolvera. W wersji Musl 1.2.4 dodano do DNS-resolvera możliwość wysyłania zapytań przez TCP w przypadku nieudanych połączeń przez UDP, co rozwiązało problem z zapytaniami dużych rekordów DNS i przywróciło zgodność z rekurencyjnymi serwerami DNS, które nie obsługiwały częściowego zwracania wyników w obciętych odpowiedziach UDP. W wersji Musl 1.2.5 w DNS-resolverze zrealizowano obsługę odpowiedzi z długimi sekwencjami CNAME oraz rozwiązano problem, z powodu którego odrzucano niektóre duże odpowiedzi przesyłane przez TCP.
- Standardowa biblioteka została przeprojektowana w celu rozwiązania problemów z reenterowalnością w kontekście globalnych alokatorów pamięci napisanych w Rust, makra std::thread_local! oraz funkcji std::thread::current, które prowadziły do nieskończonej rekurencji. Aby wykluczyć sytuację, w której std::thread_local! i std::thread::current podczas alokacji pamięci wywoływały ten sam alokator, w którym były używane, zastosowano bezpośrednio systemowy mechanizm alokacji pamięci.
- W obrębie bloków „asm!” z kodem asemblerowym zezwolono na użycie atrybutów „cfg”, co na przykład pozwala zarządzać włączaniem rozszerzonych zestawów instrukcji CPU w kontekście pojedynczych wyrażeń w obrębie bloku asm (wcześniej atrybuty „cfg” można było ustalać tylko dla całego bloku asm). asm!( // lub global_asm! lub naked_asm! "nop", #[cfg(target_feature = "sse2")] "nop", // … #[cfg(target_feature = "sse2")] a = const 123, // używane tylko na sse2 );
- Nowa porcja API została wprowadzona do stabilnej wersji, w tym ustabilizowane metody i implementacje traitów:
- <[MaybeUninit]>::assume_init_drop
- <[MaybeUninit]>::assume_init_ref
- <[MaybeUninit]>::assume_init_mut
- <[MaybeUninit]>::write_copy_of_slice
- <[MaybeUninit]>::write_clone_of_slice
- String::into_raw_parts
- Vec::into_raw_parts
- ::unchecked_neg
- ::unchecked_shl
- ::unchecked_shr
- ::unchecked_shl
- ::unchecked_shr
- ::as_array
- ::as_array_mut
- ::as_array
- ::as_mut_array
- VecDeque::pop_front_if
- VecDeque::pop_back_if
- Duration::from_nanos_u128
- char::MAX_LEN_UTF8
- char::MAX_LEN_UTF16
- Platforma docelowa «riscv64a23-unknown-linux-gnu» została przeniesiona na drugi poziom wsparcia, który oznacza gwarancję kompilacji, ale brak gwarancji podczas przechodzenia zestawu testów.
- Dodatkowo można wyróżnić kilka projektów związanych z Rust:
- Dla jądra Linux rozwijany jest framework Rex, który umożliwia tworzenie rozszerzeń dla jądra Linux w języku Rust, które można wykorzystać do rozszerzenia funkcjonalności jądra zamiast eBPF. Rex oferuje te same gwarancje bezpieczeństwa co eBPF, ale używa możliwości języka Rust oraz lekkiego Runtime dla izolacji i zapewnienia bezpieczeństwa. Dla takich programów nie stosuje się weryfikatora, a programy są kompilowane do kodu natywnego przez kompilator Rust.
W programach Rex dopuszcza się użycie podzbioru języka Rust, który zapewnia gwarancje bezpieczeństwa. W aktualnym stanie wspieranych jest 5 typów programów eBPF: kprobe, perf_event, tracepoint, xdp i tc. Istnieje możliwość wywoływania funkcji pomocniczych eBPF, interakcji z mapami eBPF, zarządzania zasobami jądra, obsługi wyjątków oraz wykorzystywania opakowań i abstrakcji nad strukturami jądra.
- Dostępna jest wersja Fjall 3, napisanego w Rust wbudowanego magazynu, który działa na danych w formacie klucz-wartość. Przechowywanie danych odbywa się w formie logu z użyciem drzewa LSM (Log-Structured-Merge), jak w RocksDB, gdzie zmiany są zapisywane poprzez dodawanie danych na końcu pliku. Dla dostępu do bazy danych oferowane jest API w stylu BTreeMap. Umożliwia to takie funkcje jak przestrzenie nazw, bezpośrednie i odwrotne wyszukiwanie w zakresie, wbudowane kompresje, serializowalne transakcje, oddzielne przechowywanie kluczy i powiązanych z nimi bardzo dużych wartości, automatyczne zarządzanie bazą danych w tle. Kod jest otwarty na licencji Apache 2.0.
W programach Rex dopuszcza się użycie podzbioru języka Rust, który zapewnia gwarancje bezpieczeństwa. W bieżącej wersji obsługiwanych jest 5 typów programów eBPF: kprobe, perf_event, tracepoint, xdp i tc. Istnieje możliwość wywoływania funkcji pomocniczych eBPF, interakcji ze strukturami map eBPF, zarządzania zasobami jądra, obsługi wyjątków oraz korzystania z opakowań i abstrakcji nad strukturami jądra.
- Dostępna jest wersja Fjall 3, opracowanego w Rustie, wbudowanego magazynu danych, który działa z danymi w formacie klucz-wartość. Przechowywanie danych odbywa się w postaci logu z wykorzystaniem drzewa LSM (Log-Structured-Merge), jak w RocksDB, gdzie zmiany są zapisywane przez dodawanie danych na końcu pliku. Do interakcji z bazą danych oferowane jest API w stylu BTreeMap. Obsługiwane są takie funkcje, jak przestrzenie nazw, bezpośrednie i odwrotne przeszukiwanie w zakresie, wbudowana kompresja, serializowalne transakcje, oddzielne przechowywanie kluczy i powiązanych z nimi bardzo dużych wartości, oraz automatyczna konserwacja bazy danych w tle. Kod jest open source na licencji Apache 2.0.
- Projekt Tor opublikował wersję Arti 1.9.0, realizację zestawu narzędzi Tor, napisaną w języku Rust. Gdy kod Arti osiągnie poziom, który umożliwi pełne zastąpienie wersji w C, deweloperzy Tor zamierzają nadać Arti status głównej implementacji Tor i stopniowo zakończyć wsparcie dla wersji w C. W nowej wersji kontynuowano realizację funkcji dla węzłów oraz serwerów autorytetów katalogów (Directory Authority), poprawiono wsparcie dla dynamicznie przydzielanych portów (proxy.socks_listen = „auto”), dodano eksperymentalne API do zarządzania kluczami dla usług onion.
Źródło: opennet.ru
