Rilis basa pamrograman Rust 1.59 kanthi dhukungan kanggo sisipan perakitan

Basa pemrograman tujuan umum Rust 1.59, didegaké déning proyèk Mozilla nanging saiki dikembangaké ing sangisoré organisasi nirlaba independen Rust Foundation, wis dirilis. Basa kasebut fokus ing safety memori lan nyedhiyakake sarana kanggo nggayuh paralelisme proyek sing dhuwur nalika ngindhari panggunaan kolektor sampah lan runtime (runtime dikurangi dadi initialization dhasar lan pangopènan perpustakaan standar).

Cara nangani memori Rust nylametake pangembang saka kesalahan nalika manipulasi penunjuk lan nglindhungi masalah sing muncul amarga penanganan memori tingkat rendah, kayata ngakses area memori sawise dibebasake, null pointer dereferencing, overruns buffer, etc. Kanggo nyebarake perpustakaan, nyedhiyakake mbangun lan ngatur dependensi, proyek kasebut ngembangake manajer paket Cargo. Repositori crates.io didhukung kanggo hosting perpustakaan.

Keamanan memori diwenehake ing Rust ing wektu kompilasi liwat mriksa referensi, nglacak kepemilikan obyek, nglacak umur obyek (skop), lan netepake akurasi akses memori sajrone eksekusi kode. Rust uga menehi pangayoman marang overflows integer, mbutuhake initialization prentah saka nilai variabel sadurunge nggunakake, Ngalahake kasalahan luwih apik ing perpustakaan standar, ditrapake konsep referensi immutable lan variabel minangka standar, nawakake typing statis kuwat kanggo nyilikake kasalahan logis.

Inovasi utama:

  • ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования ассСмблСрных вставок, вострСбованных Π² прилоТСниях, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ Π½Π° Π½ΠΈΠ·ΠΊΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΈΠ»ΠΈ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования спСциализированных ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹Ρ… инструкций. АссСмблСрныС вставки Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ макросов Β«asm!Β» ΠΈ Β«global_asm!Β» с использованиСм для имСнования рСгистров синтаксиса форматирования строк, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠ³ΠΎ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² строковых подстановках Π² Rust. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ ассСмблСрныС инструкции для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ x86, x86-64, ARM, AArch64 ΠΈ RISC-V. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ вставки: use std::arch::asm; // Multiply x by 6 using shifts and adds let mut x: u64 = 4; unsafe { asm!( Β«mov {tmp}, {x}Β», Β«shl {tmp}, 1Β», Β«shl {x}, 2Β», Β«add {x}, {tmp}Β», x = inout(reg) x, tmp = out(reg) _, ); } assert_eq!(x, 4 * 6);
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° дСструктурированных (ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ…) присвоСний, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π² Π»Π΅Π²ΠΎΠΉ части выраТСния указываСтся нСсколько Ρ‚ΠΈΠΏΠ°ΠΆΠ΅ΠΉ, слайсов ΠΈΠ»ΠΈ структур. НапримСр: let (a, b, c, d, e); (a, b) = (1, 2); [c, .., d, _] = [1, 2, 3, 4, 5]; Struct { e, .. } = Struct { e: 5, f: 3 }; assert_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);
  • ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ указания Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для константных Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠ² (Β«const genericsΒ»): struct ArrayStorage<T, const N: usize = 2> { arr: [T; N], } impl<T> ArrayStorage<T> { fn new(a: T, b: T) -> ArrayStorage<T> { ArrayStorage { arr: [a, b], } } }
  • Π’ ΠΏΠ°ΠΊΠ΅Ρ‚Π½ΠΎΠΌ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π΅ Cargo обСспСчСн Π²Ρ‹Π²ΠΎΠ΄ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ ΠΎΠ± использовании Π² зависимостях нСдопустимых конструкций, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… ΠΈΠ·-Π·Π° ошибок Π² компиляторС (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ·-Π·Π° ошибки Π΄ΠΎΠΏΡƒΡΠΊΠ°Π»ΠΎΡΡŒ заимствованиС ΠΏΠΎΠ»Π΅ΠΉ ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½Ρ‹Ρ… структур Π² safe-Π±Π»ΠΎΠΊΠ°Ρ…). ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… конструкций Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½Π° Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΉ вСрсии Rust.
  • Π’ cargo ΠΈ rustc встроСна Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ исполняСмых Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΎΡ‡ΠΈΡ‰Π΅Π½Π½Ρ‹Ρ… ΠΎΡ‚ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… (strip = Β«debuginfoΒ») ΠΈ символов (strip = Β«symbolsΒ»), Π±Π΅Π· нСобходимости Π²Ρ‹Π·ΠΎΠ²Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹. Настройка очистки рСализуСтся Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Β«stripΒ» Π² Cargo.toml: [profile.release] strip = Β«debuginfoΒ», Β«symbolsΒ»
  • По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Π° ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ компиляция. Π’ качСствС ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ называСтся Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ ΠΎΠ±Ρ…ΠΎΠ΄ ошибки Π² компиляторС, приводящСй ΠΊ сбоям ΠΈ Π²Ρ‹Π²ΠΎΠ΄Ρƒ ошибок дСсСриализации. Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ошибки ΡƒΠΆΠ΅ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½ΠΎ ΠΈ Π²ΠΎΠΉΠ΄Ρ‘Ρ‚ Π² состав ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ выпуска. Для возвращСния ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ компиляции ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ окруТСния RUSTC_FORCE_INCREMENTAL=1.
  • Bagean anyar saka API wis dipindhah menyang kategori stabil, kalebu cara lan implementasine sifat wis stabil:
    • std::thread::available_parallelism
    • Result::copied
    • Result::cloned
    • arch::asm!
    • arch::global_asm!
    • ops::ControlFlow::is_break
    • ops::ControlFlow::is_continue
    • TryFrom for 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 для структуры ToLowercase
    • DoubleEndedIterator для структуры ToUppercase
    • TryFrom<&mut [T]> for [T; N]
    • UnwindSafe для структуры Once
    • RefUnwindSafe для Once
    • встроСнныС Π² компилятор Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ armv8 neon для aarch64
  • Atribut "const", sing nemtokake kemungkinan nggunakake ing sembarang konteks tinimbang konstanta, digunakake ing fungsi:
    • mem::MaybeUninit::as_ptr
    • mem::MaybeUninit::assume_init
    • mem::MaybeUninit::assume_init_ref
    • ffi::CStr::from_bytes_with_nul_unchecked

Source: opennet.ru

Add a comment