Wydanie języka programowania Rust 1.77

Opublikowano wydanie języka programowania ogólnego przeznaczenia Rust 1.77, stworzonego w ramach projektu Mozilla, ale obecnie rozwijanego pod auspicjami niezależnej organizacji non-profit Rust Foundation. Język koncentruje się na bezpieczeństwie pamięci i zapewnia środki do osiągnięcia wysokiej równoległości zadań przy jednoczesnym uniknięciu korzystania z modułu wyrzucania elementów bezużytecznych i środowiska uruchomieniowego (czas działania jest ograniczony do podstawowej inicjalizacji i konserwacji standardowej biblioteki).

Metody obsługi pamięci Rust chronią programistę przed błędami podczas manipulowania wskaźnikami i chronią przed problemami wynikającymi z obsługi pamięci niskiego poziomu, takimi jak dostęp do obszaru pamięci po jego zwolnieniu, dereferencja pustych wskaźników, przepełnienie bufora itp. Aby dystrybuować biblioteki, dostarczać kompilacje i zarządzać zależnościami, projekt rozwija menedżera pakietów Cargo. Repozytorium crates.io jest obsługiwane w przypadku bibliotek hostingowych.

Bezpieczeństwo pamięci w Rust jest zapewnione w czasie kompilacji poprzez sprawdzanie referencji, śledzenie własności obiektów, śledzenie czasu życia obiektów (zakresów) i 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.

Główne innowacje:

  • Добавлена поддержка литералов для Си-строк (c»текст»), которые хранятся в памяти с завершающим нулевым символом и ассоциированы с типом «CStr». Предполагается, что поддержка Си-строк упростит написание кода, взаимодействующего с прослойками на языках программирования, в которых применяются завершаемые нулевым байтом строки, и позволит выполнять необходимые проверки на стадии компиляции. const HELLO: &core::ffi::CStr = c»Hello, world!»;
  • В асинхронно выполняемых функциях, объявленных при помощи выражения «async fn», разрешено использование рекурсии, т.е. подобные функции теперь могут вызывать сами себя. async fn fib(n: u32) -> u32 { match n { 0 | 1 => 1, _ => Box::pin(fib(n-1)).await + Box::pin(fib(n-2)).await } }
  • Стабилизирован макрос offset_of!, позволяющий определить байтовое смещение полей структур, перечислений, объединений и кортежей, относительно начала типа. На практике макрос может быть полезен в ситуациях, когда требуется работа на уровне смещения полей при отсутствии экземпляра типа. В частности, функциональность offset_of необходима при разработке низкоуровневых компонентов, таких как драйверы. use std::mem; #[repr(C)] struct FieldStruct { first: u8, second: u16, third: u8 } assert_eq!(mem::offset_of!(FieldStruct, first), 0); assert_eq!(mem::offset_of!(FieldStruct, second), 2); assert_eq!(mem::offset_of!(FieldStruct, third), 4);
  • В пакетном менеджере Cargo в профилях релизов по умолчанию включена очистка файлов от отладочных данных (strip = «debuginfo»), если в профиле Cargo явно не включён режим отладки, т.е. если параметр debug = 0.
  • Включена по умолчанию опция «-Zthir-unsafeck=on», обеспечивающая проверку unsafe для промежуточного представления THIR («Typed High-Level Intermediate Representation»).
  • Добавлена lint-проверка static_mut_refs для вывода предупреждения при использовании ссылок на изменяемые статические значения.
  • Реализована возможность применения типажа «From<&[T; N]>» для типа «Cow<[T]>». fn foo(data: impl Into<Cow<‘static, [&’static str]>>) { /* … */ } fn main() { foo(&[«hello», «world»]); }
  • В компиляторе обеспечено выравнивание 16-байтовых типов i128 и u128 для систем x86.
  • Nowa część API została przeniesiona do kategorii stabilnej, w tym metody i implementacje cech zostały ustabilizowane:
    • array::each_ref
    • array::each_mut
    • core::net
    • f32::round_ties_even
    • f64::round_ties_even
    • mem::offset_of!
    • slice::first_chunk
    • slice::first_chunk_mut
    • slice::split_first_chunk
    • slice::split_first_chunk_mut
    • slice::last_chunk
    • slice::last_chunk_mut
    • slice::split_last_chunk
    • slice::split_last_chunk_mut
    • slice::chunk_by
    • slice::chunk_by_mut
    • Bound::map
    • File::create_new
    • Mutex::clear_poison
    • RwLock::clear_poison
  • Реализован третий уровень поддержки для платформ aarch64-unknown-illumos, hexagon-unknown-none-elf, riscv32imafc-esp-espidf и riscv32im-risc0-zkvm-elf. Третий уровень подразумевает базовую поддержку, но без автоматизированного тестирования, публикации официальных сборок и проверки возможности сборки кода.

Źródło: opennet.ru

Dodaj komentarz