Rust 1.45 programmēŔanas valodas izlaidums

publicēts sistēmas programmÄ“Å”anas valodas versija 1.45 RÅ«sa, ko dibināja Mozilla projekts. Valoda koncentrējas uz atmiņas droŔību, nodroÅ”ina automātisku atmiņas pārvaldÄ«bu un nodroÅ”ina rÄ«kus augsta uzdevumu paralēlisma sasniegÅ”anai, neizmantojot atkritumu savācēju un runtime.

Rust automātiskā atmiņas pārvaldÄ«ba novērÅ” kļūdas, manipulējot ar rādÄ«tājiem, un aizsargā pret problēmām, kas rodas no zema lÄ«meņa atmiņas manipulācijām, piemēram, piekļuves atmiņas apgabalam pēc tā atbrÄ«voÅ”anas, nulles rādÄ«tāju novirzēm, bufera pārtēriņiem utt. Tiek izstrādāts pakotņu pārvaldnieks, lai izplatÄ«tu bibliotēkas, nodroÅ”inātu montāžu un pārvaldÄ«tu projekta atkarÄ«bas. krava, kas ļauj ar vienu klikŔķi iegÅ«t programmai nepiecieÅ”amās bibliotēkas. Repozitorijs tiek atbalstÄ«ts bibliotēku mitināŔanai crates.io.

Galvenais jauninājumiem:

  • Likvidēts ilgstoÅ”i trÅ«kums veicot konvertÄ“Å”anu starp veseliem skaitļiem un peldoŔā komata skaitļiem. Tā kā Rust kompilators izmanto LLVM kā aizmugursistēmu, tipa konvertÄ“Å”anas darbÄ«bas tika veiktas, izmantojot LLVM starpposma koda instrukcijas, piemēram, fptoui, kuriem ir viena bÅ«tiska iezÄ«me ā€“ nedefinēta uzvedÄ«ba, ja iegÅ«tā vērtÄ«ba neatbilst mērÄ·a tipam. Piemēram, pārveidojot peldoÅ”o vērtÄ«bu 300 ar tipu f32 par veselu skaitļa tipu u8, rezultāts ir neparedzams un dažādās sistēmās var atŔķirties. Problēma ir tāda, ka Ŕī funkcija parādās kodā, kas nav atzÄ«mēts kā ā€œnedroÅ”sā€.

    Sākot ar versiju Rust 1.45, tipa lieluma pārpildes darbÄ«ba ir stingri regulēta, un konvertÄ“Å”anas operācija ā€œkāā€ pārbauda, ā€‹ā€‹vai nav pārpildÄ«ta, un piespiež vērtÄ«bu konvertēt uz mērÄ·a tipa maksimālo vai minimālo vērtÄ«bu (iepriekÅ” minētajā piemērā, vērtÄ«ba 300 tiktu pārvērsti par 255). Lai atspējotu Ŕādas pārbaudes, tiek nodroÅ”ināti papildu API izsaukumi ā€œ{f64, f32}::to_int_uncheckedā€, kas darbojas nedroÅ”ajā režīmā.

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

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

    pieņemsim x: f32 = 1.0;
    let y: u8 = nedroŔs { x.to_int_unchecked() };

    println!("too_big_casted = {}", cast(pārāk_liels)); // izeja 255
    println!("too_small_casted = {}", cast(pārāk_mazs)); // izvade 0
    println!("not_a_number_casted = {}", cast(nan)); // izvade 0
    }

  • Izmantojiet stabilizētu procesuālie makrofunkcijām lÄ«dzÄ«gas izteiksmes, veidnes un priekÅ”raksti. IepriekÅ” Ŕādus makro nevarēja izsaukt visur, bet tikai atseviŔķās koda daļās (kā atseviŔķs izsaukums, nevis savÄ«ts ar citu kodu). Makro izsaukÅ”anas veida paplaÅ”ināŔana, lÄ«dzÄ«gi kā funkcijas, bija viena no prasÄ«bām, lai tÄ«mekļa ietvars darbotos. RaÄ·ete Rust stabilajos izlaidumos. IepriekÅ”, lai panāktu papildu elastÄ«bu, definējot apstrādātājus programmā Rocket, bija jāiespējo eksperimentāls lÄ«dzeklis ar nosaukumu ā€œproc_macro_hygieneā€, kas nav pieejams Rust stabilajās versijās. Å Ä« funkcionalitāte tagad ir iebÅ«vēta valodas stabilajos laidienos.
  • Atļauts izmantot diapazonus ar veidu ā€œcharā€, lai atkārtotu diapazona vērtÄ«bas (operācijas::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo}):

    ch 'a'..='z' {
    drukāt!("{}", ch);
    }
    println!(); // Drukās "abcdefghijklmnopqrstuvwxyz"

  • Jauna API daļa ir pārcelta uz stabilo kategoriju, tostarp stabilizētā
    Arc::as_ptr,
    BTreeMap::remove_entry,
    Rc::as_ptr,
    rc::VājŔ::as_ptr,
    rc::VājŔ::from_raw,
    rc::VājŔ::into_raw,
    str:: strip_prefix,
    str:: strip_suffix,
    sinhronizācija::VājŔ::as_ptr,
    sinhronizācija::VājŔ::from_raw,
    sinhronizēt::VājÅ”::into_raw,
    char::UNICODE_VERSION,
    Span::resolved_at,
    Span::located_at,
    Span::mixed_site,
    unix::process::CommandExt::arg0.

  • Rustc kompilators ir pievienojis atbalstu dažādu mērÄ·a platformas funkciju ignorÄ“Å”anai, izmantojot karogu "target-feature", piemēram, "-C target-feature=+avx2,+fma". Ir pievienoti arÄ« jauni karogi:
    "force-unwind-tables", lai Ä£enerētu attÄ«Å”anas zvanu tabulas neatkarÄ«gi no avāriju apstrādes stratēģijas; "embed-bitcode", lai kontrolētu, vai LLVM bitkods ir iekļauts Ä£enerētajos rlibs. Karogs "embed-bitcode" ir iespējots pēc noklusējuma Cargo, lai optimizētu izveides laiku un diska vietas patēriņu.

  • TreÅ”ais atbalsta lÄ«menis ir nodroÅ”ināts platformām mipsel-sony-psp un thumbv7a-uwp-windows-msvc. TreÅ”ais lÄ«menis ietver pamata atbalstu, taču bez automatizētas testÄ“Å”anas un oficiālo bÅ«vējumu publicÄ“Å”anas.

Turklāt var atzÄ«mēt stāsts par vienkārŔākā radÄ«Å”anu progr Rust valodā, sākot lietot sistēmas sāknÄ“Å”anas ielādi un gatavs patstāvÄ«gai ielādei operētājsistēmas vietā.
Å is raksts ir pirmais no sērijas, kas veltÄ«ta tādu paņēmienu demonstrÄ“Å”anai, kas ir pieprasÄ«ti zema lÄ«meņa programmÄ“Å”anas un OS izstrādes jomā.

Avots: opennet.ru

Pievieno komentāru