Rust 1.51 Programming Language Release

Ang paglabas ng system programming language na Rust 1.51, na itinatag ng proyekto ng Mozilla, ngunit ngayon ay binuo sa ilalim ng tangkilik ng independiyenteng non-profit na organisasyon na Rust Foundation, ay nai-publish. Nakatuon ang wika sa kaligtasan ng memorya, nagbibigay ng awtomatikong pamamahala ng memorya, at nagbibigay ng paraan upang makamit ang mataas na parallelism ng gawain nang hindi gumagamit ng garbage collector o runtime (runtime ay binabawasan sa pangunahing pagsisimula at pagpapanatili ng karaniwang library).

Ang awtomatikong pamamahala ng memorya ng Rust ay nagliligtas sa developer mula sa mga error kapag nagmamanipula ng mga pointer at pinoprotektahan laban sa mga problemang lumitaw dahil sa mababang antas ng pagmamanipula ng memorya, tulad ng pag-access sa isang lugar ng memorya pagkatapos itong mapalaya, pag-derefer ng mga null pointer, pag-overrun ng buffer, atbp. Upang ipamahagi ang mga aklatan, magbigay ng mga build at pamahalaan ang mga dependency, bubuo ang proyekto ng Cargo package manager. Ang crates.io repository ay suportado para sa pagho-host ng mga aklatan.

