Rust 1.38 Programming Language Release

Nai-publish release ng system programming language Kalawang 1.38, itinatag ng proyekto ng Mozilla. Nakatuon ang wika sa kaligtasan ng memorya, nagbibigay ng awtomatikong pamamahala ng memorya, at nagbibigay ng paraan upang makamit ang mataas na paralelismo sa gawain nang hindi gumagamit ng basurero o runtime.

Ang awtomatikong pamamahala ng memorya ng Rust ay nagpapalaya sa developer mula sa pagmamanipula ng pointer at pinoprotektahan laban sa mga problemang nagmumula sa mababang antas ng pagmamanipula ng memorya, tulad ng mga after-free na pag-access sa memorya, null pointer dereferences, buffer overruns, at iba pa. Ang isang manager ng package ay binuo upang ipamahagi ang mga aklatan, tiyakin ang pagpupulong at pamahalaan ang mga dependency ng proyekto. Karga, na nagbibigay-daan sa iyong makuha ang mga aklatan na kailangan para sa programa sa isang pag-click. Sinusuportahan ang isang repository upang mag-host ng mga aklatan crates.io.

Ang pangunahing mga inobasyon:

  • Nagdagdag ng pipelined compilation mode (pipelined), kung saan magsisimula ang pagbuo ng isang dependent crate package sa sandaling maging available ang dependency metadata, nang hindi naghihintay na makumpleto ang compilation nito. Kapag nag-compile ng isang package, ang mga dependency ay hindi kailangang ganap na tipunin, ang pagtukoy lamang sa metadata, na kinabibilangan ng mga listahan ng mga uri, dependency, at mga na-export na elemento. Ang metadata ay ginawang magagamit nang maaga sa proseso ng pagsasama-sama, kaya ang mga naka-link na pakete ay maaari na ngayong ma-compile nang mas maaga. Kapag gumagawa ng mga solong pakete, ang iminungkahing mode ay hindi makakaapekto sa pagganap, ngunit kung ang build ay sumasaklaw sa mga pakete na may mga branched na dependency, ang kabuuang oras ng pagbuo ay maaaring mabawasan ng 10-20%;
  • Tinitiyak ang pagtuklas ng maling paggamit ng mga function std::mem::uninitialized ΠΈ std::mem::zeroed. Halimbawa, ang std::mem::uninitialized ay maginhawa para sa mabilis na paggawa ng mga array, ngunit nililinlang nito ang compiler dahil mukhang nasimulan ito, ngunit sa katotohanan ang halaga ay nananatiling hindi nasimulan. Ang mem::uninitialized function ay minarkahan na bilang hindi na ginagamit at sa halip ay inirerekomenda na gumamit ng intermediate type. SiguroUnit. Tulad ng para sa mem::zeroed, ang function na ito ay maaaring magdulot ng mga problema sa mga uri na hindi makatanggap ng mga zero na halaga.

    Upang makatulong na matukoy ang hindi natukoy na gawi, ang bagong release ay nagdaragdag ng lint check sa compiler na nakakita ng ilang problema sa mem::uninitialized o mem::zeroed. Halimbawa, nakakakuha ka na ngayon ng error kapag sinusubukang gumamit ng mem::uninitialized o mem::zeroed na may mga uri ng &T at Boxβ€ΉTβ€Ί, na kumakatawan sa mga pointer object na hindi makakatanggap ng mga null value;

  • Ang attribute na "#[deprecated]" ay pinalawak upang payagan ang mga crate package na mamarkahang lipas na at nakaiskedyul para sa pagtanggal sa hinaharap. Mula sa Rust 1.38, ang katangiang ito ay maaari ding gamitin para sa mga macro;
  • Nagdagdag ng kakayahang gamitin ang attribute na "#[global_allocator]" sa mga submodules;
  • Idinagdag na tampok std::any::type_name, na nagbibigay-daan sa iyong malaman ang pangalan ng uri, na maaaring maging kapaki-pakinabang para sa mga layunin ng pag-debug. Halimbawa, sa panahon ng pagpapatupad ng programa maaari mong malaman kung anong uri ang tinawag na function:

    fn gen_valueβ€ΉT: Default>() -β€Ί T {
    println!("Pagsisimula ng isang instance ng {}", std::any::type_name::β€ΉTβ€Ί());
    Default::default()
    }

    fn main() {
    hayaan _: i32 = gen_value(); # "i32" ang ipi-print
    let _: String = gen_value(); # ay magpi-print ng "alloc::string::String"
    }

  • Mga pinahabang function ng karaniwang library:
    • slice::{concat, connect, join} ay maaari na ngayong kunin ang value na &[T] bilang karagdagan sa &T;
    • Ang "*const T" at "*mut T" ay nagpapatupad na ngayon ng marker::Unpin;
    • Ang "Arcβ€Ή[T]β€Ί" at "Rcβ€Ή[T]β€Ί" ay nagpapatupad na ngayon ng FromIteratorβ€ΉTβ€Ί;
    • iter::{StepBy, Peekable, Take} ngayon ay nagpapatupad ng DoubleEndedIterator.
    • ascii:: Ang EscapeDefault ay nagpapatupad ng Clone at Display.
  • Ang isang bagong bahagi ng mga API ay inilipat sa stable na kategorya, kabilang ang mga pamamaraan na na-stabilize
    • β€Ή*const Tβ€Ί::cast, β€Ή*mut Tβ€Ί::cast,
    • Tagal::as_secs_f{32|64},
    • Tagal::div_duration_f{32|64},
    • Tagal::div_f{32|64},
    • Tagal::from_secs_f{32|64},
    • Tagal::mul_f{32|64},
    • mga operasyon ng dibisyon na may natitira
      div_euclid at rem_euclid para sa lahat ng integer primitives;

  • Nagdagdag ng suporta para sa pagtukoy sa opsyong "--features" nang maraming beses upang paganahin ang iba't ibang feature sa cargo package manager;
  • Nagbibigay ang compiler ng pangatlo antas suporta para sa mga target na platform aarch64-uwp-windows-msvc, i686-uwp-windows-gnu, i686-uwp-windows-msvc, x86_64-uwp-windows-gnu, x86_64-uwp-windows-msvc-targets, armlinux7 -gnueabi, armv7-unknown-linux-musleabi, hexagon-unknown-linux-musl at riscv32i-unknown-none-elf. Ang ikatlong antas ay nagsasangkot ng pangunahing suporta, ngunit walang awtomatikong pagsubok at paglalathala ng mga opisyal na build.

Pinagmulan: opennet.ru

Magdagdag ng komento