Rust 1.59 ծրագրավորման լեզվի թողարկում՝ հավաքման ներդիրների աջակցությամբ

Հրապարակվել է Rust 1.59 ընդհանուր նշանակության ծրագրավորման լեզվի թողարկումը, որը հիմնադրվել է Mozilla նախագծի կողմից, սակայն այժմ մշակվել է Rust Foundation անկախ ոչ առևտրային կազմակերպության հովանու ներքո: Լեզուն կենտրոնանում է հիշողության անվտանգության վրա և ապահովում է աշխատանքի բարձր զուգահեռականության հասնելու միջոցներ՝ միաժամանակ խուսափելով աղբահանող սարքից և գործարկման ժամանակից (աշխատանքի ժամանակը կրճատվում է մինչև ստանդարտ գրադարանի հիմնական սկզբնավորումը և պահպանումը):

Rust-ի հիշողության մշակման մեթոդները ծրագրավորողին փրկում են ցուցիչները մանիպուլյացիայի ժամանակ սխալներից և պաշտպանում են խնդիրներից, որոնք առաջանում են ցածր մակարդակի հիշողության հետ աշխատելու պատճառով, ինչպիսիք են հիշողության տարածք մուտք գործելը այն ազատվելուց հետո, չվերաբերվող ցուցիչները, բուֆերի գերակատարումները և այլն: Գրադարաններ բաշխելու, կառուցումներ տրամադրելու և կախվածությունները կառավարելու համար նախագիծը մշակում է Cargo փաթեթի կառավարիչը: Crates.io պահոցն աջակցվում է գրադարանների հոսթինգի համար:

Հիշողության անվտանգությունն ապահովվում է Rust-ում կոմպիլյացիայի ժամանակ՝ հղումների ստուգման, օբյեկտի սեփականության մասին հաշվառման, օբյեկտների կյանքի ժամկետների (շրջանակների) հետևելու և կոդի կատարման ընթացքում հիշողության հասանելիության ճշգրտության գնահատման միջոցով: Rust-ը նաև ապահովում է պաշտպանություն ամբողջ թվերի արտահոսքից, պահանջում է փոփոխական արժեքների պարտադիր սկզբնավորում նախքան օգտագործումը, ստանդարտ գրադարանում ավելի լավ է լուծում սխալները, լռելյայն կիրառում է անփոփոխ հղումների և փոփոխականների հայեցակարգը, առաջարկում է ուժեղ ստատիկ մուտքագրում՝ տրամաբանական սխալները նվազագույնի հասցնելու համար:

