Выпуск Rust 1.82. Новый браузер на Rust. Использование Rust в Volvo

Опубликован релиз языка программирования общего назначения Rust 1.82, основанного проектом Mozilla, но ныне развиваемого под покровительством независимой некоммерческой организации Rust Foundation. Язык сфокусирован на безопасной работе с памятью и предоставляет средства для достижения высокого параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime (runtime сводится к базовой инициализации и сопровождению стандартной библиотеки).

Metodat e punës me kujtesën në Rust e çlirojnë zhvilluesin nga gabimet gjatë manipulimit me treguesit dhe e mbrojnë atë nga problemet që lindin për shkak të punës me kujtesën në nivel të ulët, si qasja në një zonë kujtese pas çlirimit të saj, dereferencimi i treguesve null, dalja jashtë kufijve të buffers etj. Për shpërndarjen e bibliothekave, sigurimin e ndërtimit dhe menaxhimin e varësive, projekti zhvillohet me menaxherin e paketave Cargo. Për mbështetje të bibliothekave, ekziston një repository crates.io.

Puna e sigurt me kujtesën sigurohet në Rust gjatë kompilimit përmes verifikimit të referencave, ndjekjes së pronësisë së objekteve, llogaritjes së kohëzgjatjes së jetës së objekteve (fushave të dukshmërisë) dhe vlerësimit të saktësisë së qasjes në kujtesë gjatë ekzekutimit të kodit. Rust gjithashtu ofron mjete për mbrojtjen nga tejkalimet e numrave të plotë, kërkon inicializimin e detyrueshëm të vlerave të variablave para përdorimit, trajton më mirë gabimet në bibliotekën standarde, aplikon konceptin e referencave dhe variablave të pandryshueshëm (immutable) si standard dhe ofron tipizimin e fortë statik për të minimizuar gabimet logjike.

Novitetet kryesore:

  • В пакетный менеджер cargo добавлена команда «info» для вывода информации о пакете в репозитории.
  • Добавлена поддержка синтаксиса «use<..>» в «impl Trait», определяющего информацию о скрытых типах. Например, «impl Trait + use<‘x, T>» указывает, что в скрытом типе разрешено использовать только параметры «x» и «T».
  • Предложен отдельный синтаксис для создания raw-указателей, пришедший на смену ранее применяемым макросам: на смену макросу «addr_of!(expr)» пришёл оператор «&raw const expr», а на смену макросу «addr_of_mut!(expr)» — оператор «&raw mut expr». struct Packed { not_aligned_field: i32, } fn main() { let p = Packed { not_aligned_field: 1_82 }; // Старый способ создания raw-указателя let ptr = std::ptr::addr_of!(p.not_aligned_field); // Новый способ создания raw-указателя let ptr = &raw const p.not_aligned_field; let val = unsafe { ptr.read_unaligned() }; }
  • Предоставлена возможность определения безопасных (safe) функций и констант со временем жизни ‘static’ внутри extern-блоков с признаком «unsafe» (ранее все элементы в «unsafe extern» могли иметь только признак «unsafe»): unsafe extern { pub safe static TAU: f64; pub safe fn sqrt(x: f64) -> f64; pub unsafe fn strlen(p: *const u8) -> usize; }
  • Атрибуты no_mangle, link_section и export_name, которые могут привести к неопределённому поведению, теперь считаются небезопасными и требуют явной пометки признаком «unsafe», например: #[unsafe(no_mangle)] pub fn my_global_function() { }
  • При сопоставлением с образцом разрешено пропускать пустые типы, такие как «enum Void {}» или структуры с видимым пустым полем. use std::convert::Infallible; pub fn unwrap_without_panic<T>(x: Result<T, Infallible>) -> T { let Ok(x) = x; // «Err» можно пропустить x }
  • В типах для чисел с плавающей запятой (f32 и f64) стандартизировано поведения при обработке нечисловых значений NaN (0.0/0.0), а также разрешено использование операций с плавающей запятой в const fn.
  • В ассемблерных вставках предоставлена возможность использования операндов с признаком «const» для непосредственного использования целых числовых значений без их предварительного сохранения в регистре. const MSG: &str = «Hello, world!\n»; unsafe { core::arch::asm!( «mov rdx, {LEN} // будет сформирована инструкция ‘mov rdx, 14′», LEN = const MSG.len(), … ); }
  • Разрешена адресация выражений с признаком «static» в безопасном контексте без определения блока unsafe (операторы «&raw mut» и «&raw const» не влияют на значение операнда и лишь создают указатель на него): 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; }
  • Një grup i ri API u kalua në kategorinë e stabilizuar, përfshirë stabilizimin e metodave dhe implementimeve të trait-ëve:
    • 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

      Burimi: opennet.ru
Blini hostim të besueshëm për faqe interneti me mbrojtje DDoS, serverë VPS VDS 🔥 Blini hostim të besueshëm për faqe interneti me mbrojtje DDoS, serverë VPS VDS - ProHoster