Wydanie Rust 1.93. Projekty Rex, Fjall 3 i Arti 1.9.0

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

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster