Wydanie języka programowania Rust 1.57

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

Dodaj komentarz