Vydaný Rust 1.53. Google bude financovať pridanie podpory Rust do linuxového jadra

Vyšlo vydanie systémového programovacieho jazyka Rust 1.53, založeného projektom Mozilla, no teraz vyvinutého pod záštitou nezávislej neziskovej organizácie Rust Foundation. Jazyk sa zameriava na bezpečnosť pamäte, poskytuje automatickú správu pamäte a poskytuje prostriedky na dosiahnutie vysokého paralelizmu úloh bez použitia garbage collectora alebo runtime (runtime je zredukované na základnú inicializáciu a údržbu štandardnej knižnice).

Automatická správa pamäte Rust eliminuje chyby pri manipulácii s ukazovateľmi a chráni pred problémami vznikajúcimi pri manipulácii s pamäťou na nízkej úrovni, ako je prístup k oblasti pamäte po jej uvoľnení, dereferencie nulového ukazovateľa, pretečenie vyrovnávacej pamäte atď. Na distribúciu knižníc, zabezpečenie montáže a správu závislostí projekt vyvíja správcu balíkov Cargo. Úložisko crates.io je podporované pre hosťovanie knižníc.

Hlavné inovácie:

  • Pre polia bola implementovaná vlastnosť IntoIterator, ktorá vám umožňuje organizovať iteráciu prvkov poľa podľa hodnôt: for i v [1, 2, 3] { .. }

    Je tiež možné odovzdať polia metódam, ktoré akceptujú iterátory, napríklad: let set = BTreeSet::from_iter([1, 2, 3]); for (a, b) in some_iterator.chain([1]).zip([1, 2, 3]) { .. }

    Predtým bol IntoIterator implementovaný iba pre odkazy na pole, t.j. na iteráciu hodnôt je potrebné použiť odkazy („&[1, 2, 3]“) alebo „[1, 2, 3].iter()“. Implementáciu IntoIterator pre polia brzdili problémy s kompatibilitou spôsobené skoršou konverziou kompilátora z array.into_iter() na (&array).into_iter(). Tieto problémy boli vyriešené náhradným riešením – kompilátor bude pokračovať v konverzii array.into_iter() na (&array).into_iter(), ako keby neexistovala žiadna implementácia vlastnosti IntoIterator, ale iba pri volaní metódy pomocou „.into_iter( )" syntax a bez dotyku volaní v tvare "v [1, 2, 3]", "iter.zip([1, 2, 3])", "IntoIterator::into_iter([1, 2, 3] )".

  • Je možné špecifikovať výrazy „|“ (logická operácia OR) v ľubovoľnej časti šablóny, napríklad namiesto „Niektoré(1) | Niektoré(2)“ teraz môžete napísať „Niektoré(1 | 2)“: výsledok zhody { Ok(Niektoré(1 | 2)) => { .. } Err(MyError { kind: FileNotFound | PermissionDenied, .. }) = > { .. } _ => { .. } }
  • Používanie iných ako ASCII znakov v identifikátoroch je povolené, vrátane akýchkoľvek národných znakov definovaných v špecifikácii Unicode UAX 31, ale s výnimkou znakov emoji. Ak použijete odlišné, ale podobné znaky, kompilátor vydá varovanie. const BLÅHAJ: &str = "🦈"; struct 人 { 名字: Reťazec, } nech α = 1; letsos = 2; varovanie: pár identifikátorov sa považuje za zameniteľný medzi „s“ a „s“
  • Nová časť API bola presunutá do stabilnej kategórie, vrátane nasledujúcich stabilizovaných:
    • pole::from_ref
    • pole::from_mut
    • AtomicBool::fetch_update
    • AtomicPtr::fetch_update
    • BTreeSet::zachovať
    • BTreeMap::zachovať
    • BufReader::seek_relative
    • cmp::min_by
    • cmp::min_by_key
    • cmp::max_by
    • cmp::max_by_key
    • DebugStruct::finish_non_exhaustive
    • Trvanie::NULA
    • Trvanie::MAX
    • Trvanie::je_nula
    • Trvanie::saturating_add
    • Trvanie::saturating_sub
    • Trvanie::saturating_mul
    • f32::je_subnormálne
    • f64::je_subnormálne
    • IntoIterator pre polia
    • {integer}::BITS
    • io::Chyba::Nepodporované
    • NonZero*::leading_zeros
    • NonZero*::trailing_zeros
    • Možnosť::vložiť
    • Poradie::je_ekv
    • Objednávanie::is_ne
    • Objednávanie::is_lt
    • Objednávanie::is_gt
    • Objednávanie::is_le
    • Objednávanie::is_ge
    • OsStr::make_ascii_lowercase
    • OsStr::make_ascii_uppercase
    • OsStr::to_ascii_lowercase
    • OsStr::to_ascii_uppercase
    • 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]> pre slice::IterMut
    • impl SliceIndex pre (Bound , Viazané )
    • Vec::extend_from_within
  • Bola implementovaná tretia úroveň podpory pre platformu wasm64-unknown-unknown. Tretia úroveň zahŕňa základnú podporu, ale bez automatického testovania, zverejňovania oficiálnych verzií alebo kontroly, či je možné kód zostaviť.
  • Správca balíkov Cargo bol presunutý tak, aby štandardne používal názov „main“ pre hlavnú vetvu úložiska Git (HEAD). Závislosti hosťované v archívoch, ktoré používajú názov main namiesto master, už nevyžadujú konfiguráciu branch = "main".
  • V kompilátore sú požiadavky na minimálnu verziu LLVM zvýšené na LLVM 10.

Dodatočne si môžeme všimnúť poskytnutie financií na vývoj integrácie do linuxového jadra nástrojov na vývoj komponentov v jazyku Rust. Práce budú prebiehať v rámci projektu Prossimo pod záštitou organizácie ISRG (Internet Security Research Group), ktorá je zakladateľom projektu Let's Encrypt a propaguje HTTPS a vývoj technológií na zvýšenie bezpečnosti internet. Prostriedky poskytne Google, ktorý zaplatí prácu Miguela Ojedu, autora projektu Rust-for-Linux. ISRG a Google už v minulosti financovali vytvorenie alternatívneho HTTP backendu pre utilitu curl a vývoj nového modulu TLS pre server Apache http.

Podľa Microsoftu a Google je asi 70 % zraniteľností spôsobených nebezpečnou manipuláciou s pamäťou. Očakáva sa, že používanie jazyka Rust na vývoj komponentov jadra, ako sú ovládače zariadení, zníži riziko zraniteľností spôsobených nebezpečnou manipuláciou s pamäťou a odstráni chyby, ako je prístup k oblasti pamäte po jej uvoľnení a prekročenie hraníc vyrovnávacej pamäte.

Bezpečná manipulácia s pamäťou je v Rust zabezpečená v čase kompilácie prostredníctvom kontroly referencií, sledovania vlastníctva objektu a životnosti objektu (rozsahu), ako aj prostredníctvom hodnotenia správnosti prístupu do pamäte počas vykonávania kódu. Rust tiež poskytuje ochranu proti pretečeniu celých čísel, vyžaduje povinnú inicializáciu hodnôt premenných pred použitím, lepšie zvláda chyby v štandardnej knižnici, štandardne aplikuje koncept nemenných referencií a premenných, ponúka silné statické typovanie na minimalizáciu logických chýb.

Zdroj: opennet.ru

Pridať komentár