Wydano Rust 1.53. Google sfinansuje dodanie wsparcia dla Rust w jądrze Linux

Opublikowano wydanie języka programowania systemowego Rust 1.53, który był rozwijany przez projekt Mozilla, a obecnie jest rozwijany pod egidą niezależnej organizacji non-profit Rust Foundation. Język koncentruje się na bezpiecznej pracy z pamięcią, zapewnia automatyczne zarządzanie pamięcią i dostarcza narzędzi do osiągnięcia wysokiego równoległego wykonania zadań, przy tym omijając użycie zbieracza śmieci i runtime (runtime sprowadza się do podstawowej inicjalizacji i wsparcia standardowej biblioteki).

Automatyczne zarządzanie pamięcią w Rust eliminuje błędy programisty związane z manipulowaniem wskaźnikami i chroni przed problemami, które mogą wystąpić w wyniku niskopoziomowej pracy z pamięcią, takimi jak dostęp do obszaru pamięci po jej zwolnieniu, dereferencjonowanie wskaźników zerowych, przekraczanie granic bufora itp. W celu rozwoju bibliotek, zapewnienia kompilacji oraz zarządzania zależnościami, rozwijany jest menedżer pakietów Cargo. Do przechowywania bibliotek dostępne jest repozytorium crates.io.

Główne nowości:

  • Dla tablic zaimplementowano typ IntoIterator, który pozwala na iterację po elementach tablicy po ich wartościach: for i in [1, 2, 3] { .. }

    Dodano także możliwość przesyłania tablic do metod, które przyjmują iteratory, na przykład: let set = BTreeSet::from_iter([1, 2, 3]); for (a, b) in some_iterator.chain([1]).zip([1, 2, 3]) { .. }

    Wcześniej IntoIterator był zaimplementowany tylko dla referencji do tablic, co oznacza, że do iteracji po wartościach należało używać referencji („&[1, 2, 3]”) lub „[1, 2, 3].iter()”. Implementacja IntoIterator dla tablic była utrudniona przez problemy z kompatybilnością spowodowane wcześniejszym dodaniem do kompilatora konwersji metody array.into_iter() na (&array).into_iter(). Problemy te udało się rozwiązać poprzez obejście — kompilator nadal będzie przekształcał array.into_iter() na (&array).into_iter() tak, jakby brakowało implementacji typu IntoIterator, ale tylko przy wywołaniu metody z użyciem składni „.into_iter()” i nie dotykając wywołań w formie „in [1, 2, 3]”, „iter.zip([1, 2, 3])”, „IntoIterator::into_iter([1, 2, 3])”.

  • Dodano możliwość używania wyrażeń „|” (operacja logiczna OR) w dowolnej części szablonu, na przykład zamiast „Some(1) | Some(2)” teraz można pisać „Some(1 | 2)”: match result { Ok(Some(1 | 2)) => { .. } Err(MyError { kind: FileNotFound | PermissionDenied, .. }) => { .. } _ => { .. } }
  • Dozwolone jest używanie znaków nie-ASCII w identyfikatorach, w tym wszelkich znaków narodowych zdefiniowanych w specyfikacji Unicode UAX 31, z wyjątkiem znaków emoji. Przy użyciu różnych, ale podobnych wizualnie znaków kompilator wyświetli ostrzeżenie. const BLÅHAJ: &str = «🦈»; struct 人 { 名字: String, } let α = 1; let sos = 2; warning: identifier pair considered confusable between ‘s’ and ‘s’
  • Nowa partia API została zakwalifikowana jako stabilna, w tym stabilizacje:
    • array::from_ref
    • array::from_mut
    • AtomicBool::fetch_update
    • AtomicPtr::fetch_update
    • BTreeSet::retain
    • BTreeMap::retain
    • BufReader::seek_relative
    • cmp::min_by
    • cmp::min_by_key
    • cmp::max_by
    • cmp::max_by_key
    • DebugStruct::finish_non_exhaustive
    • Duration::ZERO
    • Duration::MAX
    • Duration::is_zero
    • Duration::saturating_add
    • Duration::saturating_sub
    • Duration::saturating_mul
    • f32::is_subnormal
    • f64::is_subnormal
    • IntoIterator dla tablic
    • {integer}::BITS
    • io::Error::Unsupported
    • NonZero*::leading_zeros
    • NonZero*::trailing_zeros
    • Option::insert
    • Ordering::is_eq
    • Ordering::is_ne
    • Ordering::is_lt
    • Ordering::is_gt
    • Ordering::is_le
    • Ordering::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::increment_strong_count
    • Rc::decrement_strong_count
    • slice::IterMut::as_slice
    • AsRef<[T]> dla slice::IterMut
    • impl SliceIndex dla (Bound<usize>, Bound<usize>)
    • Vec::extend_from_within
  • Wprowadzono trzeci poziom wsparcia dla platformy wasm64-unknown-unknown. Trzeci poziom zakłada podstawowe wsparcie, ale bez zautomatyzowanego testowania, publikacji oficjalnych wydań i weryfikacji możliwości kompilacji kodu.
  • Menadżer pakietów Cargo domyślnie przeszedł na używanie nazwy «main» dla głównej gałęzi repozytorium Git (HEAD). Dla zależności umieszczonych w repozytoriach używających nazwy main zamiast master, nie ma już potrzeby podawania ustawienia branch = «main».
  • W kompilatorze wymagania dotyczące minimalnej wersji LLVM zostały podniesione do LLVM 10.

Dodatkowo można zauważyć zapewnienie finansowania pracy nad rozwojem integracji w jądro Linux środków do tworzenia komponentów w języku Rust. Prace będą prowadzone w ramach projektu Prossimo pod egidą organizacji ISRG (Internet Security Research Group), która jest założycielem projektu Let’s Encrypt i wspiera wdrażanie HTTPS oraz rozwój technologii na rzecz zwiększenia bezpieczeństwa internetu. Środki zostaną zapewnione przez firmę Google, która opłaci pracę Miguela Oheda (Miguel Ojeda), autora projektu Rust-for-Linux. Wcześniej ISRG i Google już sfinansowały stworzenie alternatywnego backendu HTTP dla narzędzia curl oraz opracowanie nowego modułu TLS dla serwera http Apache.

Według firm Microsoft i Google, około 70% luk bezpieczeństwa jest spowodowanych niebezpiecznym zarządzaniem pamięcią. Przyjmuje się, że użycie języka Rust do opracowywania komponentów jądra, takich jak sterowniki urządzeń, może zmniejszyć ryzyko wystąpienia luk związanych z niebezpiecznym zarządzaniem pamięcią oraz wykluczyć takie błędy jak dostęp do obszaru pamięci po jej zwolnieniu i przekroczenie granic bufora.

Bezpieczna praca z pamięcią w języku Rust jest zapewniana w czasie kompilacji poprzez sprawdzanie referencji, śledzenie własności obiektów oraz uwzględnianie czasu życia obiektów (zakresu widoczności), a także poprzez ocenę poprawności dostępu do pamięci w czasie wykonywania kodu. Rust zapewnia również środki ochrony przed przepełnieniami wartości całkowitych, wymaga obowiązkowego inicjowania wartości zmiennych przed ich użyciem, lepiej obsługuje błędy w standardowej bibliotece, stosuje koncepcję niezmienności (immutable) referencji i zmiennych domyślnie oraz oferuje silną statyczną typizację w celu minimalizacji błędów logicznych.

Źródło: opennet.ru

Kup niezawodny hosting stron z ochroną DDoS, serwery VPS VDS 🔥 Kup niezawodny hosting stron z ochroną DDoS, serwery VPS VDS - ProHoster