Wydanie Rust 1.82. Nowa przeglądarka w Rust. Wykorzystanie Rust w Volvo

Opublikowano wydanie języka programowania ogólnego przeznaczenia Rust 1.82, które jest rozwijane przez niezależną, non-profit organizację Rust Foundation, z początkami w projekcie Mozilla. Język koncentruje się na bezpiecznym zarządzaniu pamięcią i oferuje narzędzia do osiągania wysokiego równoległego przetwarzania zadań, unikając przy tym użycia zbierania śmieci oraz runtime (który ogranicza się do podstawowej inicjalizacji oraz wsparcia dla standardowej biblioteki).

Metody zarządzania pamięcią w Rust eliminują błędy związane z manipulowaniem wskaźnikami oraz chronią przed problemami wynikającymi z niskopoziomowej obsługi pamięci, takimi jak dostęp do pamięci po jej zwolnieniu, dereferencjonowanie wskaźników zerowych, wychodzenie poza granice bufora itp. Dla rozprowadzania bibliotek, zapewnienia budowy i zarządzania zależnościami, rozwijany jest menedżer pakietów Cargo. Dla publikacji bibliotek wspierany jest repozytorium crates.io.

Bezpieczne zarządzanie pamięcią w Rust jest zapewnione podczas kompilacji poprzez kontrolę referencji, śledzenie własności obiektów, uwzględnianie czasu życia obiektów (zakresu widoczności) oraz ocenę prawidłowości dostępu do pamięci w czasie wykonywania kodu. Rust oferuje również narzędzia do ochrony przed przepełnieniami liczbowymi, wymaga obowiązkowej inicjalizacji wartości zmiennych przed użyciem, lepiej obsługuje błędy w standardowej bibliotece, stosuje koncepcję niemutowalności (immutable) referencji i zmiennych domyślnie oraz oferuje silne statyczne typowanie w celu minimalizacji błędów logicznych.

Główne nowości:

  • Do menedżera pakietów Cargo dodano komendę „info” do wyświetlania informacji o pakiecie w repozytorium.
  • Dodano wsparcie dla składni „use<..>” w „impl Trait”, definiującej informacje o ukrytych typach. Na przykład „impl Trait + use<‘x, T>” wskazuje, że w ukrytym typie dozwolone jest użycie tylko parametrów „x” i „T”.
  • Zaproponowano osobną składnię do tworzenia wskaźników raw, która zastępuje wcześniej stosowane makra: w miejsce makra „addr_of!(expr)” wprowadzone zostało operator „&raw const expr”, a w miejsce makra „addr_of_mut!(expr)” — operator „&raw mut expr”. struct Packed { not_aligned_field: i32, } fn main() { let p = Packed { not_aligned_field: 1_82 }; // Stary sposób tworzenia wskaźnika raw let ptr = std::ptr::addr_of!(p.not_aligned_field); // Nowy sposób tworzenia wskaźnika raw let ptr = &raw const p.not_aligned_field; let val = unsafe { ptr.read_unaligned() }; }
  • Umożliwiono definiowanie bezpiecznych (safe) funkcji i stałych o czasie życia ‘static’ wewnątrz bloków extern z oznaczeniem „unsafe” (wcześniej wszystkie elementy w „unsafe extern” mogły mieć tylko oznaczenie „unsafe”): unsafe extern { pub safe static TAU: f64; pub safe fn sqrt(x: f64) -> f64; pub unsafe fn strlen(p: *const u8) -> usize; }
  • Atrybuty no_mangle, link_section i export_name, które mogą prowadzić do nieokreślonego zachowania, są teraz uznawane za niebezpieczne i wymagają wyraźnego oznaczenia jako „unsafe”, na przykład: #[unsafe(no_mangle)] pub fn my_global_function() { }
  • Przy dopasowywaniu wzorców dozwolone jest pomijanie pustych typów, takich jak „enum Void {}” lub struktur z widocznym pustym polem. use std::convert::Infallible; pub fn unwrap_without_panic(x: Result) -> T { let Ok(x) = x; // „Err” można pominąć x }
  • W typach dla liczb zmiennoprzecinkowych (f32 i f64) standardyzowane jest zachowanie przy przetwarzaniu wartości nieliczbowych NaN (0.0/0.0), a także dozwolone jest użycie operacji zmiennoprzecinkowych w const fn.
  • Wstawki asemblerowe umożliwiają korzystanie z operandów oznaczonych jako „const” do bezpośredniego używania całkowitych wartości liczbowych bez ich wcześniejszego zapisywania w rejestrze. const MSG: &str = "Hello, world!\n"; unsafe { core::arch::asm!( "mov rdx, {LEN} // zostanie wygenerowana instrukcja ‘mov rdx, 14′", LEN = const MSG.len(), … ); }
  • Zezwolenie na adresowanie wyrażeń z oznaczeniem „static” w kontekście bezpiecznym bez definiowania bloku unsafe (operatory „&raw mut” i „&raw const” nie wpływają na wartość operand i jedynie tworzą wskaźnik do niego): static mut STATIC_MUT: Type = Type::new(); extern „C” { static EXTERN_STATIC: Type; } fn main() { let static_mut_ptr = &raw mut STATIC_MUT; let extern_static_ptr = &raw const EXTERN_STATIC; }
  • Nowa porcja API została wprowadzona do stabilnej wersji, w tym ustabilizowane metody i implementacje traitów:
    • std::thread::Builder::spawn_unchecked
    • std::str::CharIndices::offset
    • std::option::Option::is_none_or
    • [T]::is_sorted
    • [T]::is_sorted_by
    • [T]::is_sorted_by_key
    • Iterator::is_sorted
    • Iterator::is_sorted_by
    • Iterator::is_sorted_by_key
    • std::future::Ready::into_inner
    • std::iter::repeat_n
    • impl DoubleEndedIterator for Take

      Źródło: opennet.ru
Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster