Выпуск языка программирования Rust 1.66

ΠžΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ Ρ€Π΅Π»ΠΈΠ· языка программирования ΠΎΠ±Ρ‰Π΅Π³ΠΎ назначСния Rust 1.66, основанного ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ Mozilla, Π½ΠΎ Π½Ρ‹Π½Π΅ Ρ€Π°Π·Π²ΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΏΠΎΠ΄ ΠΏΠΎΠΊΡ€ΠΎΠ²ΠΈΡ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎΠΌ нСзависимой нСкоммСрчСской ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Rust Foundation. Π―Π·Ρ‹ΠΊ сфокусирован Π½Π° бСзопасной Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΈ прСдоставляСт срСдства для достиТСния высокого ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ° выполнСния Π·Π°Π΄Π°Π½ΠΈΠΉ, ΠΏΡ€ΠΈ этом ΠΎΠ±Ρ…ΠΎΠ΄ΡΡΡŒ Π±Π΅Π· использования сборщика мусора ΠΈ runtime (runtime сводится ΠΊ Π±Π°Π·ΠΎΠ²ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π΅Π½ΠΈΡŽ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ).

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π² Rust ΠΈΠ·Π±Π°Π²Π»ΡΡŽΡ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΎΡ‚ ошибок ΠΏΡ€ΠΈ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ указатСлями ΠΈ Π·Π°Ρ‰ΠΈΡ‰Π°ΡŽΡ‚ ΠΎΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΡ… ΠΈΠ·-Π·Π° Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ области памяти послС Π΅Ρ‘ освобоТдСния, Ρ€Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ Π½ΡƒΠ»Π΅Π²Ρ‹Ρ… ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, Π²Ρ‹Ρ…ΠΎΠ΄ Π·Π° Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ Π±ΡƒΡ„Π΅Ρ€Π° ΠΈ Ρ‚.ΠΏ. Для распространСния Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, обСспСчСния сборки ΠΈ управлСния зависимостями ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ развиваСтся ΠΏΠ°ΠΊΠ΅Ρ‚Π½Ρ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ Cargo. Для размСщСния Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ поддСрТиваСтся Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ crates.io.

