Wydanie języka programowania Rust 1.60

Opublikowano wydanie języka programowania ogólnego przeznaczenia Rust 1.60, 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:

  • Kompilator rustc posiada ustabilizowany system oparty na LLVM do generowania danych pokrycia używanych do oceny pokrycia kodu podczas testowania. Aby włączyć dane pokrycia podczas montażu, należy użyć flagi „-Cinstrument-coverage”, na przykład rozpoczynając montaż poleceniem „RUSTFLAGS=”-C instrument-coverage” cargo build”. Po uruchomieniu tak skompilowanego pliku wykonywalnego, w bieżącym katalogu zostanie zapisany plik default.profraw, do przetworzenia którego można użyć narzędzia llvm-profdata z komponentu llvm-tools-preview. Dane wyjściowe przetworzone przez llvm-profdata można następnie przekazać do llvm-cov w celu wygenerowania raportu pokrycia kodu z adnotacjami. Informacja o powiązaniu z kodem źródłowym pobierana jest z badanego pliku wykonywalnego, który zawiera niezbędne dane o powiązaniu liczników pokrycia z kodem. 1| 1|fn główna() { 2| 1| println!("Witaj, świecie!"); 3| 1|}
  • W menedżerze paczek ładunkowych ustabilizowano obsługę flagi „-timings”, która obejmuje generowanie szczegółowego raportu o postępie kompilacji i czasie wykonania każdego kroku. Raport może być przydatny do optymalizacji realizacji procesu montażu.
  • Menedżer pakietów cargo oferuje nową składnię mechanizmu kompilacji warunkowej i wyboru opcjonalnych zależności, konfigurowaną w pliku Cargo.toml poprzez wypisanie listy nazwanych właściwości w sekcji [funkcje] i aktywowaną poprzez włączenie właściwości podczas budowania pakietu używając flagi „--features”. Nowa wersja dodaje obsługę zależności w oddzielnych przestrzeniach nazw i słabych zależności.

    W pierwszym przypadku możliwe jest użycie elementów z przedrostkiem „dep:” wewnątrz sekcji „[features]”, aby jawnie połączyć się z opcjonalną zależnością bez pośredniego przedstawiania tej zależności jako funkcji. W drugim przypadku dodano obsługę oznaczania znakiem „?”. („nazwa-pakietu?/nazwa-funkcji”) opcjonalne zależności, które powinny być uwzględnione tylko wtedy, gdy jakaś inna właściwość zawiera daną opcjonalną zależność. Na przykład w poniższym przykładzie włączenie właściwości serde spowoduje włączenie zależności „serde”, a także właściwości „serde” dla zależności „rgb”, ale tylko wtedy, gdy zależność „rgb” jest włączona gdzie indziej: [zależności] serde = { wersja = " 1.0.133", opcjonalnie = prawda } rgb = { wersja = "0.8.25", opcjonalnie = prawda } [funkcje] serde = ["dep:serde", "rgb?/serde"]

  • Przywrócono obsługę kompilacji przyrostowej, która została wyłączona w ostatniej wersji. Naprawiono błąd kompilatora, który spowodował wyłączenie tej funkcji.
  • Rozwiązano pewne problemy z zapewnieniem natychmiastowych timerów z gwarancją monotonicznego taktowania, które uwzględnia czas spędzony przez system w trybie uśpienia. Wcześniej, gdzie tylko było to możliwe, do obsługi timera wykorzystywano OS API, które nie uwzględniało sytuacji problematycznych przełamujących monotonię czasu, takich jak problemy sprzętowe, zastosowanie wirtualizacji, czy błędy w systemie operacyjnym.
  • Nowa część API została przeniesiona do kategorii stabilnej, w tym metody i implementacje cech zostały ustabilizowane:
    • Arc::nowy_cykliczny
    • Rc::nowy_cykliczny
    • plasterek::EscapeAscii
    • <[u8]>::escape_ascii
    • u8::escape_ascii
    • Vec::spare_capacity_mut
    • MaybeUninit::assume_init_drop
    • MaybeUninit::assume_init_read
    • i8::abs_diff
    • i16::abs_diff
    • i32::abs_diff
    • i64::abs_diff
    • i128::abs_diff
    • isize::abs_diff
    • u8::abs_diff
    • u16::abs_diff
    • u32::abs_diff
    • u64::abs_diff
    • u128::abs_diff
    • użyj::abs_diff
    • Wyświetlacz dla io::ErrorKind
    • Od dla ExitCode
    • Nie dla ! (wpisz „nigdy”)
    • _Op_Assign<$t>
    • arch::is_aarch64_feature_detected!
  • Trzeci poziom wsparcia został wdrożony dla platform mips64-openwrt-linux-musl* i armv7-unknown-linux-uclibceabi (softfloat). Trzeci poziom obejmuje podstawowe wsparcie, ale bez automatycznych testów, publikowania oficjalnych kompilacji i sprawdzania, czy kod da się zbudować.
  • Kompilator został przełączony tak, aby korzystał z LLVM 14.

Dodatkowo możesz zauważyć:

  • Dodano obsługę ładowania kompilatora rustc przy użyciu backendu rustc_codegen_gcc, co pozwala na użycie biblioteki libgccjit z projektu GCC jako generatora kodu w rustc, co pozwala rustc zapewnić wsparcie dla architektur i optymalizacji dostępnych w GCC. Promocja kompilatora oznacza możliwość wykorzystania generatora kodu opartego na GCC w rustc do zbudowania samego kompilatora rustc. Z praktycznego punktu widzenia, ta funkcja pozwala na budowanie programów rust dla architektur, które nie były wcześniej obsługiwane w rustc.
  • Dostępna jest wersja zestawu narzędzi uutils coreutils 0.0.13, w ramach którego rozwijana jest analogia pakietu GNU Coreutils, przepisana w języku Rust. Coreutils zawiera ponad sto narzędzi, w tym sort, cat, chmod, chown, chroot, cp, date, dd, echo, hostname, id, ln i ls. Celem projektu jest stworzenie wieloplatformowej alternatywnej implementacji Coreutils, zdolnej do działania na platformach Windows, Redox i Fuchsia, a także dystrybucji na podstawie liberalnej licencji MIT zamiast licencji copyleft GPL.

    W nowej wersji poprawiono implementacje wielu narzędzi, w tym znacznie poprawiono kompatybilność narzędzi cp, dd, df, split i tr z ich odpowiednikami z projektu GNU. Dostępna dokumentacja online. Parser clap służy do analizowania argumentów wiersza poleceń, co poprawiło wyniki flagi „--help” i dodało obsługę skrótów długich poleceń (na przykład możesz określić „ls -col” zamiast „ls -color ”).

Źródło: opennet.ru

Dodaj komentarz