Wydanie języka programowania Rust 1.59 z obsługą wkładek montażowych

Opublikowano wydanie języka programowania ogólnego przeznaczenia Rust 1.59, 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:

  • Możliwe jest wykorzystanie wstawek języka asemblerowego, które są potrzebne w aplikacjach wymagających kontroli wykonania na niskim poziomie lub możliwości wykorzystania specjalistycznych instrukcji maszynowych. Wkładki montażowe dodawane są za pomocą makr „asm!” i „global_asm!” używając składni formatowania ciągów do nazewnictwa rejestrów podobnej do tej używanej do podstawień ciągów w Rust. Kompilator obsługuje instrukcje montażu dla architektur x86, x86-64, ARM, AArch64 i RISC-V. Przykład wstawienia: użyj std::arch::asm; // Pomnóż x przez 6, używając przesunięć i dodaj let mut x: u64 = 4; unsafe { asm!( "mov {tmp}, {x}", "shl {tmp}, 1", "shl {x}, 2", "add {x}, {tmp}", x = inout(reg ) x, tmp = out(reg) _, ); } asert_eq!(x, 4 * 6);
  • Dodano obsługę zdestrukturyzowanych (równoległych) przypisań, w których kilka cech, wycinków lub struktur jest określonych po lewej stronie wyrażenia. Na przykład: niech (a, b, c, d, e); (a, b) = (1, 2); [c, .., d, _] = [1, 2, 3, 4, 5]; Struktura { e, .. } = Struktura { mi: 5, f: 3 }; twierdzenie_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);
  • Udostępniono możliwość określenia wartości domyślnych dla const Generics: struct ArrayStorage { tablica: [T; N], } implik Magazyn macierzy {fn nowy(a: T, b: T) -> ArrayStorage { ArrayStorage { tablica: [a, b], } } }
  • Menedżer pakietów Cargo wyświetla ostrzeżenia o użyciu nieprawidłowych struktur w zależnościach, które są przetwarzane z powodu błędów w kompilatorze (na przykład z powodu błędu pozwolono na wypożyczanie pól spakowanych struktur w bezpiecznych blokach). Takie konstrukcje nie będą już obsługiwane w przyszłej wersji Rusta.
  • Cargo i rustc mają wbudowaną możliwość generowania plików wykonywalnych pozbawionych danych debugowania (strip = „debuginfo”) i symboli (strip = „symbols”), bez konieczności wywoływania osobnego narzędzia. Ustawienie czyszczenia jest realizowane poprzez parametr „strip” w Cargo.toml: [profile.release] strip = „debuginfo”, „symbols”
  • Kompilacja przyrostowa jest domyślnie wyłączona. Mówi się, że powodem jest tymczasowe obejście błędu w kompilatorze, który prowadzi do awarii i błędów deserializacji. Poprawka błędu została już przygotowana i zostanie uwzględniona w następnej wersji. Aby zwrócić kompilację przyrostową, możesz użyć zmiennej środowiskowej RUSTC_FORCE_INCREMENTAL=1.
  • Nowa część API została przeniesiona do kategorii stabilnej, w tym metody i implementacje cech zostały ustabilizowane:
    • std::thread::available_parallelism
    • Wynik::skopiowano
    • Wynik::sklonowany
    • arch::asm!
    • arch::global_asm!
    • ops::ControlFlow::is_break
    • ops::ControlFlow::is_continue
    • Wypróbuj From dla u8
    • char::TryFromCharError (Klonowanie, Debugowanie, Wyświetlanie, PartialEq, Kopiowanie, Równanie, Błąd)
    • iter::zip
    • NonZeroU8::is_power_of_two
    • NonZeroU16::is_power_of_two
    • NonZeroU32::is_power_of_two
    • NonZeroU64::is_power_of_two
    • NonZeroU128::is_power_of_two
    • DoubleEndedIterator dla struktury ToLowercase
    • DoubleEndedIterator dla struktury ToUppercase
    • TryFrom<&mut [T]> dla [T; N]
    • UnwindSafe dla struktury Once
    • RefUnwindSafe raz
    • Funkcje obsługi neonów armv8 wbudowane w kompilator dla aarch64
  • Atrybut „const”, który określa możliwość użycia go w dowolnym kontekście zamiast stałych, jest używany w funkcjach:
    • mem::MaybeUninit::as_ptr
    • mem::MaybeUninit::assume_init
    • mem::MaybeUninit::assume_init_ref
    • ffi::CStr::from_bytes_with_nul_unchecked

Źródło: opennet.ru

Dodaj komentarz