БСзопасная Ρ€Π°Π±ΠΎΡ‚Π° с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ обСспСчиваСтся Π² Rust Π²ΠΎ врСмя компиляции Ρ‡Π΅Ρ€Π΅Π· ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ссылок, отслСТиваниС владСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ, ΡƒΡ‡Ρ‘Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΆΠΈΠ·Π½ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² (области видимости) ΠΈ ΠΎΡ†Π΅Π½ΠΊΡƒ коррСктности доступа ΠΊ памяти Π²ΠΎ врСмя выполнСния ΠΊΠΎΠ΄Π°. Rust Ρ‚Π°ΠΊΠΆΠ΅ прСдоставляСт срСдства для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΎΡ‚ цСлочислСнных ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΉ, Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅Π΄ использованиСм, Π»ΡƒΡ‡ΡˆΠ΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ошибки Π² стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅, примСняСт ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ нСизмСняСмости (immutable) ссылок ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΡΠΈΠ»ΡŒΠ½ΡƒΡŽ ΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΡŽ для ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ логичСских ошибок.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ Π½ΠΎΠ²ΡˆΠ΅ΡΡ‚Π²Π°:

  • Π’ пСрСчислСниях c цСлочислСнными прСдставлСниями (Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ «#[repr(Int)]») Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ явноС ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ дискриминанта (Π½ΠΎΠΌΠ΅Ρ€Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Π² пСрСчислСнии), Π΄Π°ΠΆΠ΅ Ссли пСрСчислСниС содСрТит поля. #[repr(u8)] enum Foo { A(u8), # дискриминант 0 B(i8), # дискриминант 1 C(bool) = 42, # дискриминант 42 }
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° функция core::hint::black_box, которая просто Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π°Π·Π°Π΄ принятоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’Π°ΠΊ ΠΊΠ°ΠΊ компилятор считаСт, Ρ‡Ρ‚ΠΎ данная функция выполняСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ΅ дСйствиС, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ black_box ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ компилятором Ρ†ΠΈΠΊΠ»ΠΎΠ² ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠΈ тСстирования ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΊΠΎΠ΄Π° ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ машинного ΠΊΠΎΠ΄Π° (Ρ‡Ρ‚ΠΎΠ±Ρ‹ компилятор Π½Π΅ посчитал ΠΊΠΎΠ΄ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌ ΠΈ Π½Π΅ ΡƒΠ±Ρ€Π°Π» Π΅Π³ΠΎ). НапримСр, Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½ΠΈΠΆΠ΅ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ black_box(v.as_ptr()) Π½Π΅ позволяСт компилятору ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²Π΅ΠΊΡ‚ΠΎΡ€ v Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ. use std::hint::black_box; fn push_cap(v: &mut Vec) { for i in 0..4 { v.push(i); black_box(v.as_ptr()); } }
  • Π’ ΠΏΠ°ΠΊΠ΅Ρ‚Π½ΠΎΠΌ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π΅ «cargo» ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° «remove», ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ зависимости ΠΈΠ· манифСста Cargo.toml.
  • Π’ разряд ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Π½Π° новая порция API, Π² Ρ‚ΠΎΠΌ числС стабилизированы ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠ°ΠΆΠ΅ΠΉ:
    • proc_macro::Span::source_text
    • u*::{checked_add_signed, overflowing_add_signed, saturating_add_signed, wrapping_add_signed}
    • i*::{checked_add_unsigned, overflowing_add_unsigned, saturating_add_unsigned, wrapping_add_unsigned}
    • i*::{checked_sub_unsigned, overflowing_sub_unsigned, saturating_sub_unsigned, wrapping_sub_unsigned}
    • BTreeSet::{first, last, pop_first, pop_last}
    • BTreeMap::{first_key_value, last_key_value, first_entry, last_entry, pop_first, pop_last}
    • Π Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Add AsFd для Ρ‚ΠΈΠΏΠΎΠ² Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ stdio ΠΏΡ€ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ WASI.
    • impl TryFrom<Vec<T>> для Box<[T; N]>
    • core::hint::black_box
    • Duration::try_from_secs_{f32,f64}
    • Option::unzip
    • std::os::fd
  • Π’ ΡˆΠ°Π±Π»ΠΎΠ½Π°Ρ… Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ² «..X» ΠΈ «..=X».
  • ΠŸΡ€ΠΈ сборкС фронтэнда компилятора rustc ΠΈ бэкСнда LLVM задСйствованы Ρ€Π΅ΠΆΠΈΠΌΡ‹ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ LTO (Link Time Optimization) ΠΈ BOLT (Binary Optimization and Layout Tool), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π° ΠΈ ΡΠ½ΠΈΠ·ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ памяти.
  • Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ для ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ armv5te-none-eabi ΠΈ thumbv5te-none-eabi. Π’Ρ€Π΅Ρ‚ΠΈΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ Π±Π°Π·ΠΎΠ²ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ, Π½ΠΎ Π±Π΅Π· Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ тСстирования, ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… сборок ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ возмоТности сборки ΠΊΠΎΠ΄Π°.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° связывания с ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ macOS.

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π² ΠΊΠΎΠ΄ΠΎΠ²ΡƒΡŽ Π±Π°Π·Ρƒ GCC фронтэнда компилятора языка Rust (gccrs). Ѐронтэнд Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½ Π² Π²Π΅Ρ‚ΠΊΡƒ GCC 13, Ρ€Π΅Π»ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ состоится Π² ΠΌΠ°Π΅ 2023 Π³ΠΎΠ΄Π°. Начиная с GCC 13 ΡˆΡ‚Π°Ρ‚Π½Ρ‹ΠΉ инструмСнтарий GCC смоТСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для компиляции ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π½Π° языкС Rust Π±Π΅Π· нСобходимости установки компилятора rustc, построСнного с использованиСм Π½Π°Ρ€Π°Π±ΠΎΡ‚ΠΎΠΊ LLVM. РСализация Rust Π² GCC 13 Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ статус Π±Π΅Ρ‚Π°-вСрсии, Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΠΎΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru