Opublikowano wersję języka programowania ogólnego przeznaczenia Rust 1.88, który został zainicjowany przez projekt 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 narzędzia do osiągania wysokiego poziomu równoległości wykonywania zadań, jednocześnie omijając użycie zbieracza śmieci i runtime (runtime ogranicza się do podstawowej inicjalizacji i obsługi 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ść wskazywania wielu wyrażeń „let” wewnątrz bloków warunkowych „if” i „while” przy użyciu operatora „&&” (logiczne AND). Wyrażenia „let” można łączyć z wyrażeniami warunkowymi typu boolean. Zmienne zadeklarowane w wyrażeniach let mogą być używane w późniejszych wyrażeniach warunkowych oraz wewnątrz bloków „if” i „while”. if let Channel::Stable(v) = release_info() && let Semver { major, minor, .. } = v && major == 1 && minor == 88 {
- Dodano wsparcie dla pisania „nagich” funkcji, oznaczanych atrybutem „#[unsafe(naked)]” i zawierających tylko jeden wywołanie „naked_asm!”. Funkcje stworzone w ten sposób nie mają epilogu i prologu generowanych przez kompilator, co pozwala programiście na pełną kontrolę nad assemberowym kodem pomocniczym dołączanym do funkcji („naga” funkcja zawiera wyłącznie instrukcje assemblera podane przez programistę i nie obejmuje specjalnych procedur obsługi argumentów i wartości zwracanych dodawanych przez kompilator). „Nagie” funkcje są postrzegane jako bardziej wygodna alternatywa dla funkcji definiowanych w bloku „global_asm!”. #[unsafe(naked)] pub unsafe extern „sysv64” fn wrapping_add(a: u64, b: u64) -> u64 { core::arch::naked_asm!( „add rax, rdi, rsi”, „ret” ); }
- Do języka predykatów, stosowanego w atrybutach kompilacji warunkowej „cfg” i „cfg_attr” (pozwalających na włączanie lub wyłączanie części kodu w zależności od zadanych warunków), dodano wsparcie dla literałów boolean „true” i „false”, które są utożsamiane z konfiguracjami, które są zawsze włączone lub zawsze wyłączone. Literały te mogą być również używane w makrze „cfg!” oraz w tabelach „[target]” w manifestach i konfiguracjach dla Cargo. Wyrażenia cfg(true) i cfg(false) mogą być stosowane zamiast cfg(all()) i cfg(any()) dla bardziej wyraźnego wyrażenia swoich intencji.
- W menedżerze pakietów Cargo włączono automatyczne uruchamianie zbieracza śmieci w celu czyszczenia pamięci podręcznej w domowym katalogu użytkownika. Wcześniej przechowywane w pamięci podręcznej pakiety z pobieranymi zależnościami nie były czyszczone, co prowadziło do stałego wzrostu zużycia przestrzeni dyskowej. Włączony mechanizm zbierania śmieci automatycznie usunie pobrane zewnętrznie pliki crate, do których nie było odwołań przez ponad 3 miesiące, oraz lokalnie zainstalowane pliki crate, do których nie odwoływano się przez ponad miesiąc. Czyszczenie pamięci podręcznej nie jest uruchamiane przy użyciu w crage opcji „—offline” lub „—frozen”.
- Nowa porcja API została wprowadzona do stabilnej wersji, w tym ustabilizowane metody i implementacje traitów:
- Cell::update
- impl Default for *const T
- impl Default for *mut T
- mod ffi::c_str
- HashMap::extract_if
- HashSet::extract_if
- hint::select_unpredictable
- proc_macro::Span::line
- proc_macro::Span::column
- proc_macro::Span::start
- proc_macro::Span::end
- proc_macro::Span::file
- proc_macro::Span::local_file
- ::as_chunks
- ::as_rchunks
- ::as_chunks_unchecked
- ::as_chunks_mut
- ::as_rchunks_mut
- ::as_chunks_unchecked_mut
- Wskaźnik „const” zastosowany w funkcjach:
- NonNull::replace
- ::replace
- std::ptr::swap_nonoverlapping
- Cell::replace
- Cell::get
- Cell::get_mut
- Cell::from_mut
- Cell::as_slice_of_cells
- Usunięto pierwszy poziom wsparcia dla docelowej platformy i686-pc-windows-gnu.
Dodatkowo można zaznaczyć związane z Rust wydarzenia:
- Projekt Munal OS rozwija eksperymentalny system operacyjny napisany w Rust i oparty na koncepcji unikernel. W Munal OS nie stosuje się współbieżności wymuszającej, mapowania stron pamięci ani wirtualnej przestrzeni adresowej (używana jest struktura pamięci od UEFI). Jądro i aplikacje działają w tej samej przestrzeni adresowej z zastosowaniem modelu bezpieczeństwa opartego na izolacji sandbox WASM (w skład wchodzi silnik wasmi do uruchamiania aplikacji w postaci bajtów WebAssembly).
System operacyjny jest wyposażony w graficzny interfejs i obsługuje sterowanie za pomocą klawiatury oraz myszy. Do tworzenia aplikacji graficznych używany jest własny zestaw narzędzi z biblioteką widżetów. Do komunikacji sieciowej dostępne są stos TCP oraz sterownik urządzenia sieciowego. Wśród dostępnych aplikacji dla Munal OS znajdują się: przeglądarka internetowa z podstawowym wsparciem dla HTML i HTTPS, edytor tekstu oraz terminal do wykonywania kodu w Pythonie. Kod jest otwarty na licencji MIT.

- Wydano jądro Asterinas 0.15.2, napisane w Rust, które zapewnia ABI zgodne z jądrem Linux. Jądro obsługuje architektury x86-64 i RISC-V, implementując 206 z 368 wywołań systemowych Linux. W rozwój jądra zaangażowanych jest 45 programistów, głównie z różnych chińskich uniwersytetów. Jądro zbudowano przy użyciu architektury „framekernel”, w której komponenty jądra umieszczone są w wspólnej przestrzeni adresowej, a bezpieczeństwo osiągane jest poprzez logiczne oddzielenie bezpiecznego kodu od kodu, w którym mogą wystąpić problemy z bezpieczeństwem. Wszystkie wywołania systemowe, systemy plików i sterowniki są realizowane na poziomie OS Services i nie mogą zawierać bloków unsafe. Kod jest rozpowszechniany na licencji MPL 2.0.
- Dla jądra Linux przygotowano narzędzie rsched, które pozwala analizować statystyki pracy planistki zadań. W praktyce narzędzie to umożliwia ocenę decyzji planisty dotyczących przydziału zasobów procesom, a także śledzenie opóźnień w planowaniu. Do zbierania danych w jądrze używana jest podsystem BPF, a narzędzie działające w przestrzeni użytkownika jest napisane w Rust. Autorem narzędzia jest Chris Mason, twórca i główny architekt systemu plików Btrfs.
- Firma Collabora ogłosiła rozwój wersji narzędzia Coccinelle dla języka Rust. Coccinelle pierwotnie zaprojektowane jest do automatyzacji wyszukiwania i przekształcania kodu w języku C w jądrze Linux. Przekształcenia definiowane są w formie reguł przypominających abstrakcyjne łatki, niezwiązane z konkretną pozycją w kodzie.
- Programiści GNOME zaprezentowali bibliotekę do ładowania obrazów glycin, napisaną w języku Rust, która zapewnia dekodowanie obrazów z zastosowaniem izolacji sandbox. Wspierana jest zrzut dekodowanej treści przez gdk::Textures oraz wyciąganie metadanych. Udostępniane są opakowania dla użycia glycin w GTK4, a także backend do wykorzystania glycin w bibliotece GdkPixbuf, stosowanej w GNOME do ładowania obrazów. Glycin jest już używany w przeglądarce zdjęć Loupe, oferowanej w GNOME domyślnie. Przy tym backend do GdkPixbuf umożliwia użycie glycin w GNOME Shell, generatorach miniaturek i dowolnych aplikacjach GNOME, bez wprowadzania zmian w tych programach.
Źródło: opennet.ru

