Wydanie języka programowania Rust 1.45

opublikowany wydanie 1.45 języka programowania systemu Rdza, założona przez projekt Mozilla. Język koncentruje się na bezpieczeństwie pamięci, zapewnia automatyczne zarządzanie pamięcią i zapewnia narzędzia umożliwiające osiągnięcie dużej równoległości zadań bez użycia modułu zbierającego elementy bezużyteczne Czas.

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. 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:

  • Wyeliminowany od dawna wada podczas wykonywania konwersji pomiędzy liczbami całkowitymi i zmiennoprzecinkowymi. Ponieważ kompilator Rusta używa LLVM jako backendu, operacje konwersji typów zostały wykonane za pomocą instrukcji kodu pośredniego LLVM, takich jak fptoui, które mają jedną istotną cechę - niezdefiniowane zachowanie, jeśli wynikowa wartość nie pasuje do typu docelowego. Na przykład podczas konwersji wartości zmiennoprzecinkowej 300 przy typie f32 na typ całkowity u8 wynik jest nieprzewidywalny i może się różnić w różnych systemach. Problem polega na tym, że ta funkcja pojawia się w kodzie, który nie jest oznaczony jako „niebezpieczny”.

    Od wersji Rust 1.45 zachowanie przepełnienia rozmiaru typu jest ściśle regulowane, a operacja konwersji „as” sprawdza przepełnienie i wymusza konwersję wartości na wartość maksymalną lub minimalną typu docelowego (w powyższym przykładzie wartość 300 zostanie zamienione na 255). Aby wyłączyć takie kontrole, udostępniane są dodatkowe wywołania API „{f64, f32}::to_int_unchecked”, działające w niebezpiecznym trybie.

    fn obsada(x: f32) -> u8 {
    x jak u8
    }

    fn główna() {
    niech zbyt_big = 300.0;
    niech zbyt_small = -100.0;
    niech nan = f32::NAN;

    niech x: f32 = 1.0;
    niech y: u8 = niebezpieczne { x.to_int_unchecked() };

    println!("too_big_casted = {}", obsada(too_big)); // wyjście 255
    println!("too_small_casted = {}", obsada(too_small)); // wyjście 0
    println!("not_a_number_casted = {}", obsada(nan)); // wyjście 0
    }

  • Użyj stabilizatora makra proceduralnewyrażenia, szablony i instrukcje podobne do funkcji. Wcześniej takich makr nie można było wywoływać wszędzie, a jedynie w określonych fragmentach kodu (jako osobne wywołanie, nie przeplatane z innym kodem). Rozszerzenie sposobu wywoływania makr, podobnie jak funkcji, było jednym z wymagań, aby framework sieciowy działał Rakieta w stabilnych wydaniach Rusta. Wcześniej osiągnięcie dodatkowej elastyczności w definiowaniu procedur obsługi w Rocket wymagało włączenia eksperymentalnej funkcji zwanej „proc_macro_hygiene”, która nie jest dostępna w stabilnych wersjach Rusta. Ta funkcjonalność jest teraz wbudowana w stabilne wersje języka.
  • Zezwolono na używanie zakresów z typem „char” do iteracji po wartościach zakresu (ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo}):

    dla ch w „a”..=’z’ {
    drukuj!("{}", ch);
    }
    drukuj!(); // Wypisze „abcdefghijklmnopqrstuvwxyz”

  • Nowa porcja API została przeniesiona do kategorii stabilnej, w tym stabilizowanej
    Łuk::as_ptr,
    BTreeMap::usuń_entry,
    Rc::as_ptr,
    rc::Słaby::as_ptr,
    rc::Słaby::from_raw,
    rc::Weak::into_raw,
    str::strip_prefix,
    str::strip_suffix,
    synchronizacja::Słaby::as_ptr,
    synchronizacja::Słaby::from_raw,
    synchronizacja::Słaby::into_raw,
    znak::UNICODE_VERSION,
    Rozpiętość::rozwiązana_at,
    Rozpiętość::lokalizacja_w,
    Rozpiętość::mixed_site,
    unix::process::CommandExt::arg0.

  • Kompilator rustc dodał obsługę zastępowania różnych funkcji platformy docelowej przy użyciu flagi „target-feature”, na przykład „-C target-feature=+avx2,+fma”. Dodano także nowe flagi:
    „force-unwind-tables” do generowania tabel wywołań unwind, niezależnie od strategii obsługi awarii; „embed-bitcode”, aby kontrolować, czy kod bitowy LLVM jest uwzględniany w generowanych bibliotekach rlib. Flaga „embed-bitcode” jest domyślnie włączona w Cargo, aby zoptymalizować czas kompilacji i zużycie miejsca na dysku.

  • Udostępniono trzeci poziom obsługi platform mipsel-sony-psp i kciukv7a-uwp-windows-msvc. Trzeci poziom obejmuje podstawowe wsparcie, ale bez automatycznych testów i publikacji oficjalnych wersji.

Dodatkowo można to zauważyć historia o tworzeniu najprostszych приложения w języku Rust, rozpoczynający korzystanie z bootloadera systemowego i gotowy do samodzielnego ładowania zamiast systemu operacyjnego.
Artykuł jest pierwszym z serii poświęconej demonstracji technik, na które jest zapotrzebowanie w programowaniu niskiego poziomu i tworzeniu systemów operacyjnych.

Źródło: opennet.ru

Dodaj komentarz