Opublikowano wydanie systemowego języka programowania Rust 1.57, założonego przez projekt Mozilla, ale obecnie rozwijanego pod auspicjami niezależnej organizacji non-profit Rust Foundation. Język koncentruje się na bezpieczeństwie pamięci, zapewnia automatyczne zarządzanie pamięcią i zapewnia środki do osiągnięcia dużej równoległości zadań bez użycia modułu zbierającego elementy bezużyteczne lub środowiska wykonawczego (czas działania jest zredukowany do podstawowej inicjalizacji i konserwacji biblioteki standardowej).
Automatyczne zarządzanie pamięcią Rusta eliminuje błędy podczas manipulowania wskaźnikami i chroni przed problemami wynikającymi z manipulacji pamięcią na niskim poziomie, takimi jak dostęp do obszaru pamięci po jego zwolnieniu, wyłuskiwanie wskaźników zerowych, przepełnienie bufora itp. Aby rozpowszechniać biblioteki, zapewniać montaż i zarządzać zależnościami, w ramach projektu opracowywany jest menedżer pakietów Cargo. Repozytorium crates.io jest obsługiwane w przypadku bibliotek hostujących.
Główne innowacje:
- Ustabilizowano użycie makra „panika!”. w kontekstach utworzonych podczas kompilacji, takich jak deklaracje „const fn”. Dodatkowo, oprócz używania „paniki!” const deklaracje pozwalają na użycie makra „assert!”. i kilka innych standardowych interfejsów API bibliotek. Stabilizacja nie obejmuje jeszcze całej infrastruktury formatowania, dlatego w obecnej formie makro „panika!” można używać tylko ze statycznymi ciągami znaków (panika!(„...)) lub z pojedynczą interpolowaną wartością „&str” podczas podstawienia (panika!(„{}”, a)), co powinno ograniczać się do podstawienia „{ }” bez specyfikatorów formatowania i innych typów. W przyszłości zastosowanie makr w stałych kontekstach zostanie rozszerzone, ale ustabilizowane możliwości są już wystarczające do przeprowadzania kontroli asercji na etapie kompilacji: const _: () = asert!(std::mem::size_of::() == 64 ); const _: () = asercja!(std::mem::size_of::() == 8);
- Menedżer pakietów Cargo pozwala na użycie profili o dowolnych nazwach, nie ograniczając się do „dev”, „release”, „test” i „bench”. Przykładowo, aby umożliwić optymalizację na etapie łączenia (LTO) dopiero w momencie wygenerowania gotowych zestawów produktu, możesz utworzyć profil „produkcyjny” w Cargo.toml i dodać do niego flagę „lto = true”. Jednak podczas definiowania własnych profili należy określić istniejący profil, aby odziedziczyć z niego ustawienia domyślne. Poniższy przykład tworzy profil „produkcyjny”, który uzupełnia profil „wydania” poprzez dodanie flagi „lto = true”. Sam profil aktywuje się poprzez wywołanie cargo z opcją „--profile Production”, a artefakty złożenia zostaną umieszczone w katalogu „target/production”. [profile.production] dziedziczy = „uwolnij” lto = true
- Ustabilizowano użycie try_reserve dla typów Vec, String, HashMap, HashSet i VecDeque, co pozwala z wyprzedzeniem zarezerwować miejsce na określoną liczbę elementów danego typu, aby zmniejszyć częstotliwość operacji alokacji pamięci i uniknąć zawiesza się podczas pracy z powodu braku pamięci.
- Dopuszczalne jest określanie makr w nawiasach klamrowych w wyrażeniach typu „m!{ .. }.method()” i „m!{ .. }?”.
- Zoptymalizowano wykonywanie funkcji File::read_to_end i read_to_string.
- Obsługa specyfikacji Unicode została zaktualizowana do wersji 14.0.
- Rozszerzono liczbę funkcji oznaczonych „#[must_use]”, aby wygenerować ostrzeżenie w przypadku zignorowania zwracanej wartości, co pomaga zidentyfikować błędy spowodowane założeniem, że funkcja zmieni wartość, a nie zwróci nową wartość.
- Dodano eksperymentalny backend do generowania kodu przy użyciu libgccjit.
- Nowa część API została przeniesiona do kategorii stabilnej, w tym metody i implementacje cech zostały ustabilizowane:
- [T; N]::as_mut_slice
- [T; N]::as_slice
- kolekcje::TryReserveError
- HashMap::try_reserve
- HashSet::try_reserve
- Ciąg::try_reserve
- Ciąg::try_reserve_exact
- Vec::try_reserve
- VEC::try_reserve_exact
- VecDeque::try_reserve
- VecDeque::try_reserve_exact
- Iterator::map_while
- iter::MapWhile
- proc_macro::is_available
- Polecenie::get_program
- Polecenie::get_args
- Polecenie::get_envs
- Polecenie::get_current_dir
- CommandArgs
- CommandEnvs
- Atrybut „const”, który określa, czy można go używać w dowolnym kontekście zamiast stałych, jest używany w funkcji wskazówka::unreachable_unchecked.
- Zaimplementowano trzeci poziom wsparcia dla armv6k-nintendo-3ds, armv7-unknown-linux-uclibceabihf, m68k-unknown-linux-gnu, aarch64-kmc-solid_asp3, armv7a-kmc-solid_asp3-eabi i armv7a-kmc- platformy solid_asp3-eabihf. Trzeci poziom obejmuje podstawowe wsparcie, ale bez automatycznych testów, publikowania oficjalnych kompilacji i sprawdzania, czy kod da się zbudować.
Źródło: opennet.ru