Wydanie języka programowania Rust 1.66

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

  • W wyliczeniach z reprezentacjami całkowitymi (atrybut "#[repr(Int)]") dozwolone jest jednoznaczne wskazanie wyróżnika (numeru wariantu w wyliczeniu), nawet jeśli wyliczenie zawiera pola. #[repr(u8)] enum Foo { A(u8), # wyróżnik 0 B(i8), # wyróżnik 1 C(bool) = 42, # wyróżnik 42 }
  • Dodano funkcję core::hint::black_box, która po prostu zwraca otrzymaną wartość. Ponieważ kompilator myśli, że ta funkcja coś robi, funkcji black_box można użyć do wyłączenia optymalizacji kompilatora dla pętli podczas testowania wydajności kodu lub podczas sprawdzania wygenerowanego kodu maszynowego (aby kompilator nie uznał kodu za nieużywany i go nie usunął). Na przykład w poniższym przykładzie black_box(v.as_ptr()) uniemożliwia kompilatorowi myślenie, że wektor v nie jest używany. użyj std::hint::black_box; fn push_cap(v: &mut Vec) { dla i w 0..4 { v.push(i); black_box(v.as_ptr()); } }
  • Menedżer pakietów „cargo” oferuje polecenie „remove”, które umożliwia usunięcie zależności z manifestu Cargo.toml z wiersza poleceń.
  • Nowa część API została przeniesiona do kategorii stabilnej, w tym metody i implementacje cech zostały ustabilizowane:
    • proc_macro::Rozpiętość::tekst_źródłowy
    • u*::{checked_add_signed, overflowing_add_signed, saturating_add_signed, wrapping_add_signed}
    • i*::{checked_add_unsigned, overflowing_add_unsigned, saturating_add_unsigned, wrapping_add_unsigned}
    • i*::{checked_sub_unsigned, overflowing_sub_unsigned, saturating_sub_unsigned, wrapping_sub_unsigned}
    • BTreeSet::{pierwszy, ostatni, pop_first, pop_last}
    • BTreeMap::{first_key_value, last_key_value, First_entry, last_entry, pop_first, pop_last}
    • Dodaj implementacje AsFd dla typów blokad stdio podczas korzystania z WASI.
    • impl Spróbuj z > dla Box<[T; N]>
    • core::hint::black_box
    • Czas trwania::try_from_secs_{f32,f64}
    • Opcja::rozpakuj
    • std::os::fd
  • Zakresy „..X” i „..=X” są dozwolone w szablonach.
  • Podczas budowania przedniej części kompilatora rustc i zaplecza LLVM, tryby optymalizacji LTO (Link Time Optimization) i BOLT (Binary Optimization and Layout Tool) są używane w celu zwiększenia wydajności wynikowego kodu i zmniejszenia zużycia pamięci.
  • Wdrożono obsługę poziomu 5 dla platform armv5te-none-eabi i thumbvXNUMXte-none-eabi. Trzeci poziom oznacza podstawowe wsparcie, ale bez automatycznego testowania, publikowania oficjalnych buildów i sprawdzania możliwości zbudowania kodu.
  • Dodano obsługę łączenia z bibliotekami ogólnymi systemu macOS.

Dodatkowo możemy odnotować włączenie do bazy kodu GCC front-endowego kompilatora języka Rust (gccrs). Frontend jest zawarty w gałęzi GCC 13, która zostanie wydana w maju 2023 roku. Począwszy od GCC 13, standardowy zestaw narzędzi GCC będzie mógł być używany do kompilowania programów Rust bez potrzeby instalowania kompilatora rustc zbudowanego przy użyciu rozwiązań LLVM. Implementacja Rust w GCC 13 będzie w wersji beta, domyślnie nie włączona.

Źródło: opennet.ru

Dodaj komentarz