Wydano rdzę 1.53. Google sfinansuje dodanie obsługi Rusta do jądra Linuksa

Opublikowano wydanie systemowego języka programowania Rust 1.53, 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:

  • Dla tablic zaimplementowano cechę IntoIterator, która pozwala organizować iterację elementów tablicy według wartości: for i in [1, 2, 3] { .. }

    Możliwe jest także przekazywanie tablic do metod akceptujących iteratory, na przykład: let set = BTreeSet::from_iter([1, 2, 3]); for (a, b) w Some_iterator.chain([1]).zip([1, 2, 3]) { .. }

    Wcześniej IntoIterator był implementowany tylko dla odwołań do tablic, tj. iteracja po wartościach wymagała użycia referencji („&[1, 2, 3]”) lub „[1, 2, 3].iter()”. Implementację IntoIterator dla tablic utrudniały problemy ze zgodnością spowodowane wcześniejszą konwersją kompilatora z array.into_iter() na (&array).into_iter(). Problemy te rozwiązano obejściem — kompilator będzie kontynuował konwersję array.into_iter() na (&array).into_iter() tak, jakby nie było implementacji cechy IntoIterator, ale tylko podczas wywoływania metody przy użyciu metody „.into_iter() )” i bez dotykania wywołań w postaci „in [1, 2, 3]”, „iter.zip([1, 2, 3])”, „IntoIterator::into_iter([1, 2, 3] )”.

  • Możliwe jest określenie wyrażeń „|” (operacja logiczna OR) w dowolnej części szablonu, na przykład zamiast „Some(1) | Some(2)” możesz teraz zapisać „Some(1 | 2)”: wynik dopasowania { Ok(Some(1 | 2)) => { .. } Err(MyError { rodzaj: FileNotFound | PermissionDenied, .. }) = > { .. } _ => { .. } }
  • Dozwolone jest używanie w identyfikatorach znaków innych niż ASCII, w tym wszelkich znaków narodowych zdefiniowanych w specyfikacji Unicode UAX 31, ale z wyłączeniem znaków emoji. Jeśli użyjesz różnych, ale podobnych znaków, kompilator wyświetli ostrzeżenie. const BLÅHAJ: &str = "🦈"; struct 人{名字: String, } niech α = 1; niechsos = 2; ostrzeżenie: para identyfikatorów może zostać pomylona pomiędzy „s” i „s”
  • Do kategorii stabilnej została przeniesiona nowa porcja API, w tym następujące stabilizowane:
    • tablica::z_ref
    • tablica::from_mut
    • AtomicBool::fetch_update
    • AtomicPtr::fetch_update
    • BTreeSet::zachowaj
    • BTreeMap::zachowaj
    • BufReader::seek_relative
    • cmp::min_by
    • cmp::min_by_key
    • cmp::max_by
    • cmp::max_by_key
    • DebugStruct::finish_non_exhaustive
    • Czas trwania::ZERO
    • Czas trwania::MAX
    • Czas trwania::jest_zero
    • Czas trwania::saturating_add
    • Czas trwania::nasycenie_sub
    • Czas trwania::saturating_mul
    • f32::is_subnormal
    • f64::is_subnormal
    • IntoIterator dla tablic
    • {liczba całkowita}::BITY
    • io::Error::Nieobsługiwane
    • NonZero*::wiodące_zero
    • NonZero*::trailing_zeros
    • Opcja::wstaw
    • Zamawianie::is_eq
    • Zamawianie::is_ne
    • Zamawianie::is_lt
    • Zamawianie::is_gt
    • Zamawianie::is_le
    • Zamawianie::is_ge
    • OsStr::make_ascii_lowercase
    • OsStr::make_ascii_uppercase
    • OsStr::to_ascii_lowercase
    • OsStr::to_ascii_uppercase
    • OsStr::is_ascii
    • OsStr::eq_ignore_ascii_case
    • Peekable::peek_mut
    • Rc::inkrement_strong_count
    • Rc::dekrement_strong_count
    • plasterek::IterMut::as_slice
    • AsRef<[T]> dla plasterka::IterMut
    • impl SliceIndex dla (Bound , Zobowiązany )
    • Vec::extend_from_wewnątrz
  • Wdrożono trzeci poziom wsparcia dla platformy wasm64-unknown-unknown. Trzeci poziom obejmuje podstawowe wsparcie, ale bez automatycznych testów, publikowania oficjalnych kompilacji i sprawdzania, czy kod da się zbudować.
  • Menedżer pakietów Cargo został przeniesiony tak, aby domyślnie używał nazwy „main” dla głównej gałęzi repozytorium Git (HEAD). Zależności hostowane w repozytoriach, które używają nazwy main zamiast master, nie wymagają już skonfigurowania gałęzi = „main”.
  • W kompilatorze wymagania dotyczące minimalnej wersji LLVM zostają podniesione do LLVM 10.

Dodatkowo możemy odnotować zapewnienie finansowania rozwoju integracji z jądrem Linuksa narzędzi do tworzenia komponentów w języku Rust. Prace będą prowadzone w ramach projektu Prossimo pod patronatem organizacji ISRG (Internet Security Research Group), która jest założycielem projektu Let's Encrypt i promuje protokół HTTPS oraz rozwój technologii zwiększających bezpieczeństwo Internet. Fundusze zapewni Google, które opłaci prace Miguela Ojedy, autora projektu Rust-for-Linux. Wcześniej ISRG i Google sfinansowały już utworzenie alternatywnego backendu HTTP dla narzędzia curl i rozwój nowego modułu TLS dla serwera HTTP Apache.

Według Microsoft i Google około 70% luk wynika z niebezpiecznej obsługi pamięci. Oczekuje się, że używanie języka Rust do tworzenia komponentów jądra, takich jak sterowniki urządzeń, zmniejszy ryzyko luk w zabezpieczeniach spowodowanych niebezpieczną obsługą pamięci i wyeliminuje błędy, takie jak dostęp do obszaru pamięci po jego zwolnieniu i przekroczenie granic bufora.

Bezpieczna obsługa pamięci w Rust jest zapewniona w czasie kompilacji poprzez sprawdzanie referencji, śledzenie własności obiektu i czasu życia obiektu (zakres), a także poprzez 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.

Źródło: opennet.ru

Dodaj komentarz