Wydanie języka programowania Rust 1.64

Opublikowano wydanie języka programowania ogólnego przeznaczenia Rust 1.64, stworzonego w ramach projektu Mozilla, ale obecnie rozwijanego pod auspicjami niezależnej organizacji non-profit Rust Foundation. Język koncentruje się na bezpieczeństwie pamięci i zapewnia środki do osiągnięcia wysokiej równoległości zadań przy jednoczesnym uniknięciu korzystania z modułu wyrzucania elementów bezużytecznych i środowiska uruchomieniowego (czas działania jest ograniczony do podstawowej inicjalizacji i konserwacji standardowej biblioteki).

Metody obsługi pamięci Rust chronią programistę przed błędami podczas manipulowania wskaźnikami i chronią przed problemami wynikającymi z obsługi pamięci niskiego poziomu, takimi jak dostęp do obszaru pamięci po jego zwolnieniu, dereferencja pustych wskaźników, przepełnienie bufora itp. Aby dystrybuować biblioteki, dostarczać kompilacje i zarządzać zależnościami, projekt rozwija menedżera pakietów Cargo. Repozytorium crates.io jest obsługiwane w przypadku bibliotek hostingowych.

Bezpieczeństwo pamięci w Rust jest zapewnione w czasie kompilacji poprzez sprawdzanie referencji, śledzenie własności obiektów, śledzenie czasu życia obiektów (zakresów) i ocenę poprawności dostępu do pamięci podczas wykonywania kodu. Rust zapewnia również ochronę przed przepełnieniami liczb całkowitych, wymaga obowiązkowej inicjalizacji wartości zmiennych przed użyciem, lepiej radzi sobie z błędami w standardowej bibliotece, domyślnie stosuje koncepcję niezmiennych odniesień i zmiennych, oferuje silne typowanie statyczne w celu zminimalizowania błędów logicznych.

