Vydání programovacího jazyka Rust 1.59 s podporou montážních vložek

Bylo zveřejněno vydání univerzálního programovacího jazyka Rust 1.59, založeného projektem Mozilla, ale nyní vyvíjeného pod záštitou nezávislé neziskové organizace Rust Foundation. Jazyk se soustředí na bezpečnost paměti a poskytuje prostředky k dosažení vysokého paralelismu úloh a zároveň se vyhýbá použití garbage collectoru a runtime (runtime je redukováno na základní inicializaci a údržbu standardní knihovny).

Metody zpracování paměti Rust šetří vývojáře před chybami při manipulaci s ukazateli a chrání před problémy, které vznikají v důsledku nízkoúrovňového zpracování paměti, jako je přístup k oblasti paměti po jejím uvolnění, dereferencování nulových ukazatelů, přetečení vyrovnávací paměti atd. Pro distribuci knihoven, poskytování sestavení 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.

Bezpečnost paměti je v Rustu zajištěna v době kompilace prostřednictvím kontroly referencí, sledování vlastnictví objektů, sledování životnosti objektů (rozsahů) a hodnocení 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.

Hlavní inovace:

  • Je možné použít vložky v assembleru, které jsou žádané v aplikacích, které potřebují řídit provádění na nízké úrovni nebo umět používat specializované strojní instrukce. Montážní vložky se přidávají pomocí maker "asm!" a "global_asm!" použití syntaxe formátování řetězců pro pojmenování registrů podobnou té, která se používá pro substituce řetězců v Rustu. Kompilátor podporuje montážní instrukce pro architektury x86, x86-64, ARM, AArch64 a RISC-V. Příklad vložení: use std::arch::asm; // Vynásobte x 6 pomocí posunů a přičtení let mut x: u64 = 4; unsafe { asm!( "mov {tmp}, {x}", "shl {tmp}, 1", "shl {x}, 2", "add {x}, {tmp}", x = inout(reg ) x, tmp = out(reg) _, ); } claim_eq!(x, 4 * 6);
  • Přidána podpora pro destrukturovaná (paralelní) přiřazení, ve kterých je na levé straně výrazu specifikováno několik vlastností, řezů nebo struktur. Například: nechť (a, b, c, d, e); (a, b) = (1); [c, .., d, _] = [2, 1, 2, 3, 4]; Struct { e, .. } = Struct { e: 5, f: 5 }; claim_eq!([3, 1, 2, 1, 4], [a, b, c, d, e]);
  • Byla poskytnuta možnost zadat výchozí hodnoty pro generika const: struct ArrayStorage { arr: [T; N], } impl ArrayStorage { fn new(a: T, b: T) -> ArrayStorage { ArrayStorage { arr: [a, b], } } }
  • Správce balíčků Cargo poskytuje upozornění na použití neplatných struktur v závislostech, které jsou zpracovávány kvůli chybám v kompilátoru (například kvůli chybě bylo povoleno vypůjčit si pole zabalených struktur v bezpečných blocích). Takové konstrukce již nebudou podporovány v budoucí verzi Rustu.
  • Cargo a rustc mají vestavěnou schopnost generovat spustitelné soubory zbavené ladicích dat (strip = "debuginfo") a symbolů (strip = "symbols"), aniž by bylo nutné volat samostatný nástroj. Nastavení čištění se provádí pomocí parametru „strip“ v Cargo.toml: [profile.release] strip = „debuginfo“, „symbols“
  • Přírůstková kompilace je ve výchozím nastavení zakázána. Důvodem je prý dočasné řešení chyby v kompilátoru, která vede k pádům a chybám deserializace. Oprava chyby již byla připravena a bude zahrnuta v příštím vydání. Chcete-li vrátit přírůstkovou kompilaci, můžete použít proměnnou prostředí RUSTC_FORCE_INCREMENTAL=1.
  • Nová část API byla přesunuta do kategorie stabilní, včetně metod a implementací vlastností byly stabilizovány:
    • std::thread::available_parallelism
    • Výsledek::zkopírováno
    • Výsledek::klonováno
    • oblouk::asm!
    • arch::global_asm!
    • ops::ControlFlow::is_break
    • ops::ControlFlow::is_continue
    • TryFrom pro u8
    • char::TryFromCharError (klon, ladění, zobrazení, 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 pro strukturu ToLowercase
    • DoubleEndedIterator pro strukturu ToUppercase
    • TryFrom<&mut [T]> pro [T; N]
    • UnwindSafe pro strukturu Once
    • RefUnwindSafe pro jednou
    • armv8 neonové podpůrné funkce zabudované do kompilátoru pro aarch64
  • Atribut "const", který určuje možnost jeho použití v libovolném kontextu místo konstant, se používá ve funkcích:
    • mem::MaybeUninit::as_ptr
    • mem::MaybeUninit::assume_init
    • mem::MaybeUninit::assume_init_ref
    • ffi::CStr::from_bytes_with_nul_unchecked

Zdroj: opennet.ru

Přidat komentář