Rust 1.45 Rhyddhau Iaith Rhaglennu

Cyhoeddwyd rhyddhau 1.45 o iaith raglennu'r system Rust, a sefydlwyd gan brosiect Mozilla. Mae'r iaith yn canolbwyntio ar ddiogelwch cof, yn darparu rheolaeth cof awtomatig, ac yn darparu offer ar gyfer cyflawni cyfochrogrwydd tasg uchel heb ddefnyddio casglwr sbwriel a Rhedeg.

Mae rheolaeth cof awtomatig Rust yn dileu gwallau wrth drin awgrymiadau ac yn amddiffyn rhag problemau sy'n deillio o drin cof lefel isel, megis cyrchu rhanbarth cof ar Γ΄l iddo gael ei ryddhau, dadgyfeiriadau pwyntydd nwl, gor-redeg byffer, ac ati. Mae rheolwr pecyn yn cael ei ddatblygu i ddosbarthu llyfrgelloedd, sicrhau cydosod a rheoli dibyniaethau gan y prosiect. TΓ’l, sy'n eich galluogi i gael y llyfrgelloedd sydd eu hangen ar gyfer y rhaglen mewn un clic. Cefnogir ystorfa i gynnal llyfrgelloedd cewyll.io.

Y prif arloesiadau:

  • Dileu hirsefydlog diffyg wrth berfformio trawsnewidiadau rhwng cyfanrifau a rhifau pwynt arnawf. Gan fod y casglwr Rust yn defnyddio LLVM fel backend, perfformiwyd gweithrediadau trosi math trwy gyfarwyddiadau cod canolraddol LLVM megis fptoui, sydd ag un nodwedd arwyddocaol - ymddygiad heb ei ddiffinio os nad yw'r gwerth canlyniadol yn ffitio i'r math targed. Er enghraifft, wrth drosi'r gwerth arnofio 300 gyda math f32 i fath cyfanrif u8, mae'r canlyniad yn anrhagweladwy a gall amrywio ar systemau gwahanol. Y broblem yw bod y nodwedd hon yn ymddangos mewn cod nad yw wedi'i farcio fel "anniogel".

    O Rust 1.45, mae ymddygiad gorlif maint math yn cael ei reoleiddio'n llym, ac mae'r gweithrediad trosi "fel" yn gwirio am orlif ac yn gorfodi'r gwerth sy'n cael ei drosi i uchafswm neu isafswm gwerth y math targed (ar gyfer yr enghraifft uchod, gwerth o Byddai 300 yn cael ei drosi i 255). I analluogi gwiriadau o'r fath, darperir galwadau API ychwanegol β€œ{f64, f32}::to_int_unchecked”, yn gweithredu mewn modd anniogel.

    fn cast(x: f32) -> u8 {
    x fel u8
    }

    fn prif () {
    gadewch too_big = 300.0;
    gadewch too_small = -100.0;
    gadewch nan = f32::NAN;

    gadewch x: f32 = 1.0;
    gadael y: u8 = anniogel { x.to_int_unchecked() };

    println!( "too_big_casted = {}", cast(too_big)); // allbwn 255
    println!( "too_small_casted = {}", cast(too_small)); // allbwn 0
    println!( "not_a_number_casted = {}", cast(nan)); // allbwn 0
    }

  • Defnyddio sefydlogi macros gweithdrefnolymadroddion tebyg i swyddogaeth, templedi, a datganiadau. Yn flaenorol, ni ellid galw macros o'r fath ym mhobman, ond dim ond mewn rhai rhannau o'r cod (fel galwad ar wahΓ’n, heb ei gydblethu Γ’ chod arall). Roedd ehangu'r ffordd y gellir galw macros, yn debyg i swyddogaethau, yn un o'r gofynion i wneud i fframwaith y we weithio Roced mewn datganiadau sefydlog o Rust. Yn flaenorol, roedd angen hyblygrwydd ychwanegol wrth ddiffinio trinwyr yn Rocket gan alluogi nodwedd arbrofol o'r enw β€œproc_macro_hygiene”, nad yw ar gael mewn fersiynau sefydlog o Rust. Mae'r swyddogaeth hon bellach wedi'i chynnwys mewn datganiadau sefydlog o'r iaith.
  • Caniateir defnyddio ystodau gyda math β€œchar” i ailadrodd dros werthoedd ystod (ops ::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo}):

    ar gyfer ch yn 'a'..='z' {
    print!("{}", ch);
    }
    println!(); // Bydd yn argraffu "abcdefghijklmnopqrstuvwxyz"

  • Mae cyfran newydd o APIs wedi'i drosglwyddo i'r categori sefydlog, gan gynnwys sefydlogi
    Arc:: as_ptr,
    BTreeMap::dileu_mynediad,
    Rc:: as_ptr,
    rc:: Gwan:: as_ptr,
    rc::Gwan::o_raw,
    rc :: Gwan :: i mewn i_raw,
    str::rhagddodiad_strip,
    str:: strip_Γ΄l-ddodiad,
    cysoni :: Gwan :: as_ptr,
    cysoni::Gwan::o_raw,
    cysoni :: Gwan :: i mewn i_raw,
    torgoch::UNICODE_VERSION,
    Rhychwant ::penderfynwyd_at,
    Rhychwant ::leoli_at,
    Rhychwant::safle_cymysg,
    unix::proses::CommandExt::arg0.

  • Mae'r casglwr rustc wedi ychwanegu cefnogaeth ar gyfer diystyru amrywiol nodweddion platfform targed gan ddefnyddio'r faner "target-feature", er enghraifft, "-C target-feature=+avx2,+fma". Mae baneri newydd hefyd wedi'u hychwanegu:
    "gorfodi dad-ddirwyn-tablau" i gynhyrchu tablau galwadau dad-ddirwyn, waeth beth fo'r strategaeth trin damweiniau; "embed-bitcode" i reoli a yw bitcode LLVM wedi'i gynnwys mewn rlibs a gynhyrchir. Mae'r faner "embed-bitcode" wedi'i galluogi yn ddiofyn yn Cargo i wneud y gorau o amser adeiladu a defnydd gofod disg.

  • Mae trydydd lefel o gefnogaeth wedi'i darparu ar gyfer y llwyfannau mipsel-sony-psp a thumbv7a-uwp-windows-msvc. Mae'r drydedd lefel yn cynnwys cymorth sylfaenol, ond heb brofi awtomataidd a chyhoeddi adeiladau swyddogol.

Yn ogystal, gellir ei nodi y stori am greu'r symlaf apps yn yr iaith Rust, gan ddechrau defnyddio cychwynnydd y system ac yn barod i lwytho hunangynhwysol yn lle'r system weithredu.
Yr erthygl yw'r gyntaf mewn cyfres sy'n ymroddedig i arddangos technegau y mae galw amdanynt mewn rhaglennu lefel isel a datblygu OS.

Ffynhonnell: opennet.ru

Ychwanegu sylw