La eldono de la ĝeneraluzebla programlingvo Rust 1.82, 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:
- La komando "info" estis aldonita al la administranto de ŝarĝpakaĵo por montri informojn pri pakaĵo en la deponejo.
- Aldonita subteno por la sintakso "use<..>" en "impl Trait", kiu specifas informojn pri kaŝitaj tipoj. Ekzemple, "impl Trait + use<'x, T>" precizigas, ke nur la parametroj "x" kaj "T" rajtas esti uzataj en kaŝita tipo.
- Aparta sintakso por krei krudajn montrilojn estis proponita, anstataŭigante antaŭe uzitajn makroojn: la makroo "addr_of!(expr)" estis anstataŭigita per la "&raw const expr" funkciigisto, kaj la makroo "addr_of_mut!(expr)" estis anstataŭigita. per la "&raw mut" operatoro expr". struct Pakita { ne_vicigita_kampo: i32, } fn main () { let p = Pakita { ne_vicigita_kampo: 1_82 }; // Malnova maniero krei krudan montrilon let ptr = std::ptr::addr_of!(p.not_aligned_field); // Nova maniero krei krudan montrilon let ptr = &raw const p.not_aligned_field; let val = nesekura { ptr.read_unaligned () }; }
- Nun eblas difini sekurajn funkciojn kaj konstantojn kun 'senmova' vivdaŭro ene de ekster-blokoj kun la atributo "nesekura" (antaŭe ĉiuj elementoj en "nesekura externo" nur povis havi la atributon "nesekura"): unsafe extern { pub sekura senmova TAU : f64; drinkejo safe fn sqrt(x: f64) -> f64; pub unsafe fn strlen(p: *const u8) -> uzi; }
- La atributoj no_mangle, link_section kaj export_name, kiuj povas konduki al nedifinita konduto, nun estas konsiderataj nesekuraj kaj postulas eksplicitan "nesekuran" flagon, ekzemple: #[unsafe(no_mangle)] pub fn my_global_function() { }
- Ŝablona kongruo permesas preterpasi malplenajn tipojn, kiel "enum Void {}" aŭ strukturoj kun videbla malplena kampo. uzu std::convert::Neeraripova; drinkejo fn malvolvi_sen_paniko (x: Rezulto ) -> T { lasu Ok(x) = x; // "Eraro" povas esti preterlasita x}
- La tipoj por glitkomaj nombroj (f32 kaj f64) havas normigitan konduton dum prilaborado de ne-nombraj NaN-valoroj (0.0/0.0), kaj ankaŭ permesas la uzon de glitkomaj operacioj en const fn.
- Asembleaj enmetoj disponigas la kapablon uzi operandojn kun la "const" atributo por rekte uzi entjerajn nombrajn valorojn sen unue stoki ilin en registro. const MSG: &str = "Saluton, mondo!\n"; nesekura { core::arch::asm!( "mov rdx, {LEN} // la instrukcio 'mov rdx, 14′" estos generita, LEN = const MSG.len(), … ); }
- Adresi esprimojn kun la atributo "senmova" estas permesita en sekura kunteksto sen difini nesekuran blokon (la "&raw mut" kaj "&raw const" operatoroj ne influas la valoron de la operando kaj nur kreas montrilon al ĝi): static mut STATIC_MUT: Tipo = Tipo::nova ( ); extern "C" { static EXTERN_STATIC: Tajpu; } fn main() { let static_mut_ptr = &raw mut STATIC_MUT; let extern_static_ptr = &raw konst EXTERN_STATIC; }
- Nova parto de la API estis movita al la kategorio de stalo, inkluzive de la metodoj kaj efektivigoj de trajtoj estis stabiligitaj:
- std::thread::Builder::spawn_unchecked
- std::str::CharIndices::offset
- std::option::Option::is_neniu_aŭ
- [T]::estas_ordigita
- [T]::estas_ordigita
- [T]::estas_ordigita_per_ŝlosilo
- Iterator::estas_ordigita
- Iterator::estas_ordigita
- Iterator::estas_ordigita_per_ŝlosilo
- std::futuro::Preta::en_enen
- std::iter::repeat_n
- impl DoubleEndedIterator por Take
fonto: opennet.ru
