Opublikowano wydanie języka programowania ogólnego przeznaczenia Rust 1.79, opracowanego pierwotnie przez projekt Mozilla, a obecnie rozwijanego pod patronatem niezależnej organizacji non-profit Rust Foundation. Język koncentruje się na bezpiecznym zarządzaniu pamięcią i zapewnia narzędzia do osiągania wysokiego poziomu równoległości w wykonywaniu zadań, jednocześnie unikając użycia garbage collectora i runtime (runtime ogranicza się do podstawowej inicjalizacji i towarzyszenia standardowej bibliotece).
Metody zarządzania pamięcią w Rust eliminują błędy związane z manipulowaniem wskaźnikami oraz chronią przed problemami wynikającymi z niskopoziomowej obsługi pamięci, takimi jak dostęp do pamięci po jej zwolnieniu, dereferencjonowanie wskaźników zerowych, wychodzenie poza granice bufora itp. Dla rozprowadzania bibliotek, zapewnienia budowy i zarządzania zależnościami, rozwijany jest menedżer pakietów Cargo. Dla publikacji bibliotek wspierany jest repozytorium crates.io.
Bezpieczne zarządzanie pamięcią w Rust jest zapewnione podczas kompilacji poprzez kontrolę referencji, śledzenie własności obiektów, uwzględnianie czasu życia obiektów (zakresu widoczności) oraz ocenę prawidłowości dostępu do pamięci w czasie wykonywania kodu. Rust oferuje również narzędzia do ochrony przed przepełnieniami liczbowymi, wymaga obowiązkowej inicjalizacji wartości zmiennych przed użyciem, lepiej obsługuje błędy w standardowej bibliotece, stosuje koncepcję niemutowalności (immutable) referencji i zmiennych domyślnie oraz oferuje silne statyczne typowanie w celu minimalizacji błędów logicznych.
Główne nowości:
- Dodano wsparcie dla inline-konstant, które można określać bezpośrednio w kodzie za pomocą bloków „const { … }”, przetwarzanych w kontekście stałych, co pozwala uniknąć oddzielnego definiowania stałych. Kod zawarty w bloku „const { … }” jest obliczany na etapie kompilacji i jest używany jako stała, bez wykonywania go w trakcie działania programu. W przeciwieństwie do definiowania stałych przez wyrażenie „const ITEM: … = …”, w blokach „const { … }” nie trzeba określać typu, ponieważ wspierają one automatyczne wnioskowanie typów. Na przykład, kod z oddzielnym definiowaniem stałej
const EMPTY: Option<Vec> = None;
let foo = [EMPTY; 100];można zastąpić użyciem na miejscu:
let foo = [const { None }; 100];
- Stabilizowano składnię „T: Trait” do określania ograniczeń w pozycji asocjacyjnego typu, co pozwala skrócić definicje wyrażeń z zagnieżdżonymi ograniczeniami typu, które wcześniej wymagały wskazania zagnieżdżonego impl Trait lub kilku warunków „where”.
- Zapewniono automatyczne przedłużenie czasu życia wartości tymczasowych używanych w konstrukcjach „match” i „if”.
let a = if true {
..;
&temp() // czas życia zostanie przedłużony
} else {
..;
&temp() // czas życia zostanie przedłużony
}; - Stabilizowano możliwość importowania funkcji main z innych modułów i pakietów crate.
- Podczas kompilacji standardowej biblioteki w kompilatorze używany jest flaga „-Cforce-frame-pointers=yes”, która dodaje dane potrzebne do rekonstrukcji stosu podczas profilowania programów.
- Nowa porcja API została wprowadzona do stabilnej wersji, w tym ustabilizowane metody i implementacje traitów:
- {integer}::unchecked_add
- {integer}::unchecked_mul
- {integer}::unchecked_sub
- ::split_at_unchecked
- ::split_at_mut_unchecked
- ::utf8_chunks
- str::Utf8Chunks
- str::Utf8Chunk
- ::is_aligned
- ::is_aligned
- NonNull::is_aligned
- ::len
- ::len
- ::is_empty
- ::is_empty
- NonNull::::is_empty
- CStr::count_bytes
- io::Error::downcast
- num::NonZero
- path::absolute
- proc_macro::Literal::byte_character
- proc_macro::Literal::c_string
- A feature 'const' that defines the ability to be used in any context instead of constants is applied in functions:
- Atomic*::into_inner
- io::Cursor::new
- io::Cursor::get_ref
- io::Cursor::position
- io::empty
- io::repeat
- io::sink
- panic::Location::caller
- panic::Location::file
- panic::Location::line
- panic::Location::column
- Stabilizowane
część możliwości, które można wykorzystać podczas kompilacji do pośredniego przedstawienia Webassembly (WASM). - Zrealizowano trzeci poziom wsparcia dla platform aarch64-apple-visionos, aarch64-apple-visionos-sim oraz riscv32ima-unknown-none-elf. Trzeci poziom zakłada podstawowe wsparcie, ale bez zautomatyzowanego testowania, publikacji oficjalnych wersji i weryfikacji możliwości kompilacji kodu.
- Zrealizowano drugi poziom wsparcia dla docelowych platform aarch64-pc-windows-gnullvm, i686-pc-windows-gnullvm oraz x86_64-pc-windows-gnullvm. Drugi poziom wsparcia zapewnia gwarancję kompilacji.
Ponadto organizacja Rust Foundation, która nadzoruje ekosystem związany z językiem Rust, ogłosiła utworzenie konsorcjum «Safety-Critical Rust Consortium», które ma na celu wykorzystanie języka Rust w rozwiązaniach wymagających wysokiej niezawodności (Safety-Critical Software), awaria których może zagrażać życiu ludzi, szkodzić środowisku lub prowadzić do poważnych uszkodzeń sprzętu. Do konsorcjum przystąpiły firmy ARM, AdaCore, Ferrous Systems, OxidOS, Synopsys, HighTec EDV-Systeme GmbH, TrustInSoft, Veecle oraz Woven by Toyota. Do zadań, które będzie realizować konsorcjum należy pisanie przewodników oraz rozwój bibliotek, linterów i statycznych analizatorów, a także zastosowanie metod formalnej weryfikacji niezawodności oraz opracowanie podzbiorów języka dla systemów o wysokiej niezawodności.
Spośród projektów związanych z systemami o wysokiej niezawodności można wymienić Verus — narzędzie do weryfikacji poprawności kodu napisanego w języku Rust. Weryfikacja odbywa się poprzez zdefiniowanie specyfikacji opisującej dopuszczalne zachowanie kodu. Podczas wykonywania kodu wykonawczego Verus sprawdza zgodność ze specyfikacją, aby potwierdzić poprawność działania.
Źródło: opennet.ru
