Wydanie Rust 1.78. Język Borgo, łączący mocne strony Go i Rust

Opublikowano wydanie języka programowania ogólnego przeznaczenia Rust 1.78, stworzonego przez projekt Mozilla, a obecnie rozwijanego pod auspicjami niezależnej organizacji non-profit Rust Foundation. Język koncentruje się na bezpiecznym zarządzaniu pamięcią i dostarcza narzędzi do osiągania wysokiego stopnia równoległości wykonania zadań, przy minimalnym użyciu zbieracza śmieci i runtime (runtime ogranicza się do podstawowej inicjalizacji i wsparcia 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:

  • Proponowana jest nowa przestrzeń nazw atrybutów „#[diagnostic]”, która dostarcza narzędzi umożliwiających wpływanie na komunikaty o błędach generowane przez kompilator. Pierwszym atrybutem w nowej przestrzeni jest „#[diagnostic::on_unimplemented]”, który może być używany do dostosowywania komunikatów o błędach w sytuacji, gdy wymagany jest typ, którego nie zrealizowano dla danego typu. #[diagnostic::on_unimplemented( message = „My Message for `ImportantTrait<{A}>` is not implemented for `{Self}`”, label = „My Label”, note = „Note 1”, note = „Note 2” )] trait ImportantTrait<A> {} fn use_my_trait(_: impl ImportantTrait<i32>) {} fn main() { use_my_trait(String::new()); } error[E0277]: My Message for `ImportantTrait<i32>` is not implemented for `String` —> src/main.rs:12:18 | 12 | use_my_trait(String::new()); | ———— ^^^^^^^^^^^^^ My Label | | | required by a bound introduced by this call | = help: the trait `ImportantTrait<i32>` is not implemented for `String` = note: Note 1 = note: Note 2
  • Wstępne sprawdzenia assert stosowane w funkcjach unsafe mogą być teraz odkładane do etapu generowania kodu, co umożliwia wykonywanie tychże sprawdzeń bez konieczności kompilacji standardowej biblioteki w trybie „#[cfg(debug_assertions)]”. Aby sprawdzenia były aktywne, wystarczy włączyć asercje debugowania dla testowych lub deweloperskich wersji kodu.
  • Zachowanie funkcji w standardowej bibliotece, które wpływają na wyrównanie wskaźników i fragmentów (slice), jest teraz przewidywalne podczas wykonywania i zależy od danych wejściowych. Funkcja pointer::align_offset, obliczająca przesunięcie dla wyrównania wskaźnika, zwraca teraz usize::MAX tylko przy niemożliwości wykonania operacji. Funkcje slice::align_to i slice::align_to_mut, konwertujące fragmenty w reprezentacje z wyrównanym średnim fragmentem oraz pierwotnymi fragmentami początkowym i końcowym, zawsze zwracają największą dostępną część.
  • Zostały przeniesione do kategorii stabilnych:
    • impl Read for &Stdin
    • Zezwalają na użycie niestatycznego (ni ‘static) okresu życia dla niektórych implementacji związanych z std::error::Error.
    • W implementacji impl zezwala się na użycie wartości ?Sized.
    • impl From for io::Error
  • Funkcja Barrier::new() została ustabilizowana do użycia z oznaczeniem „const” w dowolnym kontekście zamiast stałych.
  • Dla docelowych platform x86_64-pc-windows-msvc, i686-pc-windows-msvc, x86_64-pc-windows-gnu, i686-pc-windows-gnu, x86_64-pc-windows-gnullvm i i686-pc-windows-gnullvm teraz wymagana jest co najmniej wersja Windows 10.
  • Zrealizowano trzeci poziom wsparcia dla platform wasm32-wasip2, arm64ec-pc-windows-msvc, armv8r-none-eabihf i loongarch64-unknown-linux-musl. Trzeci poziom oznacza podstawowe wsparcie, ale bez zautomatyzowanego testowania, publikacji oficjalnych wersji i weryfikacji możliwości kompilacji kodu.
  • Wprowadzono drugi poziom wsparcia dla docelowej platformy Add wasm32-wasip1. Drugi poziom wsparcia oznacza gwarancję kompilacji.
  • Platforma wasm32-wasi-preview1-threads została przemianowana na wasm32-wasip1-threads.
  • Kompilator został przeniesiony na użycie LLVM 18. Przy użyciu LLVM 18 dla architektur x86-32 i x86-64 zmieniono ABI związane z typami u128 i i128.
  • W menedżerze pakietów Cargo ustabilizowano czwartą wersję plików blokad (lockfile v4).
  • W Cargo ustabilizowano globalną pamięć podręczną z informacjami o ostatnim użyciu danych. Pamięć podręczna jest przechowywana w pliku $CARGO_HOME/.global-cache przy użyciu SQLite, aktualizowana automatycznie i odzwierciedla ostatnie zmiany związane z indeksem, plikiem crate, katalogiem z kodem, git clone i git checkout.

Dodatkowo warto wspomnieć o języku programowania Borgo, który stara się być bardziej ekspresyjny niż język Go, ale mniej skomplikowany niż język Rust. Borgo łączy najlepsze cechy Go i Rust, łatając wady każdego z tych języków. Na przykład, język Go jest prosty i zrozumiały, ale nie zapewnia zaawansowanych narzędzi do zapewnienia bezpieczeństwa typów. Język Rust zapewnia narzędzia do bezpiecznego programowania, ale jest zbyt skomplikowany. Projekt jest rozwijany przez Marco Sampellegriniego, autora książki „The Simple Haskell Handbook” i twórcę systemu ciągłej integracji Quad CI.

Wydanie Rust 1.78. Język Borgo, łączący mocne strony Go i Rust

Borgo wykorzystuje statyczne typowanie, typy podobne do języka Go oraz składnię przypominającą Rust. Zastosowanie kropek z przecinkami na końcu linii w kodzie Borgo nie jest obowiązkowe. Kod w języku Borgo kompiluje się do reprezentacji w języku Go, która jest w pełni kompatybilna z istniejącymi pakietami dla języka Go. Kod kompilatora został napisany w języku Rust i jest rozpowszechniany na licencji ISC. use fmt enum NetworkState { Loading, Failed(int), Success(T), } struct Response { title: string, duration: int, } fn main() { let res = Response { title: «Hello world», duration: 0, } let state = NetworkState.Success(res) let msg = match state { NetworkState.Loading => «wciąż ładowane», NetworkState.Failed(code) => fmt.Sprintf(«Otrzymano kod błędu: %d», code), NetworkState.Success(res) => res.title, } fmt.Println(msg) }

Ź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