Wydanie języka programowania Rust 1.61

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

  • Z poziomu funkcji głównej istnieje możliwość zdefiniowania własnych kodów powrotnych. Pierwotnie główna funkcja Rusta mogła zwracać tylko typ „()” (jednostka), który zawsze wskazywał pomyślny status wyjścia, chyba że programista jawnie wywołał funkcję „process::exit(code)”. W Rust 1.26, wykorzystując w funkcji głównej niestabilną cechę Termination, możliwe było zwrócenie wartości „Ok” i „Err”, odpowiadających kodom EXIT_SUCCESS i EXIT_FAILURE w programach C. W Rust 1.61 cecha Termination została ustabilizowana i zaproponowano oddzielny typ ExitCode reprezentujący specyficzny kod powrotu, który wyodrębnia typy zwrotów specyficzne dla platformy poprzez dostarczenie predefiniowanych stałych SUCCESS i FAILURE oraz metody From aby zwrócić niestandardowy kod powrotu. użyj std::process::ExitCode; fn main() -> Kod wyjścia { if !check_foo() { zwróć Kod wyjścia::from(8); } Kod wyjścia::SUCCESS }
  • Ustabilizowano dodatkowe możliwości funkcji zdefiniowanych za pomocą wyrażenia „const fn”, które można nazwać nie tylko funkcjami regularnymi, ale także wykorzystać w dowolnym kontekście zamiast stałych. Funkcje te są obliczane w czasie kompilacji, a nie w czasie wykonywania, dlatego podlegają pewnym ograniczeniom, takim jak możliwość odczytu tylko stałych. W nowej wersji wewnątrz funkcji const dozwolone są podstawowe operacje na wskaźnikach funkcji (dozwolone jest tworzenie, przekazywanie i rzucanie wskaźników, ale nie można wywoływać funkcji przez wskaźnik); granice cech dla parametrów ogólnych funkcji stałych, takich jak T: Kopiuj; cechy, które można dynamicznie wysyłać (dyn Trait); impl Typy cech dla argumentów funkcji i wartości zwracanych.
  • Strumień obsługuje Stdin, Stdout i Stderr w std::io ma teraz statyczny czas życia („static”) po zablokowaniu, co pozwala na konstrukcje takie jak „let out = std::io::stdout().lock();” z zdobyciem klamki i założeniem zamka jednym wyrażeniem.
  • Nowa część API została przeniesiona do kategorii stabilnej, w tym metody i implementacje cech zostały ustabilizowane:
    • Pin::static_mut
    • Pin::static_ref
    • Vec::retain_mut
    • VecDeque::retain_mut
    • Napisz dla kursora<[u8; N]>
    • std::os::unix::net::SocketAddr::from_pathname
    • std::process::kod wyjścia
    • std::process::Zakończenie
    • std::thread::JoinHandle::is_finished
  • Atrybut „const”, który określa możliwość użycia go w dowolnym kontekście zamiast stałych, jest używany w funkcjach:
    • <*const T>::offset i <*mut T>::offset
    • <*const T>::wrapping_offset i <*mut T>::wrapping_offset
    • <*const T>::add i <*mut T>::add
    • <*const T>::sub i <*mut T>::sub
    • <*const T>::wrapping_add i <*mut T>::wrapping_add
    • <*const T>::wrapping_sub i <*mut T>::wrapping_sub
    • <[T]>::as_mut_ptr
    • <[T]>::as_ptr_range
    • <[T]>::as_mut_ptr_range

Dodatkowo można zwrócić uwagę na artykuł „Rust: A Critical Retrospective” z podsumowaniem wrażeń języka Rust po napisaniu w nim 100 tysięcy linii kodu podczas opracowywania systemu operacyjnego mikrojądra Xous użytego w oprogramowaniu sprzętowym. Wadami są trudna do zrozumienia składnia, niekompletność i ciągły rozwój języka, brak powtarzalnych kompilacji, typowe problemy z zaufaniem zależności w Crates.io oraz konieczność zachowania pewnej dyscypliny przy pisaniu bezpiecznego kodu. Funkcje, które przekroczyły oczekiwania, obejmują narzędzia do refaktoryzacji kodu i przeróbki „hacków” dodanych podczas szybkiego prototypowania.

Źródło: opennet.ru

Dodaj komentarz