Rust 1.53 u lëshua. Google do të financojë shtimin e mbështetjes Rust në kernelin Linux

Është publikuar publikimi i gjuhës programuese të sistemit Rust 1.53, i themeluar nga projekti Mozilla, por tashmë i zhvilluar nën kujdesin e organizatës së pavarur jofitimprurëse Rust Foundation. Gjuha fokusohet në sigurinë e kujtesës, siguron menaxhimin automatik të kujtesës dhe siguron mjetet për të arritur paralelizëm të lartë të detyrave pa përdorur një grumbullues mbeturinash ose kohëzgjatjeje (koha e funksionimit reduktohet në inicializimin bazë dhe mirëmbajtjen e bibliotekës standarde).

Menaxhimi automatik i kujtesës i Rust eliminon gabimet gjatë manipulimit të treguesve dhe mbron nga problemet që lindin nga manipulimi i nivelit të ulët të memories, të tilla si qasja në një rajon memorie pasi të jetë liruar, mosreferencat e treguesit null, tejkalimet e buferit, etj. Për të shpërndarë bibliotekat, për të siguruar montimin dhe për të menaxhuar varësitë, projekti po zhvillon menaxherin e paketave Cargo. Depoja e crates.io mbështetet për pritjen e bibliotekave.

Risitë kryesore:

  • Për vargjet, tipari IntoIterator është zbatuar, i cili ju lejon të organizoni përsëritjen e elementeve të grupit sipas vlerave: për i në [1, 2, 3] { .. }

    Është gjithashtu e mundur që të kalohen vargje metodave që pranojnë përsëritës, për shembull: let set = BTreeSet::from_iter([1, 2, 3]); për (a, b) në disa_iterator. zinxhir ([1]).zip ([1, 2, 3]) { .. }

    Më parë, IntoIterator zbatohej vetëm për referenca të grupeve, d.m.th. për të përsëritur mbi vlerat kërkohet përdorimi i referencave ("&[1, 2, 3]") ose "[1, 2, 3].iter()". Zbatimi i IntoIterator për vargje u pengua nga problemet e përputhshmërisë të shkaktuara nga një konvertim i mëparshëm i përpiluesit nga array.into_iter() në (&array).into_iter(). Këto probleme u zgjidhën me një zgjidhje - përpiluesi do të vazhdojë të konvertojë array.into_iter() në (&array).into_iter() sikur të mos kishte zbatim të tiparit IntoIterator, por vetëm kur thërret metodën duke përdorur ".into_iter( )" sintaksë dhe pa prekur thirrjet në formën "në [1, 2, 3]", "iter.zip([1, 2, 3])", "IntoIterator::into_iter([1, 2, 3] )".

  • Është e mundur të specifikohen shprehjet "|" (operacion logjik OSE) në çdo pjesë të shabllonit, për shembull, në vend të "Disa(1) | Disa(2)" tani mund të shkruani "Disa(1 | 2)": përputhet me rezultatin { Ok(Disa(1 | 2)) => { .. } Err(Gabim im { lloji: FileNotFound | Leja e mohuar, .. }) = > { .. } _ => { .. } }
  • Përdorimi i karaktereve jo-ASCII në identifikues lejohet, duke përfshirë çdo karakter kombëtar të përcaktuar në specifikimin Unicode UAX 31, por duke përjashtuar karakteret emoji. Nëse përdorni karaktere të ndryshme por të ngjashme, përpiluesi do të lëshojë një paralajmërim. const BLÅHAJ: &str = "🦈"; struct 人 { 名字: String, } le të a = 1; lesos = 2; paralajmërim: çifti identifikues konsiderohet i ngatërruar midis "s" dhe "s"
  • Një pjesë e re e API-ve është transferuar në kategorinë e qëndrueshme, duke përfshirë të stabilizuarat e mëposhtëm:
    • array::from_ref
    • grup::from_mut
    • AtomicBool::fetch_update
    • AtomicPtr::fetch_update
    • BTreeSet::retain
    • BTreeMap:: ruaj
    • BufReader::seek_relative
    • cmp::min_by
    • cmp::min_by_key
    • cmp::max_by
    • cmp::max_by_key
    • DebugStruct::finish_non_exhaustive
    • Kohëzgjatja:: ZERO
    • Kohëzgjatja:: MAX
    • Kohëzgjatja::është_zero
    • Kohëzgjatja::saturating_add
    • Kohëzgjatja::saturating_sub
    • Kohëzgjatja::saturating_mul
    • f32::is_subnormal
    • f64::is_subnormal
    • IntoIterator për vargje
    • {integer}::BITS
    • io::Gabim::I pambështetur
    • NonZero*::leading_zeros
    • NonZero*::trailing_zeros
    • Opsioni::insert
    • Renditja::is_eq
    • Renditja::is_ne
    • Renditja::is_lt
    • Renditja::is_gt
    • Renditja::is_le
    • Renditja::is_ge
    • OsStr::make_ascii_vogla
    • OsStr::make_ascii_suppercase
    • OsStr::to_ascii_vogla
    • OsStr::to_ascii_kase
    • OsStr::is_ascii
    • OsStr::eq_ignore_ascii_case
    • Peekable::peek_mut
    • Rc::increment_strong_count
    • Rc::decrement_strong_count
    • slice::IterMut::as_slice
    • AsRef<[T]> për slice::IterMut
    • impl SliceIndex për (lidhur , I lidhur )
    • Vec::extend_from_brenda
  • Niveli i tretë i mbështetjes për platformën wasm64-unknown-unknown është zbatuar. Niveli i tretë përfshin mbështetjen bazë, por pa testim të automatizuar, publikim të ndërtimeve zyrtare ose kontrollim nëse kodi mund të ndërtohet.
  • Menaxheri i paketave Cargo është zhvendosur për të përdorur emrin "main" për degën kryesore të depove Git (HEAD) si parazgjedhje. Varësitë e vendosura në depo që përdorin emrin main në vend të master nuk kërkojnë më konfigurimin e degës = "main".
  • Në përpilues, kërkesat për versionin minimal të LLVM janë ngritur në LLVM 10.

