Rust 1.58 Programming Language Release

Ang paglabas ng pangkalahatang layunin na programming language na Rust 1.58, 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:

  • Sa mga bloke ng pag-format ng linya, bilang karagdagan sa dating magagamit na kakayahang palitan ang mga variable na tahasang nakalista pagkatapos ng isang linya ayon sa numero at pangalan, ipinapatupad ang kakayahang palitan ang mga arbitrary na identifier sa pamamagitan ng pagdaragdag ng expression na "{identifier}" sa linya. Halimbawa: // Mga dating sinusuportahang construction: println!("Hello, {}!", get_person()); println!("Kumusta, {0}!", get_person()); println!("Kumusta, {tao}!", tao = get_person()); // ngayon ay maaari mong tukuyin ang let person = get_person(); println!("Kumusta, {tao}!");

    Maaari ding direktang tukuyin ang mga identifier sa mga opsyon sa pag-format. hayaan (lapad, katumpakan) = get_format(); para sa (pangalan, marka) sa get_scores() { println!("{pangalan}: {score:width$.precision$}"); }

    Gumagana ang bagong pagpapalit sa lahat ng macro na sumusuporta sa kahulugan ng format ng string, maliban sa "panic!" sa 2015 at 2018 na bersyon ng Rust language, kung saan ang panic!("{ident}") ay itinuturing bilang isang regular na string (sa Rust 2021 gumagana ang pagpapalit).

  • Ang pag-uugali ng std::process::Command structure sa Windows platform ay binago upang kapag nagsasagawa ng mga command, para sa mga kadahilanang pangseguridad, hindi na ito naghahanap ng mga executable na file sa kasalukuyang direktoryo. Ang kasalukuyang direktoryo ay hindi kasama dahil maaari itong magamit upang magsagawa ng malisyosong code kung ang mga programa ay pinapatakbo sa hindi pinagkakatiwalaang mga direktoryo (CVE-2021-3013). Ang bagong executable detection logic ay nagsasangkot ng paghahanap sa mga direktoryo ng Rust, direktoryo ng application, direktoryo ng Windows system, at mga direktoryo na tinukoy sa variable ng kapaligiran ng PATH.
  • Pinalawak ng karaniwang library ang bilang ng mga function na may markang "#[must_use]" para magbigay ng babala kung babalewalain ang return value, na tumutulong na matukoy ang mga error na dulot ng pag-aakalang magbabago ng value ang isang function sa halip na magbalik ng bagong value.
  • Ang isang bagong bahagi ng API ay inilipat sa kategorya ng stable, kabilang ang mga pamamaraan at pagpapatupad ng mga katangian ay na-stabilize:
    • Metadata::is_symlink
    • Path::is_symlink
    • {integer}::saturating_div
    • Pagpipilian::unwrap_unchecked
    • Resulta::unwrap_unchecked
    • Resulta::unwrap_err_unchecked
  • Ang katangiang "const", na tumutukoy sa posibilidad na gamitin ito sa anumang konteksto sa halip na mga constant, ay ginagamit sa mga function:
    • Tagal::bago
    • Tagal::checked_add
    • Tagal::saturating_add
    • Tagal::checked_sub
    • Tagal::saturating_sub
    • Tagal::checked_mul
    • Tagal::saturating_mul
    • Tagal::checked_div
  • Pinapayagan ang dereferencing ng "*const T" na mga pointer sa "const" na konteksto.
  • Sa Cargo package manager, ang rust_version field ay naidagdag sa package metadata, at ang "--message-format" na opsyon ay naidagdag sa "cargo install" command.
  • Ang compiler ay nagpapatupad ng suporta para sa mekanismo ng proteksyon ng CFI (Control Flow Integrity), na nagdaragdag ng mga pagsusuri bago ang bawat hindi direktang tawag para makita ang ilang uri ng hindi natukoy na pag-uugali na posibleng humantong sa isang paglabag sa normal na utos ng pagpapatupad (control flow) bilang resulta ng paggamit ng mga pagsasamantala na nagbabago ng mga pointer na nakaimbak sa memorya sa mga function.
  • Nagdagdag ang compiler ng suporta para sa mga bersyon 5 at 6 ng format ng paghahambing ng saklaw ng LLVM, na ginagamit upang suriin ang saklaw ng code sa panahon ng pagsubok.
  • Sa compiler, ang mga kinakailangan para sa minimum na bersyon ng LLVM ay itinaas sa LLVM 12.
  • Naipatupad na ang ikatlong antas ng suporta para sa x86_64-unknown-none platform. Ang ikatlong antas ay nagsasangkot ng pangunahing suporta, ngunit walang awtomatikong pagsubok, pag-publish ng mga opisyal na build, o pagsuri kung ang code ay maaaring buuin.

Bilang karagdagan, maaari naming tandaan ang paglalathala ng Microsoft ng paglabas ng Rust para sa Windows 0.30 na mga aklatan, na nagpapahintulot sa iyo na gamitin ang Rust na wika upang bumuo ng mga application para sa Windows OS. Kasama sa set ang dalawang crate packages (windows at windows-sys), kung saan maa-access mo ang Win API sa mga Rust program. Ang code para sa suporta sa API ay dynamic na nabuo mula sa metadata na naglalarawan sa API, na nagbibigay-daan sa iyong ipatupad ang suporta hindi lamang para sa mga kasalukuyang tawag sa Win API, ngunit para sa mga tawag na lalabas sa hinaharap. Ang bagong bersyon ay nagdaragdag ng suporta para sa target na platform ng UWP (Universal Windows Platform) at ipinapatupad ang mga uri ng Handle at Debug.

Pinagmulan: opennet.ru

Magdagdag ng komento