Opublikowano wydanie języka programowania ogólnego przeznaczenia Rust 1.79, 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:
- Dodano obsługę stałych wbudowanych, które można określić bezpośrednio w kodzie za pomocą bloków „const { ... }”, przetwarzanych w kontekście stałych i pozwalających obejść się bez osobnej definicji stałych. Kod określony w bloku „const { ... }” jest obliczany na etapie kompilacji i używany jako stała, bez wykonywania podczas działania programu. W przeciwieństwie do definiowania stałych poprzez wyrażenie „const ITEM: ... = …” w blokach „const { ... }” nie trzeba określać typu, ponieważ obsługują one automatyczne wnioskowanie o typie. Na przykład kod z oddzielną definicją stałej
const PUSTY: Opcja >=Brak;
niech foo = [PUSTE; 100];można zastąpić lokalnym użyciem:
niech foo = [const { Brak }; 100];
- Ustabilizowana składnia „T: Cecha”. » w celu określenia ograniczeń na pozycji typu asocjacyjnego, co pozwala na skrócenie definicji wyrażeń z ograniczeniami typu zagnieżdżonego, które wcześniej wymagały podania zagnieżdżonej cechy impl lub wielu warunków „where”.
- Zapewnione jest automatyczne przedłużenie czasu życia wartości tymczasowych używanych w konstrukcjach „dopasuj” i „jeśli”.
niech a = jeśli prawda {
..;
&temp() // czas życia zostanie przedłużony
} Else {
..;
&temp() // czas życia zostanie przedłużony
}; - Ustabilizowano możliwość importowania funkcji głównej z innych modułów i pakietów skrzynek.
- Budując bibliotekę standardową, kompilator wykorzystuje flagę „-Cforce-frame-pointers=yes”, która dodaje dane do rekonstrukcji stosu podczas profilowania programu.
- Nowa część API została przeniesiona do kategorii stabilnej, w tym metody i implementacje cech zostały ustabilizowane:
- {liczba całkowita}::unchecked_add
- {liczba całkowita}::unchecked_mul
- {liczba całkowita}::unchecked_sub
- <[T]>::split_at_unchecked
- <[T]>::split_at_mut_unchecked
- <[u8]>::utf8_chunks
- str::Utf8Chunks
- str::Utf8Chunk
- <*const T>::is_aligned
- <*mut T>::is_aligned
- NonNull::is_aligned
- <*stała [T]>::len
- <*mut [T]>::len
- <*const [T]>::is_empty
- <*mut [T]>::is_empty
- NonNull::<[T]>::is_empty
- CStr::count_bytes
- io::Błąd::przygnębiony
- liczba::NieZero
- ścieżka::absolutna
- proc_macro::Literal::byte_character
- proc_macro::Literal::c_string
- Atrybut „const”, który określa możliwość użycia go w dowolnym kontekście zamiast stałych, jest używany w funkcjach:
- Atomowy*::do_wewnętrznego
- io::Kursor::nowy
- io::Cursor::get_ref
- io::Kursor::pozycja
- io::puste
- io::powtórz
- io::umywalka
- panika::Lokalizacja::rozmówca
- panika::Lokalizacja::plik
- panika::Lokalizacja::linia
- panika::Lokalizacja::kolumna
- Stabilizowany
część możliwości, które można wykorzystać podczas kompilacji do pośredniej reprezentacji Webassembly (WASM). - Trzeci poziom wsparcia został wdrożony dla platform aarch64-apple-visionos, aarch64-apple-visionos-sim i riscv32ima-unknown-none-elf. Trzeci poziom obejmuje podstawowe wsparcie, ale bez automatycznych testów, publikowania oficjalnych kompilacji i sprawdzania, czy kod da się zbudować.
- Zaimplementowano drugi poziom wsparcia dla platform docelowych aarch64-pc-windows-gnullvm, i686-pc-windows-gnullvm oraz x86_64-pc-windows-gnullvm. Drugi poziom wsparcia obejmuje gwarancję montażu.
Ponadto Fundacja Rust, która nadzoruje ekosystem językowy Rust, ogłosiła utworzenie Konsorcjum Rust Safety-Critical, którego celem jest wykorzystanie języka Rust w rozwiązaniach wymagających zwiększonej niezawodności (Safety-Critical Software), gdzie awaria może zagrozić życiu człowieka , zaszkodzić środowisku lub spowodować poważne uszkodzenie sprzętu. Do konsorcjum dołączyły ARM, AdaCore, Ferrous Systems, OxidOS, Synopsys, HighTec EDV-Systeme GmbH, TrustInSoft, Veecle i Woven by Toyota. Wśród zadań, które konsorcjum rozwiąże, znajdzie się pisanie podręczników i rozwój bibliotek, lintersów i analizatorów statycznych, a także wykorzystanie formalnych metod weryfikacji niezawodności i rozwój podzbiorów językowych dla systemów o wysokiej niezawodności.
Wśród projektów związanych z systemami o wysokiej niezawodności można wymienić Verus - zestaw narzędzi do sprawdzania poprawności kodu napisanego w języku Rust. Weryfikację przeprowadza się poprzez zdefiniowanie specyfikacji opisującej akceptowalne zachowanie kodu. Podczas wykonywania kodu wykonywalnego Verus sprawdza zgodność ze specyfikacją, aby zapewnić prawidłowe działanie.
Źródło: opennet.ru