Mga pangunahing inobasyon:

  • Ang functionality na nauugnay sa paggamit ng constant generics ay nakatanggap ng status ng isang minimum viable product (MVP), na nagbibigay ng berdeng ilaw para sa malawakang paggamit. Ang mga const generic ay nagbibigay-daan sa mga uri na maging pangkalahatan sa mga pare-parehong halaga, i.e. gumamit ng mga generic na argumento na limitado sa isang hanay ng mga pare-parehong halaga, hindi mga uri o habambuhay. Binibigyang-daan ka ng feature na ito na gumamit ng mga integer-parameterized na uri at abstraction kapag lumilikha ng mga katangian para sa mga array ng anumang laki nang hindi kinakailangang gumawa ng hiwalay na uri para sa bawat hanay ng mga wastong halaga upang matiyak na ang hanay ay hindi nasa labas ng hangganan.

    Simula sa kasalukuyang release, para sa mga array na may uri na β€œ[T; N]" (uri T at laki N) ay nagbibigay ng kakayahang mag-abstract ng uri at laki gamit ang mga value na may anumang uri ng integer, boolean at character (hindi pa sinusuportahan ang mga uri ng struct at enum). Ang patuloy na generics ay lubos na nagpapasimple sa pagbuo ng library; halimbawa, para gumamit ng array na hindi nakatali sa isang partikular na uri at laki, maaari mong tukuyin ang: struct Array { // ^^^^^^^^^^^^^^^^^^^ kahulugan ng isang palaging generic na listahan: [T; HABA] // ^^^^^^ gamit nito }

    Kapag aktwal na ginamit sa kahulugang ito ng "Array Β» bubuo ang compiler ng monomorphic na bersyon ng Array: struct Array { listahan: [u8; 32] }

  • Ang std::array::IntoIter API, batay sa patuloy na generics, ay na-stabilize, kung saan maaari kang lumikha ng mga iterator ayon sa halaga para sa anumang array: fn main() { let array = [1, 2, 3, 4, 5] ; // Dati, para umulit sa isang value, kailangan mong tawagan ang .iter() method para sa item sa array.iter().copied() { println!("{}", item); } // Ngayon ay maaari mong tukuyin para sa item sa std::array::IntoIter::new(array) { println!("{}", item); } }
  • Sinusuportahan na ngayon ng cargo package manager ang isang bagong solver field sa Cargo.toml, na magagamit para paganahin ang pangalawang bersyon ng feature resolver. Iniiwasan ng bagong bersyon ng definer ang pagsasama-sama ng mga feature ng dependency na nakalista sa seksyong "[features]" kung saan hindi naaangkop, halimbawa, kapag nagsasama ng dependency na humihiling ng ilang standard na feature sa mga build script at macro, ngunit kapag gumagamit ng hindi standard na feature. sa resultang executable file .

    Hanggang ngayon, pinagsama-sama ang mga kakayahan ng isang package na binanggit nang maraming beses sa dependency graph. Halimbawa, kung ang isang proyekto ay may kasamang dependency foo na tumutukoy sa mga kakayahan A at B, at ang package na ito ay ginagamit sa iba pang mga package bar at baz, kahit na ang bar ay nakasalalay sa foo na may tampok na A, at ang baz ay nakasalalay sa foo na may tampok na B, kung gayon ang resulta ay pagsasamahin ng kargamento ang mga feature na ito at isasama ang foo na may kasamang mga feature na A at B. Maaaring magresulta ang paraang ito sa isang feature na pinagana dahil sa ilang dependency na hindi tugma sa target na system kung saan ginawa ang resultang build. Halimbawa, kapag gusto mong gumamit ng bersyon ng foo na may "#![no_std]" sa isang executable na binuo gamit ang "#![no_std]", at sa parehong oras gumamit ng foo na may "std" sa panahon ng build in build. rs. Kapag tinukoy ang resolver="2" sa Cargo.toml, susubukan na ngayon ng manager ng package na pangasiwaan nang tama ang conflict na ito, na naghihiwalay sa dev, host at target na mga dependency.

  • Ipinapatupad ng kargamento ang opsyong split-debuginfo, itinakda sa seksyong β€œ[profile],” at ang kaukulang bandilang β€œ-Csplit-debuginfo=unpacked” sa rustc, na nag-aalok ng pagpapatupad ng bagong paraan para sa pag-save ng impormasyon sa pag-debug, na nag-aalis ng pangangailangang tawagan ang dsymutil utility at makabuluhang pinabilis ang proseso ng pagbuo gamit ang impormasyon sa pag-debug sa macOS.
  • Stabilized makos "ptr::addr_of!" at β€œptr::addr_of_mut!”, na nagbibigay-daan sa iyong lumikha ng mga hilaw na pointer para sa mga hindi nakahanay na field. gumamit ng std::ptr; #[repr(packed)] struct Naka-pack na { f1: u8, f2: u16, } let naka-pack = Naka-pack { f1: 1, f2: 2 }; // &packed.f2 ay lilikha ng hindi nakahanay na pointer na humahantong sa hindi natukoy na gawi hayaan raw_f2 = ptr::addr_of!(packed.f2); assert_eq!(unsafe { raw_f2.read_unaaligned() }, 2);
  • Ang isang bagong bahagi ng API ay inilipat sa stable na kategorya, kabilang ang mga sumusunod na pamamaraan ay na-stabilize:
    • Arc::decrement_strong_count
    • Arc::increment_strong_count
    • Once::call_once_force
    • Peekable::next_if_eq
    • Peekable::next_if
    • Maghanap::stream_position
    • array::IntoIter
    • panic::panic_any
    • ptr::addr_of!
    • ptr::addr_of_mut!
    • slice::fill_with
    • slice::split_inclusive_mut
    • slice::split_inclusive
    • slice::strip_prefix
    • slice::strip_suffix
    • str::split_inclusive
    • sync::OnceState
    • gawain::Gumising
  • Ang ikatlong antas ng suporta ay ipinatupad para sa i386-unknown-linux-gnu, i486-unknown-linux-gnu, aarch64_be-unknown-linux-gnu, aarch64-unknown-linux-gnu_ilp32 at aarch64_be-unknown-linux-gnu_ilp32 platform . Ang ikatlong antas ay nagsasangkot ng pangunahing suporta, ngunit walang automated na pagsubok, paglalathala ng mga opisyal na build, at pag-verify ng code buildability.

Pinagmulan: opennet.ru

Magdagdag ng komento