Izdaja programskega jezika Rust 1.45

Objavljeno izdaja 1.45 sistemskega programskega jezika Rust, ki ga je ustanovil projekt Mozilla. Jezik se osredotoča na varnost pomnilnika, zagotavlja samodejno upravljanje pomnilnika in ponuja orodja za doseganje visoke vzporednosti nalog brez uporabe zbiralnika smeti in runtime.

Samodejno upravljanje pomnilnika Rust odpravlja napake pri manipulaciji s kazalci in ščiti pred težavami, ki izhajajo iz manipulacije s pomnilnikom na nizki ravni, kot je dostop do območja pomnilnika, potem ko je bilo osvobojeno, dereferenciranje ničelnega kazalca, prekoračitev medpomnilnika itd. Upravljalnik paketov se razvija za distribucijo knjižnic, zagotavljanje sestavljanja in upravljanje odvisnosti s projektom. Cargo, ki vam omogoča, da z enim klikom pridobite knjižnice, ki jih potrebujete za program. Repozitorij je podprt za gostovanje knjižnic zaboji.io.

Glavni inovacije:

  • Dolgotrajno odpravljeno napaka pri izvajanju pretvorb med celimi števili in števili s plavajočo vejico. Ker prevajalnik Rust uporablja LLVM kot zaledje, so bile operacije pretvorbe tipa izvedene prek navodil vmesne kode LLVM, kot je fptoui, ki imajo eno pomembno lastnost - nedefinirano vedenje, če dobljena vrednost ne ustreza ciljni vrsti. Na primer, pri pretvorbi plavajoče vrednosti 300 s tipom f32 v celoštevilski tip u8 je rezultat nepredvidljiv in se lahko razlikuje v različnih sistemih. Težava je v tem, da se ta funkcija pojavi v kodi, ki ni označena kot »nevarna«.

    Od Rust 1.45 je vedenje prelivanja velikosti tipa strogo regulirano, operacija pretvorbe "as" pa preverja prelivanje in prisili vrednost, ki se pretvori v največjo ali najmanjšo vrednost ciljnega tipa (za zgornji primer vrednost 300 bi se pretvorilo v 255). Za onemogočanje takih preverjanj so na voljo dodatni klici API-ja »{f64, f32}::to_int_unchecked«, ki delujejo v nevarnem načinu.

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

    fn main() {
    pusti preveč_veliko = 300.0;
    naj preveč_majhen = -100.0;
    naj nan = f32::NAN;

    naj x: f32 = 1.0;
    let y: u8 = unsafe { x.to_int_unchecked() };

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

  • Uporabite stabilizirano proceduralni makrifunkcijam podobni izrazi, predloge in izjave. Prej takih makrov ni bilo mogoče klicati povsod, ampak le v določenih delih kode (kot ločen klic, ki ni prepleten z drugo kodo). Razširitev načina klicanja makrov, podobno kot funkcij, je bila ena od zahtev za delovanje spletnega ogrodja Rocket v stabilnih izdajah Rust. Prej je bilo za doseganje dodatne prilagodljivosti pri definiranju rokovalcev v Rocket treba omogočiti poskusno funkcijo, imenovano »proc_macro_hygiene«, ki ni na voljo v stabilnih različicah Rust. Ta funkcionalnost je zdaj vgrajena v stabilne izdaje jezika.
  • Dovoljeno je uporabljati obsege s tipom »char« za ponavljanje vrednosti obsega (ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo}):

    za ch v 'a'..='z' {
    natisni!("{}", ch);
    }
    println!(); // Natisne "abcdefghijklmnopqrstuvwxyz"

  • Nov del API-jev je bil prenesen v kategorijo stabilnih, vključno s stabiliziranimi
    Arc::as_ptr,
    BTreeMap::remove_entry,
    Rc::as_ptr,
    rc::Sibek::as_ptr,
    rc::Sibek::from_raw,
    rc::Sibek::into_raw,
    str::strip_prefix,
    str::strip_pripona,
    sync::Weak::as_ptr,
    sync::Weak::from_raw,
    sync::Weak::into_raw,
    char::UNICODE_VERSION,
    Span::resolved_at,
    Span::located_at,
    Span::mixed_site,
    unix::process::CommandExt::arg0.

  • Prevajalnik rustc je dodal podporo za preglasitev različnih funkcij ciljne platforme z uporabo zastavice "target-feature", na primer "-C target-feature=+avx2,+fma". Dodane so bile tudi nove zastavice:
    "force-unwind-tables" za ustvarjanje tabel za sprostitev klicev, ne glede na strategijo obravnavanja zrušitve; "embed-bitcode" za nadzor, ali je bitna koda LLVM vključena v ustvarjene rlib. Zastavica "embed-bitcode" je privzeto omogočena v programu Cargo za optimizacijo časa gradnje in porabe prostora na disku.

  • Tretja raven podpore je bila zagotovljena za platformi mipsel-sony-psp in thumbv7a-uwp-windows-msvc. Tretja raven vključuje osnovno podporo, vendar brez avtomatiziranega testiranja in objave uradnih gradenj.

Poleg tega je mogoče opozoriti zgodba o ustvarjanju najpreprostejšega aplikacije v jeziku Rust, ki začne uporabljati sistemski zagonski nalagalnik in je pripravljen na samostojno nalaganje namesto operacijskega sistema.
Članek je prvi v seriji, ki je namenjena prikazovanju tehnik, ki so v povpraševanju pri nizkonivojskem programiranju in razvoju OS.

Vir: opennet.ru

Dodaj komentar