Inilabas ang Rust 1.53. Popondohan ng Google ang pagdaragdag ng suporta sa Rust sa Linux kernel

Ang paglabas ng system programming language na Rust 1.53, 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:

  • Para sa mga array, ang IntoIterator trait ay ipinatupad, na nagbibigay-daan sa iyo upang ayusin ang pag-ulit ng mga elemento ng array ayon sa mga halaga: para sa i sa [1, 2, 3] { .. }

    Posible ring ipasa ang mga arrays sa mga pamamaraan na tumatanggap ng mga iterator, halimbawa: let set = BTreeSet::from_iter([1, 2, 3]); para sa (a, b) sa some_iterator.chain([1]).zip([1, 2, 3]) { .. }

    Noong nakaraan, ang IntoIterator ay ipinatupad lamang para sa mga sanggunian ng array, i.e. upang umulit sa mga halaga ay nangangailangan ng paggamit ng mga sanggunian (β€œ&[1, 2, 3]”) o β€œ[1, 2, 3].iter()”. Ang pagpapatupad ng IntoIterator para sa mga array ay nahadlangan ng mga isyu sa compatibility na dulot ng isang naunang conversion ng compiler mula sa array.into_iter() hanggang sa (&array).into_iter(). Ang mga problemang ito ay nalutas sa pamamagitan ng isang workaround - ang compiler ay patuloy na magko-convert ng array.into_iter() sa (&array).into_iter() na parang walang pagpapatupad ng IntoIterator trait, ngunit kapag tumatawag lamang sa pamamaraan gamit ang ".into_iter() )" syntax at nang hindi hinahawakan ang mga tawag sa form na "sa [1, 2, 3]", "iter.zip([1, 2, 3])", "IntoIterator::into_iter([1, 2, 3] )".

  • Posibleng tukuyin ang mga expression na "|" (lohikal O operasyon) sa anumang bahagi ng template, halimbawa, sa halip na β€œIlan(1) | Some(2)" maaari mo na ngayong isulat ang "Some(1 | 2)": match result { Ok(Some(1 | 2)) => { .. } Err(MyError { kind: FileNotFound | PermissionDenied, .. }) => { .. } _ => { .. } }
  • Ang paggamit ng mga hindi ASCII na character sa mga identifier ay pinahihintulutan, kabilang ang anumang pambansang character na tinukoy sa detalye ng Unicode UAX 31, ngunit hindi kasama ang mga emoji character. Kung gagamit ka ng magkaiba ngunit magkatulad na mga character, maglalabas ng babala ang compiler. const BLΓ…HAJ: &str = "🦈"; struct δΊΊ { 名字: String, } let Ξ± = 1; letsos = 2; babala: identifier pair na itinuturing na malito sa pagitan ng 's' at 's'
  • Isang bagong bahagi ng mga API ang inilipat sa stable na kategorya, kabilang ang mga sumusunod na na-stabilize:
    • array::from_ref
    • array::from_mut
    • AtomicBool::fetch_update
    • AtomicPtr::fetch_update
    • BtreeSet::retain
    • BtreeMap::retain
    • BufReader::seek_relative
    • cmp::min_by
    • cmp::min_by_key
    • cmp::max_by
    • cmp::max_by_key
    • DebugStruct::finish_non_exhaustive
    • Tagal::ZERO
    • Tagal::MAX
    • Tagal::is_zero
    • Tagal::saturating_add
    • Tagal::saturating_sub
    • Tagal::saturating_mul
    • f32::ay_subnormal
    • f64::ay_subnormal
    • IntoIterator para sa mga array
    • {integer}::BITS
    • io::Error::Hindi suportado
    • NonZero*::leading_zeros
    • NonZero*::trailing_zeros
    • Pagpipilian::insert
    • Pag-order::is_eq
    • Pag-order::is_ne
    • Pag-order::is_lt
    • Pag-order::is_gt
    • Pag-order::is_le
    • Pag-order::is_ge
    • OsStr::make_ascii_lowercase
    • OsStr::make_ascii_uppercase
    • OsStr::to_ascii_lowercase
    • OsStr::to_ascii_uppercase
    • OsStr::is_ascii
    • OsStr::eq_ignore_ascii_case
    • Peekable::peek_mut
    • Rc::increment_strong_count
    • Rc::decrement_strong_count
    • slice::IterMut::as_slice
    • AsRef<[T]> para sa slice::IterMut
    • impl SliceIndex para sa (Bound , Nakatali )
    • Vec::extend_from_within
  • Naipatupad na ang ikatlong antas ng suporta para sa wasm64-unknown-unknown platform. Ang ikatlong antas ay nagsasangkot ng pangunahing suporta, ngunit walang automated na pagsubok, pag-publish ng mga opisyal na build, o pagsuri kung ang code ay maaaring buuin.
  • Ang Cargo package manager ay inilipat upang gamitin ang pangalang "pangunahing" para sa pangunahing sangay ng Git repository (HEAD) bilang default. Ang mga dependency na naka-host sa mga repository na gumagamit ng pangunahing pangalan sa halip na master ay hindi na nangangailangan ng branch = "pangunahing" na i-configure.
  • Sa compiler, ang mga kinakailangan para sa minimum na bersyon ng LLVM ay itinaas sa LLVM 10.

Bukod pa rito, mapapansin natin ang probisyon ng pagpopondo para sa pagbuo ng pagsasama sa Linux kernel ng mga tool para sa pagbuo ng mga bahagi sa Rust na wika. Ang gawain ay isasagawa sa loob ng balangkas ng proyekto ng Prossimo sa ilalim ng tangkilik ng ISRG na organisasyon (Internet Security Research Group), na siyang nagtatag ng proyektong Let's Encrypt at nagpo-promote ng HTTPS at ang pagbuo ng mga teknolohiya upang mapataas ang seguridad ng Internet. Ang mga pondo ay ibibigay ng Google, na magbabayad para sa gawain ni Miguel Ojeda, ang may-akda ng proyektong Rust-for-Linux. Dati, pinondohan na ng ISRG at Google ang paglikha ng alternatibong HTTP backend para sa curl utility at ang pagbuo ng bagong TLS module para sa Apache http server.

Ayon sa Microsoft at Google, humigit-kumulang 70% ng mga kahinaan ay sanhi ng hindi ligtas na paghawak ng memorya. Inaasahan na ang paggamit ng Rust na wika upang bumuo ng mga bahagi ng kernel tulad ng mga driver ng device ay magbabawas sa panganib ng mga kahinaan na dulot ng hindi ligtas na paghawak ng memorya at mag-aalis ng mga error tulad ng pag-access sa isang rehiyon ng memorya pagkatapos na ito ay mapalaya at lumampas sa mga hangganan ng buffer.

Ang kaligtasan ng memorya ay ibinibigay sa Rust sa oras ng pag-compile sa pamamagitan ng pagsuri sa sanggunian, pagsubaybay sa pagmamay-ari ng bagay at panghabambuhay ng bagay (saklaw), gayundin sa pamamagitan ng pagsusuri ng kawastuhan ng pag-access sa memorya sa panahon ng pagpapatupad ng code. Nagbibigay din ang kalawang ng proteksyon laban sa mga overflow ng integer, nangangailangan ng mandatoryong pagsisimula ng mga variable na halaga bago gamitin, mas mahusay na pinangangasiwaan ang mga error sa karaniwang library, inilalapat ang konsepto ng hindi nababagong mga sanggunian at mga variable bilang default, nag-aalok ng malakas na static na pag-type upang mabawasan ang mga lohikal na error.

Pinagmulan: opennet.ru

Magdagdag ng komento