Opublikowano wydanie języka programowania Rust 1.99, pierwotnie 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 oferuje zasoby do osiągania wysokiego poziomu równoległości w wykonywaniu zadań, działając przy tym bez potrzeby korzystania z garbage collectora oraz runtime'u (runtime ogranicza się do podstawowej inicjalizacji i utrzymywania standardowej biblioteki).
Metody zarządzania pamięcią w Rust mają na celu eliminację błędów przy manipulacji wskaźnikami oraz ochronę przed problemami wynikającymi z niskopoziomowego zarządzania pamięcią, takimi jak dostęp do pamięci po jej zwolnieniu, dereferencjonowanie wskaźników zerowych, czy przekroczenie granic bufora itd. Aby ułatwić dystrybucję bibliotek, budowanie oraz zarządzanie zależnościami, projekt rozwija menedżer pakietów Cargo. Wsparcie dla repozytoriów bibliotek zapewnia 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:
- Wprowadzono możliwość tworzenia w języku Rust funkcji z zmienną liczbą argumentów (variadic), eksportowanych do wywołań w projektach na języku C (C ABI). Jako ostatni element listy parametrów w podobnych funkcjach można wskazać konstrukcję „…”, która jest przetwarzana w Rust za pomocą specjalnego typu VaList, działającego analogicznie do va_list w C. unsafe extern «C» fn sum(mut args: …) -> i32 { let a = unsafe { args.next_arg::<i32>() }; let b = unsafe { args.next_arg::<i32>() }; a + b } fn foo() -> i32 { unsafe { sum(0i32, 2i32) } }
- Zostały ustabilizowane funkcje Layout::for_value_raw, mem::size_of_val_raw oraz mem::align_of_val_raw, które umożliwiają bezpieczne określanie rozmiaru i wyrównania przy użyciu surowych wskaźników (raw pointer), w tym przy użyciu typów o dynamicznym rozmiarze, takich jak slice, bez konieczności tworzenia referencji do danych.
- Do dokumentacji dodano rekomendację unikania zwalniania pamięci, do której uzyskano statyczną referencję o nieograniczonym czasie życia (&’static), poprzez wywołanie Box::leak (round-trip unleaking), gdyż takie działanie może potencjalnie prowadzić do problemów z powodu niekompatybilności z przyszłymi optymalizacjami kompilatora i wbudowanymi mechanizmami alokacji pamięci. Zamiast tworzenia statycznej referencji do tymczasowego przekazania własności zaleca się korzystanie z surowych wskaźników, na przykład poprzez wywołanie Box::into_non_null.
- Nowa porcja API została wprowadzona do stabilnej wersji, w tym ustabilizowane metody i implementacje traitów:
- IntoIterator dla Box<[T; N]>
- IntoIterator dla &Box<[T; N]>
- IntoIterator dla &mut Box<[T; N]>
- VecDeque::retain_back
- core::ffi::VaList
- Box::into_non_null
- Box::from_non_null
- Vec::into_parts
- Vec::from_parts
- core::mem::size_of_val_raw
- core::mem::align_of_val_raw
- core::alloc::Layout::for_value_raw
- String::from_utf8_lossy_owned
- string::FromUtf8Error::into_utf8_lossy
- FusedIterator dla StepBy<I>
- std::fs::set_times
- std::fs::set_times_nofollow
- W menedżerze pakietów cargo wprowadzono nowy wbudowany profil „debug”, analogiczny do profilu „dev” (w przyszłości planowane jest rozdzielenie funkcji debugowania i rozwoju). W przypadku kompilacji w CI, inkrementalna kompilacja jest domyślnie wyłączona.
- Docelowa platforma riscv64-unknown-linux-musl została przeniesiona na drugi poziom wsparcia, co oznacza gwarancję kompilacji, ale brak gwarancji podczas przeprowadzania zestawu testowego.
Dodatkowo można zauważyć ostatnio ogłoszone projekty i wydarzenia związane z Rust:
- Firma Microsoft przeniosła Rust do kategorii języków pierwszego poziomu i zapewni jego pełne wsparcie na wszystkich etapach rozwoju wewnątrz firmy. Do tej pory pierwszy poziom wsparcia wewnątrz firmy zapewniano dla języków C++, C# i TypeScript. Odnotowano, że Rust jest już używany w ponad 100 repozytoriach Microsoftu. Wśród innych, komponenty w Rust są już stosowane w produktach takich jak Microsoft 365 i Copilot, a dla kompilatora MSVC przygotowano osobny backend rustc_codegen_utc dla Rust, oparty na kompilatorze rustc.
Jako główny cel stosowania Rust w Microsoft wymienia się wzmocnienie bezpieczeństwa kodu, krytycznego z punktu widzenia bezpieczeństwa. Według dyrektora technicznego Microsoft Azure, około 70% wszystkich luk w zabezpieczeniach Windows jest spowodowanych problemami związanymi z pamięcią, których można uniknąć przy użyciu Rust.
- Firma Google usunęła ze jądra Linux starą implementację mechanizmu międzyprocesowego Binder, napisaną w języku C, na rzecz nowego sterownika Binder IPC, przepisane w Rust. Zauważono, że przez 15 lat istnienia starego sterownika narosło znaczną ilość długu technologicznego i komplikacji, które utrudniały wykrywanie błędów, konserwację i dodawanie nowych funkcji. Sterownik Binder IPC w Rust uznano za główny i już nie jest przedstawiany jako projekt eksperymentalny.
- Opublikowano wydanie Arti 2.7.0, implementacji narzędzi Tor, napisanej w języku Rust. Gdy kod Arti osiągnie poziom zdolny do całkowitego zastąpienia wersji w C, deweloperzy Tor zamierzają nadać Arti status głównej implementacji Tor i stopniowo zaprzestać wspierania wersji w C. W nowej wersji wprowadzono rozwój funkcji dla relayów i serwerów katalog (Directory Authority), związany z analizą dokumentów, wsparciem dla mirrorów serwerów katalogów oraz przetwarzaniem ruchu DNS. Dodano implementację RPC do zmiany i weryfikacji konfiguracji. Usunięto kilka luk w zabezpieczeniach — administratorzy usług onion są pilnie proszeni o zaktualizowanie swoich systemów.
Źródło: opennet.ru
