Programmeerimiskeele Rust 1.59 väljalase koos montaaži lisade toega

Avaldatud on Mozilla projektiga rajatud, kuid nüüdseks sõltumatu mittetulundusühingu Rust Foundation egiidi all välja töötatud üldotstarbelise programmeerimiskeele Rust 1.59 väljalase. Keel keskendub mälu ohutusele ja pakub vahendeid töö kõrge paralleelsuse saavutamiseks, vältides samal ajal prügikoguja ja käitusaja kasutamist (käitusaeg lüheneb standardse teegi põhikäivitamise ja hoolduseni).

Rusti mälukäsitlusmeetodid säästavad arendajat osutitega manipuleerimisel esinevate vigade eest ja kaitsevad madala tasemega mälukäsitluse tõttu tekkivate probleemide eest, nagu mälualale juurdepääs pärast selle vabastamist, nullviidate viitamise tühistamine, puhvri ülekoormus jne. Teekide levitamiseks, järkude pakkumiseks ja sõltuvuste haldamiseks arendab projekt Cargo paketihaldurit. Hoidlat crates.io toetatakse teekide majutamiseks.

Mälu turvalisus on Rustis kompileerimise ajal tagatud viidete kontrollimise, objekti omandiõiguse jälgimise, objektide eluea (ulatuse) jälgimise ja mälule juurdepääsu õigsuse hindamise kaudu koodi täitmise ajal. Rooste pakub ka kaitset täisarvude ületäitumise eest, nõuab muutujate väärtuste kohustuslikku lähtestamist enne kasutamist, käsitleb standardteegi vigu paremini, rakendab vaikimisi muutumatute viidete ja muutujate kontseptsiooni, pakub tugevat staatilist tippimist loogiliste vigade minimeerimiseks.

Peamised uuendused:

  • Võimalik on kasutada montaažikeele lisasid, mis on nõutud rakendustes, mis peavad kontrollima täitmist madalal tasemel või oskama kasutada spetsiaalseid masinakäske. Kooste lisad lisatakse makrode "asm!" ja "global_asm!" kasutades registrite nimetamiseks stringivormingu süntaksit, mis sarnaneb sellega, mida kasutatakse Rusti stringide asendamiseks. Kompilaator toetab koostejuhiseid x86, x86-64, ARM, AArch64 ja RISC-V arhitektuuridele. Sisestamise näide: use std::arch::asm; // Korruta x 6-ga, kasutades nihkeid ja liidab 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) _, ); } assert_eq!(x, 4 * 6);
  • Lisatud on destruktureeritud (paralleelsete) ülesannete tugi, mille puhul on avaldise vasakus servas määratud mitu tunnust, lõiku või struktuuri. Näiteks: olgu (a, b, c, d, e); (a, b) = (1, 2); [c, .., d, _] = [1, 2, 3, 4, 5]; Struktuur { e, .. } = Struktuur { e: 5, f: 3 }; assert_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);
  • Const genericsile on võimalik määrata vaikeväärtused: struct ArrayStorage { arr: [T; N], } impl ArrayStorage { fn new(a: T, b: T) -> ArrayStorage { ArrayStorage { arr: [a, b], } } }
  • Cargo paketihaldur annab hoiatusi kehtetute struktuuride kasutamise kohta sõltuvustes, mida töödeldakse kompilaatori vigade tõttu (näiteks lubati vea tõttu laenata pakitud struktuuride välju turvaplokkides). Selliseid konstruktsioone ei toetata enam Rusti tulevases versioonis.
  • Cargo ja rustc-l on sisseehitatud võimalus genereerida käivitatavaid faile, millel on silumisandmed (strip = "debuginfo") ja sümbolid (riba = "sümbolid"), ilma et oleks vaja kutsuda eraldi utiliiti. Puhastusseade rakendatakse rakenduses Cargo.toml parameetri "riba" kaudu: [profile.release] strip = "debuginfo", "symbols"
  • Astmeline kompileerimine on vaikimisi keelatud. Väidetavalt on põhjuseks ajutine lahendus kompilaatori veale, mis põhjustab kokkujooksmisi ja serialiseerimisvigu. Veaparandus on juba ette valmistatud ja lisatakse järgmisesse versiooni. Inkrementaalse kompileerimise tagastamiseks võite kasutada keskkonnamuutujat RUSTC_FORCE_INCREMENTAL=1.
  • API uus osa on viidud stabiilsete kategooriasse, sealhulgas on stabiliseeritud meetodid ja tunnuste rakendused:
    • std::thread::available_parallelism
    • Tulemus::kopeeritud
    • Tulemus::kloonitud
    • arch::asm!
    • arch::global_asm!
    • ops::ControlFlow::is_break
    • ops::ControlFlow::on_continue
    • TryFrom u8 jaoks
    • char::TryFromCharError (kloonimine, silumine, kuvamine, PartialEq, Kopeerimine, Eq, Viga)
    • iter::zip
    • NonZeroU8::on_power_of_wo
    • NonZeroU16::on_power_of_wo
    • NonZeroU32::on_power_of_wo
    • NonZeroU64::on_power_of_wo
    • NonZeroU128::on_power_of_wo
    • DoubleEndedIterator väiketähtede struktuuri jaoks
    • DoubleEndedIterator ToUppercase struktuuri jaoks
    • TryFrom jaoks [T; N]
    • UnwindSafe ühekordse struktuuri jaoks
    • RefUnwindSafe üks kord
    • aarch8 kompilaatorisse sisseehitatud armv64 neoon tugifunktsioonid
  • Funktsioonides kasutatakse atribuuti “const”, mis määrab võimaluse kasutada seda konstantide asemel mis tahes kontekstis:
    • mem::MaybeUninit::as_ptr
    • mem::MaybeUninit::oletame_init
    • mem::MaybeUninit::oletame_init_ref
    • ffi::CStr::from_bytes_with_nul_unchecked

Allikas: opennet.ru

Lisa kommentaar