Eldono de la Rust 1.59 programlingvo kun subteno por kunigaĵoj

La eldono de la ĝeneraluzebla programlingvo Rust 1.59, fondita de la projekto Mozilla, sed nun disvolvita sub la aŭspicioj de la sendependa neprofitcela organizaĵo Rust Foundation, estis publikigita. La lingvo temigas memorsekurecon kaj disponigas la rimedojn por atingi altan laborparalelecon evitante la uzon de rubkolektilo kaj rultempo (rultempo estas reduktita al baza inicialigo kaj prizorgado de la norma biblioteko).

La memormanipulaj metodoj de Rust savas la ellaboranton de eraroj dum manipulado de montriloj kaj protektas kontraŭ problemoj kiuj ekestas pro malaltnivela memortraktado, kiel ekzemple alirado de memorareo post kiam ĝi estis liberigita, dereferencing nulmontriloj, bufrotranspaso, ktp. Por distribui bibliotekojn, provizi konstruaĵojn kaj administri dependecojn, la projekto disvolvas la Cargo-pakaĵmanaĝeron. La deponejo crates.io estas subtenata por gastigado de bibliotekoj.

Memorsekureco estas disponigita en Rust ĉe kompiltempo tra referenckontrolado, konservante trakon de objektoposedo, konservante trakon de objektovivdaŭroj (kampoj), kaj taksante la ĝustecon de memoraliro dum kodekzekuto. Rusto ankaŭ provizas protekton kontraŭ entjeraj superfluoj, postulas devigan inicialigon de variaj valoroj antaŭ uzo, pli bone pritraktas erarojn en la norma biblioteko, aplikas la koncepton de neŝanĝeblaj referencoj kaj variabloj defaŭlte, ofertas fortan senmovan tajpadon por minimumigi logikajn erarojn.

Ĉefaj novigoj:

  • Eblas uzi enigaĵojn de asembla lingvo, kiuj estas postulataj en aplikaĵoj, kiuj bezonas kontroli ekzekuton je malalta nivelo aŭ povi uzi specialajn maŝinajn instrukciojn. Asembleaj enigaĵoj estas aldonitaj uzante makroojn "asm!" kaj "global_asm!" uzante ĉenformatan sintakson por nomi registrojn similan al tiu uzata por ĉenstitucioj en Rust. La kompililo subtenas kunig instrukciojn por x86, x86-64, ARM, AArch64 kaj RISC-V arkitekturoj. Enmeta ekzemplo: uzu std::arch::asm; // Multipliku x per 6 uzante movojn kaj aldonojn let mut x: u64 = 4; nesekura { asm!( "mov {tmp}, {x}", "shl {tmp}, 1", "shl {x}, 2", "aldonu {x}, {tmp}", x = inout(reg ) x, tmp = out(reg) _, ); } asert_eq!(x, 4 * 6);
  • Aldonita subteno por destrukturitaj (paralelaj) taskoj, en kiuj pluraj trajtoj, tranĉaĵoj aŭ strukturoj estas specifitaj sur la maldekstra flanko de la esprimo. Ekzemple: estu (a, b, c, d, e); (a, b) = (1, 2); [c, .., d, _] = [1, 2, 3, 4, 5]; Strukturo { e, .. } = Strukturo { e: 5, f: 3 }; asert_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);
  • Eblas specifi defaŭltajn valorojn por konst-generoj: struct ArrayStorage { arr: [T; N], } impl ArrayStorage { fn nova (a: T, b: T) -> ArrayStorage { ArrayStorage { arr: [a, b], } } }
  • La pakaĵmanaĝero de Cargo disponigas avertojn pri la uzo de nevalidaj strukturoj en dependecoj, kiuj estas prilaboritaj pro eraroj en la kompililo (ekzemple, pro eraro, kampoj de pakitaj strukturoj estis permesitaj prunti en sekuraj blokoj). Tiaj konstrukcioj ne plu estos subtenataj en estonta versio de Rust.
  • Kargo kaj rustc havas enkonstruitan kapablon generi ruleblajn dosierojn sen cimigajn datumojn (strip = "debuginfo") kaj simbolojn (strip = "simboloj"), sen la bezono voki apartan ilon. La purigada agordo estas efektivigita per la parametro "strip" en Cargo.toml: [profile.release] strip = "debuginfo", "simbols"
  • Plia kompilo estas malebligita defaŭlte. La kialo laŭdire estas provizora solvo por cimo en la kompililo kiu kondukas al kraŝoj kaj deseriigaj eraroj. Cimsolvo jam estis preta kaj estos inkluzivita en la venonta eldono. Por redoni pliigan kompilon, vi povas uzi la mediovariablon RUSTC_FORCE_INCREMENTAL=1.
  • Nova parto de la API estis movita al la kategorio de stalo, inkluzive de la metodoj kaj efektivigoj de trajtoj estis stabiligitaj:
    • std::thread::disponebla_paralelismo
    • Rezulto::kopiita
    • Rezulto::klonita
    • arko::asm!
    • arch::global_asm!
    • ops::ControlFlow::is_break
    • ops::ControlFlow::is_daŭrigi
    • Provu De por u8
    • char::TryFromCharError (Kloni, Sencimigi, Vidigi, PartaEq, Kopii, Ekvi, Eraro)
    • iter::zip
    • NonZeroU8::estas_povo_de_du
    • NonZeroU16::estas_povo_de_du
    • NonZeroU32::estas_povo_de_du
    • NonZeroU64::estas_povo_de_du
    • NonZeroU128::estas_povo_de_du
    • DoubleEndedIterator por ToLowercase strukturo
    • DoubleEndedIterator por ToUppercase strukturo
    • TryFrom<&mut [T]> por [T; N]
    • UnwindSafe por la strukturo Once
    • RefUnwindSafe por Unufoje
    • armv8 neonaj subtenfunkcioj enkonstruitaj en la kompililo por aarch64
  • La atributo "const", kiu determinas la eblecon uzi ĝin en iu ajn kunteksto anstataŭ konstantoj, estas uzata en la funkcioj:
    • mem::MaybeUninit::as_ptr
    • mem::MaybeUninit::assume_init
    • mem::MaybeUninit::assume_init_ref
    • ffi::CStr::from_bytes_with_nul_unchecked

fonto: opennet.ru

Aldoni komenton