Հիմնական նորամուծությունները.

  • Հնարավոր է օգտագործել անսամբլի լեզվի ներդիրներ, որոնք պահանջարկ ունեն այն հավելվածներում, որոնք պետք է վերահսկեն կատարումը ցածր մակարդակով կամ կարողանան օգտագործել մասնագիտացված մեքենայի հրահանգներ: Մոնտաժային ներդիրներն ավելացվում են «asm» մակրոների միջոցով: և «global_asm!» օգտագործելով տողերի ձևաչափման շարահյուսություն ռեգիստրների անվանման համար, որը նման է Rust-ում տողերի փոխարինման համար օգտագործվողին: Կազմողն աջակցում է x86, x86-64, ARM, AArch64 և RISC-V ճարտարապետությունների հավաքման հրահանգներին: Տեղադրման օրինակ՝ օգտագործել std::arch::asm; // Բազմապատկել x-ը 6-ով, օգտագործելով հերթափոխը և ավելացնում է, թող mut x: u64 = 4; անապահով {asm!( «mov {tmp}, {x}», «shl {tmp}, 1», «shl {x}, 2», «add {x}, {tmp}», x = inout(reg ) x, tmp = out(reg) _, ); } assert_eq!(x, 4 * 6);
  • Ավելացված է աջակցություն ապակառուցված (զուգահեռ) հանձնարարությունների համար, որոնցում արտահայտության ձախ կողմում նշված են մի քանի հատկանիշներ, հատվածներ կամ կառուցվածքներ: Օրինակ՝ թող (a, b, c, d, e); (ա, բ) = (1, 2); [c, .., d, _] = [1, 2, 3, 4, 5]; Struct {e, .. } = Struct {e: 5, f: 3}; պնդել_էկ!([1, 2, 1, 4, 5], [a, b, c, d, e]);
  • Տրված է const generics-ի լռելյայն արժեքներ նշելու հնարավորությունը՝ struct ArrayStorage {arr: [T; N], } իմպլ ArrayStorage {fn new(a: T, b: T) -> ArrayStorage {ArrayStorage {arr: [a, b], } } }
  • Cargo փաթեթի կառավարիչը նախազգուշացումներ է տալիս կախվածության մեջ անվավեր կառուցվածքների օգտագործման մասին, որոնք մշակվում են կոմպիլյատորի սխալների պատճառով (օրինակ, սխալի պատճառով փաթեթավորված կառույցների դաշտերը թույլատրվել են փոխառել անվտանգ բլոկներում): Նման կառուցվածքներն այլևս չեն ապահովվի Rust-ի ապագա տարբերակում:
  • Cargo-ն և rustc-ն ունեն ներկառուցված հնարավորություն՝ ստեղծելու գործարկվող ֆայլեր, որոնք զրկված են վրիպազերծման տվյալներից (strip = «debuginfo») և նշաններից (strip = «symbols»), առանց առանձին կոմունալ ծառայություն կանչելու անհրաժեշտության: Մաքրման կարգավորումն իրականացվում է Cargo.toml-ի «strip» պարամետրի միջոցով՝ [profile.release] strip = «debuginfo», «symbols»
  • Ավելացվող կոմպիլյացիան լռելյայն անջատված է: Նշվում է, որ պատճառը կոմպիլյատորի սխալի ժամանակավոր լուծումն է, որը հանգեցնում է խափանումների և ապասերիալացման սխալների: Սխալների շտկումն արդեն պատրաստ է և կներառվի հաջորդ թողարկումում: Ավելացվող կոմպիլյացիան վերադարձնելու համար կարող եք օգտագործել RUSTC_FORCE_INCREMENTAL=1 միջավայրի փոփոխականը:
  • API-ի նոր մասը տեղափոխվել է կայուն կատեգորիա, ներառյալ մեթոդները և հատկությունների իրականացումը կայունացվել են.
    • std::thread::available_parallelism
    • Արդյունք::պատճենված
    • Արդյունք::կլոնավորված
    • կամար::ասմ!
    • arch::global_asm!
    • ops::ControlFlow::is_break
    • ops::ControlFlow::is_continue
    • TryFrom u8-ի համար
    • char::TryFromCharError (Clone, Debug, Display, PartialEq, Copy, Eq, Error)
    • iter::zip
    • NonZeroU8::is_power_of_two
    • NonZeroU16::is_power_of_two
    • NonZeroU32::is_power_of_two
    • NonZeroU64::is_power_of_two
    • NonZeroU128::is_power_of_two
    • DoubleEndedIterator ToLowercase կառուցվածքի համար
    • DoubleEndedIterator ToUppercase կառուցվածքի համար
    • TryFrom<&mut [T]> համար [T; N]
    • UnwindSafe for the Once կառուցվածքը
    • RefUnwindSafe մեկ անգամ
    • armv8 նեոնային աջակցության գործառույթները ներկառուցված են aarch64-ի կոմպիլյատորում
  • «const» հատկանիշը, որը որոշում է այն ցանկացած համատեքստում օգտագործելու հնարավորությունը հաստատունների փոխարեն, օգտագործվում է գործառույթներում.
    • mem::MaybeUninit::as_ptr
    • mem::MaybeUninit::assume_init
    • mem::MaybeUninit::assume_init_ref
    • ffi::CStr::from_bytes_with_nul_unchecked

Source: opennet.ru

Добавить комментарий