Wydanie języka programowania Rust 1.73

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

  • Przeprojektowano format komunikatów wysyłanych przez domyślny moduł obsługi awarii programu (panika). Tekst określony w makrze „panika!” jest teraz wyświetlany w osobnym wierszu bez cudzysłowów, co ułatwia czytanie wiadomości i eliminuje zamieszanie w przypadku obecności zagnieżdżonych cudzysłowów lub podziału na wiele wierszy. fn main() { niech plik = "ferris.txt"; panika!("o nie! {pliku:?} nie znaleziono!"); } Był wątek „główny”, w którym spanikowano „o nie! Nie znaleziono „ferris.txt”!”, src/main.rs:3:5 Wątek „main” wpadł w panikę w src/main.rs:3:5: o nie! Nie znaleziono pliku „ferris.txt”!

    Przerobiono także wyjście komunikatów wyświetlanych po uruchomieniu makr „assert_eq” i „assert_ne”. fn main() { asert_eq!("🦀", "🐟", "ferris to nie ryba"); } Był wątek 'main' spanikowany z powodu 'twierdzenia nieudanego: `(lewy == prawy)` po lewej: `"🦀"`, po prawej: `"🐟"`: Ferris nie jest rybą', src/main.rs: 2:5 Wątek „główny” wpadł w panikę w src/main.rs:2:5: twierdzenie „lewy == prawy” nie powiodło się: Ferris nie jest rybą lewy: „🦀” prawy: „🐟”

  • Zgodnie z RFC 3184 dodano możliwość bezpośredniego manipulowania kluczami magazynu LocalKey lokalnego dla wątku (thread_local) > i klucz lokalny > poprzez użycie metod get(), set(), take() i zamień() zamiast używać zamknięcia „with(|inner| ...)”, co pozwala uniknąć konieczności wykonywania dodatkowego kodu inicjującego dla wartości domyślnej wartości określone dla nowych wątków podczas korzystania z makra „thread_local!” wątek_lokalny! { statyczne RZECZY: Komórka > = Komórka::nowy(Vec::nowy()); } fn f() { // było RZECZY.with(|i| i.set(vec![32, 1, 2])); // stał się THINGS.set(vec![3, 1, 2]); // ... // pozwolono v = RZECZY.with(|i| i.take()); // stał się let v: Vec = RZECZY.weź(); }
  • Nowa część API została przeniesiona do kategorii stabilnej, w tym metody i implementacje cech zostały ustabilizowane:
    • Liczba całkowita bez znaku::div_ceil
    • Liczba całkowita bez znaku:::next_multiple_of
    • Liczba całkowita bez znaku::checked_next_multiple_of
    • std::ffi::FromBytesUntilNulError
    • std::os::unix::fs::chown
    • std::os::unix::fs::fchown
    • std::os::unix::fs::lfchown
    • Klucz lokalny:: >::zdobyć
    • Klucz lokalny:: >::zestaw
    • Klucz lokalny:: >::weź
    • Klucz lokalny:: >::zamień
    • Klucz lokalny:: >::z_pożyczką
    • Klucz lokalny:: >::with_borrow_mut
    • Klucz lokalny:: >::zestaw
    • Klucz lokalny:: >::weź
    • Klucz lokalny:: >::zamień
  • Atrybut „const”, który określa możliwość użycia go w dowolnym kontekście zamiast stałych, jest używany w funkcjach:
    • rc::Słaby::nowy
    • synchronizacja::Słaby::nowy
    • NonNull::as_ref
  • Kompilator zapewnia zapisywanie informacji o wersji w sekcji „.comment”, podobnie jak GCC i Clang.
  • Zaimplementowano trzeci poziom wsparcia dla platform aarch64-unknown-teeos, csky-unknown-linux-gnuabiv2, riscv64-linux-android, riscv64gc-unknown-hermit, x86_64-unikraft-linux-musl i x86_64-unknown-linux -och. Trzeci poziom obejmuje podstawowe wsparcie, ale bez automatycznych testów, publikowania oficjalnych kompilacji i sprawdzania, czy kod da się zbudować.
  • Zaimplementowano drugi poziom obsługi platformy docelowej wasm32-wasi-preview1-threads. Drugi poziom wsparcia obejmuje gwarancję montażu.

Źródło: opennet.ru

Dodaj komentarz