Lëshimi i gjuhës programuese Rust 1.45

Publikuar lëshimi 1.45 i gjuhës së programimit sistemik Rust, e bazuar në projektin Mozilla. Gjuha fokusohet në sigurinë e menaxhimit të memories, siguron menaxhim automatik të memories dhe ofron mjete për arritjen e një paralelizmi të lartë në ekzekutimin e detyrave, duke u shmangur kështu përdorimit të mbledhësve të plehrave dhe runtime.

Menaxhimi automatizuar i memories në Rust e çliron zhvilluesin nga gabimet gjatë manipulimit të treguesve dhe mbron nga problemet që lindin nga puna e ulët me kujtesën, si qasja në një zonë kujtese pas çlirimit të saj, dereferencimi i treguesve null, dalja jashtë kufijve të buffers dhe të tjera. Për shpërndarjen e bibliotekave, sigurimin e ndërtimit dhe menaxhimin e varësive, po zhvillohet menaxheri i paketave. Cargo, që lejon shfrytëzimin e bibliotekave të nevojshme për programin me një klik. Për vendosjen e bibliotekave, mbështetet repository crates.io.

Ndryshimet kryesore risitë:

  • Eliminimi i njĂ« defekti tĂ« vjetĂ«r nĂ« kryerjen e konvertimeve midis numrave tĂ« plotĂ« dhe numrave me pikĂ« tĂ« lĂ«vizshme. Duke qenĂ« se kompajleri Rust pĂ«rdor LLVM si backend, operacionet e konvertimit tĂ« tipeve u ekzekutuan pĂ«rmes instruksioneve tĂ« kodit mesatar LLVM, si nĂ« pĂ«rfundimin e transformimeve midis numrave tĂ« plotĂ« dhe numrave me presje lundruese. Duke qenĂ« se kompajleri Rust pĂ«rdor LLVM si backend, operacionet e transformimit tĂ« tipeve janĂ« kryer pĂ«rmes instruksioneve tĂ« kodit tĂ« mesĂ«m LLVM, tĂ« tilla si fptoui, tĂ« cilat kanĂ« njĂ« karakteristikĂ« tĂ« rĂ«ndĂ«sishme — sjellje tĂ« papĂ«rcaktuar nĂ«se vlera e rezultatit nuk pĂ«rshtatet nĂ« tipin e synuar. PĂ«r shembull, kur konvertohet njĂ« vlerĂ« reale 300 me tipin f32 nĂ« njĂ« tip tĂ« plotĂ« u8 rezultati Ă«shtĂ« i paparashikueshĂ«m dhe mund tĂ« ndryshojĂ« nĂ« sisteme tĂ« ndryshme. Problemi Ă«shtĂ« se njĂ« karakteristikĂ« e tillĂ« shfaqet nĂ« kodin qĂ« nuk Ă«shtĂ« etiketuar si «unsafe».

    Filluar nga Rust 1.45, sjellja në rast të tepricës së madhësisë së tipit rregullohet në mënyrë të ngurtë, dhe operacioni i konvertimit «as» kryen një kontroll për tejkalim dhe sjell vlerën e konvertuar në vlerën maksimale ose minimale të tipit të synuar (për shembullin e përmendur më lart, vlera 300 do të konvertohet në 255). Për të çaktivizuar kontrollin e tillë, ofrohen thirrje të tjera API «{f64, f32}::to_int_unchecked», të cilat punojnë në modin unsafe.

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

    fn main() {
    let too_big = 300.0;
    let too_small = -100.0;
    let nan = f32::NAN;

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

    println!(«too_big_casted = {}», cast(too_big)); // në dalje 255
    println!(«too_small_casted = {}», cast(too_small)); // në dalje 0
    println!(«not_a_number_casted = {}», cast(nan)); // në dalje 0
    }

  • Stabilizimi i pĂ«rdorimit makro procedurale, tĂ« ngjashme me funksionet, nĂ« shprehje, modele dhe deklarata. MĂ« parĂ«, makrotĂ« e tilla mund tĂ« thirreshin jo gjithandej, por vetĂ«m nĂ« pjesĂ« tĂ« caktuara tĂ« kodit (nĂ« thirrje tĂ« veçanta, tĂ« pa lidhura me kodin tjetĂ«r). Zgjerimi i mĂ«nyrave tĂ« thirrjes sĂ« makrove, tĂ« ngjashme me funksionet, ishte njĂ« nga gjĂ«rat qĂ« duhej pĂ«r tĂ« siguruar funksionimin e web-framwork-ut Rocket nĂ« lĂ«shimet stabile tĂ« Rust. MĂ« parĂ«, pĂ«r tĂ« arritur fleksibilitet shtesĂ« nĂ« caktimin e trajtuesve nĂ« Rocket kĂ«rkohej aktivizimi i njĂ« mundĂ«sie eksperimentale 'proc_macro_hygiene', e cila nuk ishte e disponueshme nĂ« lĂ«shimet stabile tĂ« Rust. Tani, funksionaliteti i pĂ«rmendur Ă«shtĂ« i pĂ«rfshirĂ« nĂ« lĂ«shimet stabile tĂ« gjuhĂ«s.
  • Lejohet pĂ«rdorimi i intervaleve me tipin 'char' pĂ«r tĂ« kaluar vlerat e intervalit (ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo}):

    for ch in ‘a’..=’z’ {
    print!("{}", ch);
    }
    println!(); // Do të printohet "abcdefghijklmnopqrstuvwxyz"

  • NĂ« kategorinĂ« stabile Ă«shtĂ« pĂ«rkthyer njĂ« grup i ri API-sh, duke stabilizuar
    Arc::as_ptr,
    BTreeMap::remove_entry,
    Rc::as_ptr,
    rc::Weak::as_ptr,
    rc::Weak::from_raw,
    rc::Weak::into_raw,
    str::strip_prefix,
    str::strip_suffix,
    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.
  • NĂ« kompilatorin rustc Ă«shtĂ« shtuar mbĂ«shtetje pĂ«r rindĂ«rtimin e mundĂ«sive tĂ« ndryshme tĂ« platformĂ«s sĂ« targetit duke pĂ«rdorur flamurin «target-feature», pĂ«r shembull, «-C target-feature=+avx2,+fma». Gjithashtu janĂ« shtuar flamuj tĂ« rinj:
    «force-unwind-tables» për gjenerimin e tabelave të thirrjeve «të kthyer» (unwind), pavarësisht nga strategjia e përpunimit të crash-it; «embed-bitcode» për të kontrolluar përfshirjen e bitcode LLVM në rlibs që gjenerohen. Flamuri «embed-bitcode» është aktivizuar nga e drejta në Cargo për optimizimin e kohës së ndërtimit dhe konsumit të hapësirës në disk.
  • ËshtĂ« siguruar niveli i tretĂ« i mbĂ«shtetjes pĂ«r platformat mipsel-sony-psp dhe thumbv7a-uwp-windows-msvc. Niveli i tretĂ« nĂ«nkupton mbĂ«shtetje bazike, por pa testim automatizuar dhe publikimin e ndĂ«rtimeve zyrtare.

Për më tepër, mund të theksohet historik për krijimin e një aplikacioni më të thjeshtë aplikacione në gjuhën Rust, që fillon me ndihmën e bootloader-it sistemor dhe është i gatshëm për ngarkesë të vetë-mjaftueshme në vend të një sistemi operativ.
Artikulli është i pari në një seri që është e përkushtuar për të demonstruar teknikat që janë të kërkuara në programimin me nivel të ulët dhe në zhvillimin e OS-ve.

Burimi: opennet.ru

Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« đŸ”„ Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« | ProHoster