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