Wydanie języka programowania Rust 1.38

opublikowany wydanie języka programowania systemu Rdza 1.38, założona przez projekt Mozilla. 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.

Automatyczne zarządzanie pamięcią Rusta uwalnia programistę od manipulacji wskaźnikami i chroni przed problemami wynikającymi z manipulacji pamięcią na niskim poziomie, takimi jak dostęp do pamięci po zwolnieniu, wyłuskiwanie wskaźników zerowych, przepełnienie bufora i tym podobne. Trwają prace nad menedżerem pakietów, który umożliwi dystrybucję bibliotek, zapewnienie montażu i zarządzanie zależnościami w ramach projektu. Ładunek, co pozwala jednym kliknięciem pobrać biblioteki potrzebne do programu. Repozytorium jest obsługiwane w celu hostowania bibliotek skrzynie.io.

Głównym innowacje:

  • Dodano tryb kompilacji potokowej (potokowej), w którym budowanie zależnego pakietu skrzyni rozpoczyna się natychmiast po udostępnieniu metadanych zależności, bez czekania na zakończenie kompilacji. Podczas kompilowania pakietu zależności nie muszą być w pełni składane, wystarczy zdefiniować metadane, które obejmują listy typów, zależności i wyeksportowanych elementów. Metadane są udostępniane na początku procesu kompilacji, więc połączone pakiety można teraz kompilować znacznie wcześniej. Podczas budowania pojedynczych pakietów proponowany tryb nie wpływa na wydajność, ale jeśli kompilacja obejmuje pakiety z rozgałęzionymi zależnościami, całkowity czas kompilacji można skrócić o 10-20%;
  • Zapewnia wykrywanie nieprawidłowego użycia funkcji std::mem::niezainicjowany и std::mem::zero. Na przykład std::mem::uninitialized jest wygodne do szybkiego tworzenia tablic, ale wprowadza w błąd kompilator, ponieważ wydaje się być zainicjowane, ale w rzeczywistości wartość pozostaje niezainicjowana. Funkcja mem::uninitialized jest już oznaczona jako przestarzała i zamiast niej zaleca się użycie typu pośredniego Może Jednostka. Jeśli chodzi o mem::zeroed, ta funkcja może powodować problemy z typami, które nie mogą akceptować wartości zerowych.

    Aby pomóc zidentyfikować niezdefiniowane zachowanie, nowa wersja dodaje do kompilatora funkcję sprawdzania lint, która wykrywa pewne problemy z mem::uninitialized lub mem::zeroed. Na przykład teraz pojawia się błąd podczas próby użycia mem::uninitialized lub mem::zeroed z typami &T i Box‹T›, które reprezentują obiekty wskaźnikowe, które nie mogą akceptować wartości null;

  • Atrybut „#[przestarzałe]” został rozszerzony, aby umożliwić oznaczanie pakietów skrzynek jako przestarzałych i zaplanowanie ich przyszłego usunięcia. Od wersji Rust 1.38 ten atrybut może być również używany w makrach;
  • Dodano możliwość wykorzystania atrybutu „#[global_allocator]” w podmodułach;
  • Dodano funkcję std::any::nazwa_typu, co pozwala znaleźć nazwę typu, co może być przydatne do celów debugowania. Przykładowo podczas wykonywania programu można dowiedzieć się dla jakiego typu funkcja została wywołana:

    fn gen_value‹T: Domyślnie>() -› T {
    println!("Inicjowanie instancji {}", std::any::type_name::‹T›());
    Domyślne::domyślne()
    }

    fn główna() {
    niech _: i32 = wartość_genu(); # Wydrukowane zostanie „i32”.
    niech _: String = gen_value(); # wypisze „alloc::string::String”
    }

  • Rozszerzone funkcje biblioteki standardowej:
    • plasterek::{concat, connect, Join} może teraz przyjmować wartość &[T] oprócz &T;
    • „*const T” i „*mut T” implementują teraz marker::Unpin;
    • „Arc‹[T]›” i „Rc‹[T]›” implementują teraz FromIterator‹T›;
    • iter::{StepBy, Peekable, Take} teraz zaimplementuj DoubleEndedIterator.
    • ascii::EscapeDefault implementuje Clone i Display.
  • Do kategorii stabilnej przeniesiono nową część API, obejmującą metody, które zostały ustabilizowane
    • ‹*const T›::cast, ‹*mut T›::cast,
    • Czas trwania::as_secs_f{32|64},
    • Czas trwania::div_duration_f{32|64},
    • Czas trwania::div_f{32|64},
    • Czas trwania::od_secs_f{32|64},
    • Czas trwania::mul_f{32|64},
    • operacje dzielenia z resztą
      div_euclid i rem_euclid dla wszystkich operacji pierwotnych na liczbach całkowitych;

  • Dodano obsługę wielokrotnego określania opcji „--features”, aby włączyć różne funkcje w menedżerze paczek ładunkowych;
  • Kompilator udostępnia trzeci poziom obsługa platform docelowych aarch64-uwp-windows-msvc, i686-uwp-windows-gnu, i686-uwp-windows-msvc, x86_64-uwp-windows-gnu, x86_64-uwp-windows-msvc targets, armv7-unknown-linux -gnueabi, armv7-unknown-linux-musleabi, hexagon-unknown-linux-musl i riscv32i-unknown-none-elf. Trzeci poziom obejmuje podstawowe wsparcie, ale bez automatycznych testów i publikacji oficjalnych wersji.

Źródło: opennet.ru

Dodaj komentarz