Për më tepër, mund të vërejmë sigurimin e fondeve për zhvillimin e integrimit në kernelin Linux të mjeteve për zhvillimin e komponentëve në gjuhën Rust. Puna do të kryhet në kuadër të projektit Prossimo nën kujdesin e organizatës ISRG (Internet Security Research Group), e cila është themeluesi i projektit Let's Encrypt dhe promovon HTTPS dhe zhvillimin e teknologjive për të rritur sigurinë e Internet. Fondet do të sigurohen nga Google, e cila do të paguajë për punën e Miguel Ojeda, autorit të projektit Rust-for-Linux. Më parë, ISRG dhe Google kanë financuar tashmë krijimin e një backend alternativ HTTP për programin curl dhe zhvillimin e një moduli të ri TLS për serverin Apache http.

Sipas Microsoft dhe Google, rreth 70% e dobësive shkaktohen nga trajtimi i pasigurt i memories. Pritet që përdorimi i gjuhës Rust për të zhvilluar komponentë të kernelit, si p.sh. drejtuesit e pajisjes, do të zvogëlojë rrezikun e dobësive të shkaktuara nga trajtimi i pasigurt i memories dhe do të eliminojë gabimet si qasja në një rajon memorie pasi të jetë çliruar dhe kapërcimi i kufijve të tamponit.

Siguria e memories sigurohet në Rust në kohën e përpilimit përmes kontrollit të referencës, mbajtjes së gjurmëve të pronësisë së objektit dhe jetëgjatësisë së objektit (fushëveprimit), si dhe përmes vlerësimit të korrektësisë së aksesit në kujtesë gjatë ekzekutimit të kodit. Rust siguron gjithashtu mbrojtje kundër tejmbushjeve të numrave të plotë, kërkon inicializimin e detyrueshëm të vlerave të variablave përpara përdorimit, trajton më mirë gabimet në bibliotekën standarde, zbaton konceptin e referencave dhe variablave të pandryshueshme si parazgjedhje, ofron shtypje të fortë statike për të minimizuar gabimet logjike.

Burimi: opennet.ru

Shto një koment