Główne innowacje:

  • Zwiększono wymagania dla środowiska Linux w kompilatorze, menedżerze pakietów Cargo i standardowej bibliotece libstd - podwyższono minimalne wymagania dla Glibc z wersji 2.11 do 2.17, a jądra Linuksa z wersji 2.6.32 do 3.2. Ograniczenia dotyczą również plików wykonywalnych aplikacji Rust zbudowanych przy użyciu biblioteki libstd. Zestawy dystrybucyjne RHEL 7, SLES 12-SP5, Debian 8 i Ubuntu 14.04 spełniają nowe wymagania. Wsparcie dla RHEL 6, SLES 11-SP4, Debian 7 i Ubuntu 12.04 zostanie zakończone. Użytkowników, którzy używają plików wykonywalnych zbudowanych w Rust w środowiskach ze starszym jądrem Linuksa, zachęca się do aktualizacji swoich systemów, pozostania przy starszych wersjach kompilatora lub utrzymywania własnego rozwidlenia libstd z warstwami w celu zachowania kompatybilności.

    Jednym z powodów zakończenia wsparcia dla starszych systemów Linux są ograniczone zasoby niezbędne do dalszego utrzymywania kompatybilności ze starszymi środowiskami. Obsługa starszego Glibc wymaga użycia starszych narzędzi podczas sprawdzania systemu ciągłej integracji, w obliczu rosnących wymagań dotyczących wersji w LLVM i narzędziach do kompilacji krzyżowej. Wzrost wymagań dotyczących wersji jądra wynika z możliwości wykorzystania nowych wywołań systemowych w libstd bez konieczności utrzymywania warstw w celu zapewnienia kompatybilności ze starszymi jądrami.

  • Ustabilizowano cechę IntoFuture, która przypomina IntoIterator, jednak różni się od tego ostatniego wykorzystaniem pętli „.await” zamiast „for… in…”. W połączeniu z IntoFuture słowo kluczowe „.await” może oczekiwać nie tylko cechy Future, ale także innych typów, które można przekształcić w Future.
  • Narzędzie do analizowania rdzy znajduje się w zestawie narzędzi dostarczanych z wydaniami Rust. Narzędzie jest również dostępne do instalacji przy użyciu rustup (komponent rustup dodaje analizator rdzy).
  • Menedżer pakietów Cargo zawiera dziedziczenie obszaru roboczego, aby wyeliminować duplikację wspólnych wartości pól pomiędzy pakietami, takich jak wersje Rusta i adresy URL repozytoriów. Dodano także obsługę budowania dla kilku platform docelowych jednocześnie (możesz teraz określić więcej niż jeden parametr w opcji „--target”).
  • Nowa część API została przeniesiona do kategorii stabilnej, w tym metody i implementacje cech zostały ustabilizowane:
    • przyszłość::W przyszłość
    • num::NonZero*::checked_mul
    • num::NonZero*::checked_pow
    • num::NonZero*::saturating_mul
    • num::NonZero*::saturating_pow
    • num::NonZeroI*::abs
    • num::NonZeroI*::checked_abs
    • num::NonZeroI*::overflowing_abs
    • num::NonZeroI*::saturating_abs
    • num::NonZeroI*::unsigned_abs
    • num::NonZeroI*::wrapping_abs
    • num::NonZeroU*::checked_add
    • num::NonZeroU*::checked_next_power_of_two
    • num::NonZeroU*::saturating_add
    • os::unix::process::CommandExt::process_group
    • os::windows::fs::FileTypeExt::is_symlink_dir
    • os::windows::fs::FileTypeExt::is_symlink_file
  • Do rdzenia i biblioteki alloc dodano typy kompatybilne z C, wcześniej ustabilizowane w module std::ffi:
    • rdzeń::ffi::CStr
    • core::ffi::FromBytesWithNulError
    • alloc::ffi::CString
    • alloc::ffi::FromVecWithNulError
    • alloc::ffi::IntoStringError
    • alloc::ffi::NulError
  • Typy C ustabilizowane wcześniej w module std::os::raw zostały dodane do modułów core::ffi i std::ffi (na przykład typy c_uint i c_ulong zostały zaproponowane dla typów C uint i ulong):
    • ffi::c_char
    • ffi::c_double
    • ffi::c_float
    • ffi::c_int
    • ffi::c_long
    • ffi::c_longlong
    • ffi::c_schar
    • ffi::c_short
    • ffi::c_uchar
    • ffi::c_uint
    • ffi::c_ulong
    • ffi::c_ulonglong
    • ffi::c_ushort
  • Ustabilizowano procedury obsługi niskiego poziomu do współpracy z mechanizmem Poll (w przyszłości planowane jest udostępnienie uproszczonego API, które nie wymaga stosowania struktur niskiego poziomu typu Pull i Pin):

    • przyszłość::poll_fn
    • zadanie::gotowe!
  • Atrybut „const”, który określa możliwość użycia go w dowolnym kontekście zamiast stałych, wykorzystywany jest w funkcji plasterek::from_raw_parts.
  • W celu bardziej kompaktowego przechowywania danych zmieniono układ pamięci struktur Ipv4Addr, Ipv6Addr, SocketAddrV4 i SocketAddrV6. Może występować problem ze zgodnością z pakietami z pojedynczą skrzynią, które używają std::mem::transmute do manipulacji strukturami na niskim poziomie.
  • W kompilacji kompilatora rdzy na platformę Windows zastosowano optymalizacje PGO (optymalizacja profilami), co pozwoliło zwiększyć wydajność kompilacji kodu o 10-20%.
  • Kompilator zaimplementował nowe ostrzeżenie o nieużywanych polach w niektórych strukturach.

Dodatkowo można zwrócić uwagę na raport stanu dotyczący rozwoju alternatywnej implementacji kompilatora języka Rust, przygotowany przez projekt gccrs (GCC Rust) i zatwierdzony do włączenia do GCC. Po zintegrowaniu frontendu, standardowe narzędzia GCC można wykorzystać do kompilowania programów w języku Rust bez konieczności instalowania kompilatora rustc, zbudowanego przy użyciu rozwiązań LLVM. Tak długo jak rozwój oprogramowania będzie przebiegał prawidłowo i o ile nie pojawią się nieprzewidziane problemy, interfejs Rust zostanie zintegrowany z wersją GCC 13 zaplanowaną na maj przyszłego roku. Implementacja Rusta w GCC 13 będzie w fazie beta i nie jest jeszcze domyślnie włączona.

Źródło: opennet.ru

Dodaj komentarz