ΠžΠ±Ρ˜Π°Π²ΡƒΠ²Π°ΡšΠ΅ Π½Π° програмскиот јазик Rust 1.59 со ΠΏΠΎΠ΄Π΄Ρ€ΡˆΠΊΠ° Π·Π° ΠΌΠΎΠ½Ρ‚Π°ΠΆΠ½ΠΈ инсСрти

ОбјавСно Π΅ ΠΎΠ±Ρ˜Π°Π²ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° програмскиот јазик Π·Π° ΠΎΠΏΡˆΡ‚Π° Π½Π°ΠΌΠ΅Π½Π° Rust 1.59, основан ΠΎΠ΄ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΡ‚ Mozilla, Π½ΠΎ сСга Ρ€Π°Π·Π²ΠΈΠ΅Π½ ΠΏΠΎΠ΄ покровитСлство Π½Π° нСзависната Π½Π΅ΠΏΡ€ΠΎΡ„ΠΈΡ‚Π½Π° ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡ˜Π° Rust Foundation. ΠˆΠ°Π·ΠΈΠΊΠΎΡ‚ сС фокусира Π½Π° бСзбСдноста Π½Π° ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°Ρ‚Π° ΠΈ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡƒΠ²Π° срСдства Π·Π° ΠΏΠΎΡΡ‚ΠΈΠ³Π½ΡƒΠ²Π°ΡšΠ΅ Π½Π° висок ΠΏΠ°Ρ€Π°Π»Π΅Π»ΠΈΠ·Π°ΠΌ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΡ‚Π΅ мСста, ΠΏΡ€ΠΈΡ‚ΠΎΠ° ΠΈΠ·Π±Π΅Π³Π½ΡƒΠ²Π°Ρ˜ΡœΠΈ ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π° Π½Π° собирач Π½Π° Ρ“ΡƒΠ±Ρ€Π΅ ΠΈ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° (Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° Π΅ свСдСно Π½Π° основна ΠΈΠ½ΠΈΡ†ΠΈΡ˜Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡ˜Π° ΠΈ ΠΎΠ΄Ρ€ΠΆΡƒΠ²Π°ΡšΠ΅ Π½Π° стандардната Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°).

ΠœΠ΅Ρ‚ΠΎΠ΄ΠΈΡ‚Π΅ Π·Π° Ρ€Π°ΠΊΡƒΠ²Π°ΡšΠ΅ со ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°Ρ‚Π° Π½Π° Rust Π³ΠΎ спасуваат Ρ€Π°Π·Π²ΠΈΠ²Π°Ρ‡ΠΎΡ‚ ΠΎΠ΄ Π³Ρ€Π΅ΡˆΠΊΠΈ ΠΏΡ€ΠΈ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€Π°ΡšΠ΅ со ΠΏΠΎΠΊΠ°ΠΆΡƒΠ²Π°Ρ‡ΠΈΡ‚Π΅ ΠΈ Π³ΠΎ ΡˆΡ‚ΠΈΡ‚Π°Ρ‚ ΠΎΠ΄ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ ΡˆΡ‚ΠΎ сС Ρ˜Π°Π²ΡƒΠ²Π°Π°Ρ‚ ΠΏΠΎΡ€Π°Π΄ΠΈ Ρ€Π°ΠΊΡƒΠ²Π°ΡšΠ΅ со ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°Ρ‚Π° Π½Π° ниско Π½ΠΈΠ²ΠΎ, ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ сС пристап Π΄ΠΎ мСмориската област ΠΎΡ‚ΠΊΠ°ΠΊΠΎ ќС сС ослободи, Π΄Π΅Ρ€Π΅Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΡ€Π°ΡšΠ΅ Π½Π° Π½ΡƒΠ»Π° ΠΏΠΎΠΊΠ°ΠΆΡƒΠ²Π°Ρ‡ΠΈ, ΠΏΡ€Π΅Ρ‡Π΅ΠΊΠΎΡ€ΡƒΠ²Π°ΡšΠ° Π½Π° Π±Π°Ρ„Π΅Ρ€ΠΎΡ‚ ΠΈΡ‚Π½. Π—Π° Π΄Π° сС дистрибуираат Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π΄Π° сС ΠΎΠ±Π΅Π·Π±Π΅Π΄Π°Ρ‚ Π³Ρ€Π°Π΄Π±ΠΈ ΠΈ Π΄Π° ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°Π°Ρ‚ со зависности, ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΡ‚ Π³ΠΎ Ρ€Π°Π·Π²ΠΈΠ²Π° ΠΌΠ΅Π½Π°ΡŸΠ΅Ρ€ΠΎΡ‚ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ Cargo. Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΡƒΠΌΠΎΡ‚ crates.io Π΅ ΠΏΠΎΠ΄Π΄Ρ€ΠΆΠ°Π½ Π·Π° Ρ…ΠΎΡΡ‚ΠΈΡ€Π°ΡšΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

