Vydán Rust 1.53. Google bude financovat přidání podpory Rust do linuxového jádra

Bylo zveřejněno vydání systémového programovacího jazyka Rust 1.53, založeného projektem Mozilla, ale nyní vyvíjeného pod záštitou nezávislé neziskové organizace Rust Foundation. Jazyk se zaměřuje na bezpečnost paměti, poskytuje automatickou správu paměti a poskytuje prostředky k dosažení vysokého paralelismu úloh bez použití garbage collectoru nebo runtime (runtime je redukováno na základní inicializaci a údržbu standardní knihovny).

Automatická správa paměti Rust eliminuje chyby při manipulaci s ukazateli a chrání před problémy vyplývajícími z manipulace s pamětí na nízké úrovni, jako je přístup k oblasti paměti po jejím uvolnění, dereference nulového ukazatele, přetečení vyrovnávací paměti atd. Pro distribuci knihoven, zajištění sestavování a správu závislostí projekt vyvíjí správce balíčků Cargo. Úložiště crates.io je podporováno pro hostování knihoven.

Hlavní inovace:

  • Pro pole byla implementována vlastnost IntoIterator, která umožňuje organizovat iteraci prvků pole podle hodnot: for i v [1, 2, 3] { .. }

    Je také možné předat pole metodám, které přijímají iterátory, například: let set = BTreeSet::from_iter([1, 2, 3]); pro (a, b) v some_iterator.chain([1]).zip([1, 2, 3]) { .. }

    Dříve byl IntoIterator implementován pouze pro odkazy na pole, tzn. iterace přes hodnoty vyžadovala použití odkazů („&[1, 2, 3]“) nebo „[1, 2, 3].iter()“. Implementaci IntoIteratoru pro pole bránily problémy s kompatibilitou způsobené dřívější konverzí kompilátoru z array.into_iter() na (&array).into_iter(). Tyto problémy byly vyřešeny náhradním řešením – kompilátor bude nadále převádět array.into_iter() na (&array).into_iter(), jako by neexistovala žádná implementace vlastnosti IntoIterator, ale pouze při volání metody pomocí „.into_iter( )" syntaxe a bez dotyku volání ve tvaru "in [1, 2, 3]", "iter.zip([1, 2, 3])", "IntoIterator::into_iter([1, 2, 3] )".

  • Je možné zadat výrazy „|“ (logická operace OR) v jakékoli části šablony, například místo „Some(1) | Some(2)" nyní můžete napsat "Some(1 | 2)": výsledek shody { Ok(Some(1 | 2)) => { .. } Err(MyError { kind: FileNotFound | PermissionDenied, .. }) = > { .. } _ => { .. } }
  • Použití jiných než ASCII znaků v identifikátorech je povoleno, včetně jakýchkoli národních znaků definovaných ve specifikaci Unicode UAX 31, ale s výjimkou znaků emoji. Pokud použijete různé, ale podobné znaky, kompilátor vydá varování. const BLÅHAJ: &str = "🦈"; struct 人 { 名字: Řetězec, } nechť α = 1; letsos = 2; upozornění: pár identifikátorů je považován za zaměnitelný mezi „s“ a „s“
  • Nová část API byla převedena do stabilní kategorie, včetně následujících stabilizovaných:
    • pole::from_ref
    • pole::from_mut
    • AtomicBool::fetch_update
    • AtomicPtr::fetch_update
    • BTreeSet::zachovat
    • BTreeMap::zachovat
    • BufReader::seek_relative
    • cmp::min_by
    • cmp::min_by_key
    • cmp::max_by
    • cmp::max_by_key
    • DebugStruct::finish_non_exhaustive
    • Trvání::NULA
    • Délka::MAX
    • Trvání::je_nula
    • Duration::saturating_add
    • Duration::saturating_sub
    • Duration::saturating_mul
    • f32::je_subnormální
    • f64::je_subnormální
    • IntoIterator pro pole
    • {integer}::BITS
    • io::Chyba::Nepodporováno
    • NonZero*::leading_zeros
    • NonZero*::trailing_zeros
    • Možnost::vložit
    • Objednávka::is_eq
    • Objednávka::is_ne
    • Objednávka::is_lt
    • Objednávka::is_gt
    • Objednávka::is_le
    • Objednávka::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
    • Sledovatelné::peek_mut
    • Rc::increment_strong_count
    • Rc::decrement_strong_count
    • slice::IterMut::as_slice
    • AsRef<[T]> pro slice::IterMut
    • impl SliceIndex pro (Bound , Vázaný )
    • Vec::extend_from_within
  • Byla implementována třetí úroveň podpory pro platformu wasm64-unknown-unknown. Třetí úroveň zahrnuje základní podporu, ale bez automatického testování, publikování oficiálních sestavení nebo kontroly, zda lze kód sestavit.
  • Správce balíčků Cargo byl přesunut tak, aby ve výchozím nastavení používal název „main“ pro hlavní větev úložiště Git (HEAD). Závislosti hostované v úložištích, které používají název main namísto master, již nevyžadují konfiguraci branch = "main".
  • V kompilátoru jsou požadavky na minimální verzi LLVM zvýšeny na LLVM 10.

Dále můžeme zaznamenat poskytnutí finančních prostředků na vývoj integrace do linuxového jádra nástrojů pro vývoj komponent v jazyce Rust. Práce budou probíhat v rámci projektu Prossimo pod záštitou organizace ISRG (Internet Security Research Group), která je zakladatelem projektu Let's Encrypt a propaguje HTTPS a vývoj technologií pro zvýšení bezpečnosti Internet. Prostředky poskytne Google, který zaplatí práci Miguela Ojedy, autora projektu Rust-for-Linux. ISRG a Google již dříve financovaly vytvoření alternativního HTTP backendu pro utilitu curl a vývoj nového modulu TLS pro http server Apache.

Podle Microsoftu a Google je asi 70 % zranitelností způsobeno nebezpečnou manipulací s pamětí. Očekává se, že použití jazyka Rust k vývoji komponent jádra, jako jsou ovladače zařízení, sníží riziko zranitelnosti způsobených nebezpečným zacházením s pamětí a odstraní chyby, jako je přístup k oblasti paměti po jejím uvolnění a překročení mezí vyrovnávací paměti.

Bezpečnost paměti je v Rustu poskytována v době kompilace prostřednictvím kontroly referencí, sledováním vlastnictví objektu a životnosti objektu (rozsahu) a také prostřednictvím vyhodnocování správnosti přístupu do paměti během provádění kódu. Rust také poskytuje ochranu proti přetečení celých čísel, vyžaduje povinnou inicializaci hodnot proměnných před použitím, lépe zpracovává chyby ve standardní knihovně, standardně aplikuje koncept neměnných referencí a proměnných, nabízí silné statické typování pro minimalizaci logických chyb.

Zdroj: opennet.ru

Přidat komentář