Rust 1.82 чыгарылды. Rust негизинде жаңы браузер. Volvoдо Rust колдонуу

Mozilla долбоору тарабынан негизделген, бирок азыр Rust Foundation көз карандысыз коммерциялык эмес уюмунун демөөрчүлүгү астында иштелип чыккан Rust 1.82 жалпы максаттуу программалоо тилинин релизи жарыяланды. Бул тил эстутумдун коопсуздугуна көңүл бурат жана таштанды жыйгычты жана иштөө убактысын колдонуудан качуу менен жогорку жумуш параллелизмине жетүү үчүн каражаттарды камсыз кылат (иштөө убактысы стандарттык китепкананы негизги инициализацияга жана тейлөөгө чейин кыскарган).

Rust'тун эстутум менен иштөө ыкмалары иштеп чыгуучуну көрсөткүчтөрдү манипуляциялоодо каталардан куткарат жана эстутумдун төмөнкү деңгээлдеги иштөөсүнөн улам келип чыккан көйгөйлөрдөн коргойт, мисалы, эстутумдун аймагына ал бошотулгандан кийин жетүү, нөл көрсөткүчтөрдү шилтемеден чыгаруу, буфердин ашып кетиши ж.б. Китепканаларды жайылтуу, курууну камсыз кылуу жана көз карандылыкты башкаруу үчүн долбоор Cargo пакетинин менеджерин иштеп чыгат. crates.io репозиторий китепканаларды хостинг үчүн колдоого алынат.

Эстутумдун коопсуздугу Rust программасында компиляция убагында маалымдама текшерүү, объектке ээлик кылуу, объекттин иштөө мөөнөттөрүн (кошумчаларын) эсепке алуу жана кодду аткаруу учурунда эстутумга жетүүнүн тууралыгын баалоо аркылуу камсыз кылынат. Rust ошондой эле бүтүн сандардын ашып кетишинен коргоону камсыз кылат, колдонуудан мурун өзгөрмө маанилерин милдеттүү түрдө инициализациялоону талап кылат, стандарттык китепканада каталарды жакшыраак иштетет, өзгөрүлгүс шилтемелер жана өзгөрмөлөр концепциясын демейки боюнча колдонот, логикалык каталарды азайтуу үчүн күчтүү статикалык терүүнү сунуштайт.

Негизги инновациялар:

  • Репозиторийдеги пакет жөнүндө маалыматты көрсөтүү үчүн жүк пакетинин менеджерине “info” буйругу кошулду.
  • Жашыруун түрлөр жөнүндө маалыматты көрсөткөн "impl Trait" синтаксисинде "use<..>" синтаксиси кошулду. Мисалы, "impl Trait + use<'x, T>" жашыруун түрдө "x" жана "T" параметрлерин гана колдонууга уруксат берилгенин белгилейт.
  • Мурда колдонулган макростордун ордуна чийки көрсөткүчтөрдү түзүү үчүн өзүнчө синтаксис сунушталды: “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}; // Чийки көрсөткүчтү түзүүнүн эски жолу ptr = std::ptr::addr_of!(p.not_aligned_field); // Чийки көрсөткүчтү түзүүнүн жаңы жолу let ptr = &raw const p.not_aligned_field; let val = кооптуу { ptr.read_unaligned() }; }
  • "Кооптуу" атрибуту бар тышкы блоктордун ичинде "статикалык" иштөө мөөнөтү менен коопсуз функцияларды жана туруктууларды аныктоого болот (мурда "кооптуу экстерндеги" бардык элементтер "кооптуу" атрибутка гана ээ болушу мүмкүн эле): unsafe extern { pub safe статикалык TAU : f64; pub safe fn sqrt(x: f64) -> f64; pub unsafe fn strlen(p: *const u8) -> usize; }
  • Белгисиз жүрүм-турумга алып келиши мүмкүн болгон no_mangle, link_section жана export_name атрибуттары эми кооптуу деп эсептелет жана ачык "кооптуу" желекти талап кылат, мисалы: #[unsafe(no_mangle)] pub fn my_global_function() { }
  • Үлгү дал келүү "enum Void {}" сыяктуу бош түрлөрүн же көрүнөө бош талаасы бар структураларды өткөрүп жиберүүгө мүмкүндүк берет. use std::convert::Infallible; pub fn unwrap_without_panic (x: Жыйынтык ) -> T { болсун Ok(x) = x; // "Ката" өткөрүп жиберүүгө болот x }
  • Калкыма чекиттердин түрлөрү (f32 жана f64) сандык эмес NaN маанилерин (0.0/0.0) иштетүүдө стандартташтырылган жүрүм-турумга ээ, ошондой эле const fn ичинде калкыма чекит операцияларын колдонууга мүмкүндүк берет.
  • Ассемблей кошумчалары бүтүн сандык маанилерди реестрде сактабастан түздөн-түз колдонуу үчүн "const" атрибуту бар операнддарды колдонуу мүмкүнчүлүгүн берет. const MSG: &str = "Салам, дүйнө!\n"; unsafe { core::arch::asm!( “mov rdx, {LEN} // 'mov rdx, 14′” нускамасы түзүлөт, LEN = const MSG.len(), … ); }
  • “Статикалык” атрибуту бар туюнтмаларды даректүү коопсуз контекстте кооптуу блокту аныктабастан уруксат берилет (“&raw mut” жана “&raw const” операторлору операнддын маанисине таасир этпейт жана ага көрсөткүчтү гана түзөт): статикалык 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; }
  • API'нин жаңы бөлүгү туруктуу категорияга жылдырылды, анын ичинде сапаттардын ыкмалары жана ишке ашырылышы турукташтырылды:
    • std::thread::Builder::spawn_unchecked
    • std::str::CharIndices::offset
    • std::option::Option::is_none_or
    • [T]::сорттолгон
    • [T]::сорттолгон
    • [T]::ачкыч боюнча сорттолгон
    • Итератор::сорттолгон
    • Итератор::сорттолгон
    • Итератор::ачкыч боюнча_сорттолгон
    • std::future::Ready::into_inner
    • std::iter::repeat_n
    • Impl DoubleEndedIterator үчүн Take

      Source: opennet.ru

Комментарий кошуу