БСзбСдноста Π½Π° ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°Ρ‚Π° Π΅ ΠΎΠ±Π΅Π·Π±Π΅Π΄Π΅Π½Π° Π²ΠΎ Rust Π·Π° Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ ΠΏΡ€Π΅ΠΊΡƒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Ρ€Π΅Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈ, слСдСњС Π½Π° сопствСноста Π½Π° ΠΎΠ±Ρ˜Π΅ΠΊΡ‚ΠΎΡ‚, слСдСњС Π½Π° ΠΆΠΈΠ²ΠΎΡ‚Π½ΠΈΠΎΡ‚ Π²Π΅ΠΊ Π½Π° ΠΎΠ±Ρ˜Π΅ΠΊΡ‚ΠΈΡ‚Π΅ (ΠΎΠ±Π΅ΠΌΠΈ) ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π½ΠΊΠ° Π½Π° исправноста Π½Π° пристапот Π΄ΠΎ ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°Ρ‚Π° Π·Π° Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠ΄ΠΎΡ‚. Rust исто Ρ‚Π°ΠΊΠ° ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡƒΠ²Π° Π·Π°ΡˆΡ‚ΠΈΡ‚Π° ΠΎΠ΄ ΠΏΡ€Π΅Π»Π΅Π²Π°ΡšΠ΅ Π½Π° Ρ†Π΅Π»ΠΈ Π±Ρ€ΠΎΠ΅Π²ΠΈ, Π±Π°Ρ€Π° Π·Π°Π΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»Π½Π° ΠΈΠ½ΠΈΡ†ΠΈΡ˜Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡ˜Π° Π½Π° врСдноститС Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡ‚Π΅ ΠΏΡ€Π΅Π΄ ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π°, ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΠΎ сС справува со Π³Ρ€Π΅ΡˆΠΊΠΈΡ‚Π΅ Π²ΠΎ стандардната Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, стандардно Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡƒΠ²Π° ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ΠΎΡ‚ Π½Π° Π½Π΅ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Ρ€Π΅Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈ ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ, Π½ΡƒΠ΄ΠΈ силно статичко ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅ Π·Π° Π΄Π° сС ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π°Ρ‚ Π»ΠΎΠ³ΠΈΡ‡ΠΊΠΈΡ‚Π΅ Π³Ρ€Π΅ΡˆΠΊΠΈ.

Π“Π»Π°Π²Π½ΠΈΡ‚Π΅ ΠΈΠ½ΠΎΠ²Π°Ρ†ΠΈΠΈ:

  • ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования ассСмблСрных вставок, вострСбованных Π² прилоТСниях, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ Π½Π° Π½ΠΈΠ·ΠΊΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΈΠ»ΠΈ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования спСциализированных ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹Ρ… инструкций. АссСмблСрныС вставки Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ макросов Β«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.
  • Нов Π΄Π΅Π» ΠΎΠ΄ API Π΅ прСмСстСн Π²ΠΎ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡ˜Π°Ρ‚Π° стабилни, Π²ΠΊΠ»ΡƒΡ‡ΡƒΠ²Π°Ρ˜ΡœΠΈ Π³ΠΈ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΡ‚Π΅ ΠΈ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° карактСристикитС сС стабилизирани:
    • 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
  • Атрибутот β€žconstβ€œ, кој ја ΠΎΠ΄Ρ€Π΅Π΄ΡƒΠ²Π° моТноста Π΄Π° сС користи Π²ΠΎ кој Π±ΠΈΠ»ΠΎ контСкст намСсто константи, сС користи Π²ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:
    • mem::MaybeUninit::as_ptr
    • mem::MaybeUninit::assume_init
    • mem::MaybeUninit::assume_init_ref
    • ffi::CStr::from_bytes_with_nul_unchecked

Π˜Π·Π²ΠΎΡ€: opennet.ru

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€