Ngaleupaskeun basa programming Rust 1.59 kalayan rojongan pikeun inserts assembly

Pelepasan bahasa pemrograman tujuan umum Rust 1.59, diadegkeun ku proyék Mozilla, tapi ayeuna dikembangkeun dina naungan organisasi nirlaba bebas Rust Foundation, parantos diterbitkeun. basa museurkeun kana kaamanan memori jeung nyadiakeun sarana pikeun ngahontal paralelisme pakasaban tinggi bari Ngahindarkeun pamakéan a collector sampah na runtime (runtime diréduksi jadi initialization dasar tur pamaliharaan perpustakaan baku).

Métode penanganan memori Rust nyalametkeun pamekar tina kasalahan nalika ngamanipulasi pointer sareng ngajagi tina masalah anu timbul kusabab panangan mémori tingkat rendah, sapertos aksés ka daérah mémori saatos dibébaskeun, dereferencing pointer null, overruns panyangga, jsb. Pikeun ngadistribusikaeun perpustakaan, nyadiakeun ngawangun jeung ngatur kagumantungan, proyék ngamekarkeun manajer pakét Cargo. Repositori crates.io dirojong pikeun perpustakaan hosting.

Kasalametan memori disayogikeun dina Rust dina waktos kompilasi ngaliwatan pamariksaan rujukan, ngalacak kapamilikan obyék, ngalacak umur obyék (skop), sareng ngira-ngira kabeneran aksés mémori nalika palaksanaan kode. Karat ogé nyadiakeun panyalindungan ngalawan overflows integer, merlukeun initialization wajib nilai variabel saméméh pamakéan, handles kasalahan hadé dina perpustakaan baku, nerapkeun konsép rujukan immutable sarta variabel sacara standar, nawarkeun ketak statik kuat pikeun ngaleutikan kasalahan logis.

Inovasi utama:

  • Kasebut nyaéta dimungkinkeun pikeun ngagunakeun inserts basa assembly, nu di paménta dina aplikasi nu kudu ngadalikeun palaksanaan dina tingkat low atawa bisa ngagunakeun parentah mesin husus. Inserts assembly ditambahkeun maké macros "asm!" jeung "global_asm!" ngagunakeun sintaksis pormat string pikeun ngaran register sarupa nu dipaké pikeun substitusi string dina Rust. Compiler ngarojong parentah assembly pikeun x86, x86-64, ARM, AArch64 na RISC-V arsitéktur. Conto sisipan: make std :: arch :: asm; // Kalikeun x ku 6 ngagunakeun shifts tur nambahkeun hayu mut x: u64 = 4; teu aman {asm!("mov {tmp}, {x}", "shl {tmp}, 1", "shl {x}, 2", "tambah {x}, {tmp}", x = inout(reg ) x, tmp = kaluar(reg) _, ); } assert_eq!(x, 4 * 6);
  • rojongan ditambahkeun pikeun destructured (paralel) assignments, nu sababaraha Tret, keureut atawa struktur dieusian dina sisi kénca ekspresi. Contona: hayu (a, b, c, d, e); (a, b) = (1, 2); [c, .., d, _] = [1, 2, 3, 4, 5]; Struktur { e, .. } = Struktur { e: 5, f: 3}; assert_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);
  • Kamampuhan pikeun nangtukeun nilai standar pikeun const generics geus disadiakeun: struct ArrayStorage { arr: [T; N], } impl ArrayStorage { fn anyar (a: T, b: T) -> ArrayStorage { ArrayStorage { arr: [a, b], } } }
  • Pangatur pakét kargo nyayogikeun peringatan ngeunaan panggunaan struktur anu teu sah dina dependensi anu diolah kusabab kasalahan dina kompiler (contona, kusabab kasalahan, bidang struktur anu dipak diidinan pikeun diinjeum dina blok anu aman). Konstruksi sapertos kitu moal deui didukung dina versi Rust anu bakal datang.
  • Kargo sareng rustc gaduh kamampuan anu diwangun pikeun ngahasilkeun file anu tiasa dieksekusi dilucuti tina data debugging (strip = "debuginfo") sareng simbol (strip = "simbol"), tanpa kedah nyauran utiliti anu misah. Setelan beberesih dilaksanakeun ngaliwatan parameter "strip" dina Cargo.toml: [profile.release] strip = "debuginfo", "simbol"
  • Kompilasi Incremental ditumpurkeun sacara standar. Alesanna disebut workaround samentara pikeun bug dina kompiler nu ngabalukarkeun kacilakaan sarta kasalahan deserialization. Perbaikan bug parantos disiapkeun sareng bakal dilebetkeun kana sékrési salajengna. Pikeun mulangkeun kompilasi incremental, anjeun tiasa nganggo variabel lingkungan RUSTC_FORCE_INCREMENTAL=1.
  • Bagian anyar tina API geus dipindahkeun ka kategori stabil, kaasup métode jeung palaksanaan Tret geus stabilized:
    • std::thread::available_parallelism
    • Hasil:: disalin
    • Hasil:: diklon
    • ar:: asm!
    • arch::global_asm!
    • ops :: ControlFlow :: is_break
    • ops :: ControlFlow :: is_continue
    • TryFrom pikeun u8
    • char::TryFromCharError (Clone, Debug, Display, PartialEq, Copy, Eq, Error)
    • iter:: zip
    • NonZeroU8:: is_power_of_two
    • NonZeroU16:: is_power_of_two
    • NonZeroU32:: is_power_of_two
    • NonZeroU64:: is_power_of_two
    • NonZeroU128:: is_power_of_two
    • DoubleEndedIterator pikeun struktur ToLowercase
    • DoubleEndedIterator pikeun struktur ToUppercase
    • TryFrom<&mut [T]> pikeun [T; N]
    • UnwindSafe pikeun struktur Sakali
    • RefUnwindSafe pikeun Sakali
    • armv8 fungsi rojongan neon diwangun kana compiler pikeun aarch64
  • Atribut "const", anu nangtukeun kamungkinan ngagunakeunana dina konteks naon waé tinimbang konstanta, dianggo dina fungsi:
    • mem::MaybeUninit::as_ptr
    • mem :: MeureunUninit :: assume_init
    • mem :: MeureunUninit :: assume_init_ref
    • ffi::CStr::from_bytes_with_nul_unchecked

sumber: opennet.ru

Tambahkeun komentar