Выпуск Rust 1.82. Новый браузер на Rust. Использование Rust в Volvo

Опубликован релиз языка программирования общего назначения Rust 1.82, основанного проектом Mozilla, но ныне развиваемого под покровительством независимой некоммерческой организации Rust Foundation. Язык сфокусирован на безопасной работе с памятью и предоставляет средства для достижения высокого параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime (runtime сводится к базовой инициализации и сопровождению стандартной библиотеки).

Методы работы с памятью в Rust избавляют разработчика от ошибок при манипулировании указателями и защищают от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo. Для размещения библиотек поддерживается репозиторий crates.io.

Безопасная работа с памятью обеспечивается в Rust во время компиляции через проверку ссылок, отслеживание владения объектами, учёт времени жизни объектов (области видимости) и оценку корректности доступа к памяти во время выполнения кода. Rust также предоставляет средства для защиты от целочисленных переполнений, требует обязательной инициализации значений переменных перед использованием, лучше обрабатывает ошибки в стандартной библиотеке, применяет концепцию неизменяемости (immutable) ссылок и переменных по умолчанию, предлагает сильную статическую типизацию для минимизации логических ошибок.

Основные новшества:

  • В пакетный менеджер cargo добавлена команда «info» для вывода информации о пакете в репозитории.
  • Добавлена поддержка синтаксиса «use<..>» в «impl Trait», определяющего информацию о скрытых типах. Например, «impl Trait + use<‘x, T>» указывает, что в скрытом типе разрешено использовать только параметры «x» и «T».
  • Предложен отдельный синтаксис для создания raw-указателей, пришедший на смену ранее применяемым макросам: на смену макросу «addr_of!(expr)» пришёл оператор «&raw const expr», а на смену макросу «addr_of_mut!(expr)» — оператор «&raw mut expr». struct Packed { not_aligned_field: i32, } fn main() { let p = Packed { not_aligned_field: 1_82 }; // Старый способ создания raw-указателя let ptr = std::ptr::addr_of!(p.not_aligned_field); // Новый способ создания raw-указателя let ptr = &raw const p.not_aligned_field; let val = unsafe { ptr.read_unaligned() }; }
  • Предоставлена возможность определения безопасных (safe) функций и констант со временем жизни ‘static’ внутри extern-блоков с признаком «unsafe» (ранее все элементы в «unsafe extern» могли иметь только признак «unsafe»): unsafe extern { pub safe static TAU: f64; pub safe fn sqrt(x: f64) -> f64; pub unsafe fn strlen(p: *const u8) -> usize; }
  • Атрибуты no_mangle, link_section и export_name, которые могут привести к неопределённому поведению, теперь считаются небезопасными и требуют явной пометки признаком «unsafe», например: #[unsafe(no_mangle)] pub fn my_global_function() { }
  • При сопоставлением с образцом разрешено пропускать пустые типы, такие как «enum Void {}» или структуры с видимым пустым полем. use std::convert::Infallible; pub fn unwrap_without_panic<T>(x: Result<T, Infallible>) -> T { let Ok(x) = x; // «Err» можно пропустить x }
  • В типах для чисел с плавающей запятой (f32 и f64) стандартизировано поведения при обработке нечисловых значений NaN (0.0/0.0), а также разрешено использование операций с плавающей запятой в const fn.
  • В ассемблерных вставках предоставлена возможность использования операндов с признаком «const» для непосредственного использования целых числовых значений без их предварительного сохранения в регистре. const MSG: &str = «Hello, world!\n»; unsafe { core::arch::asm!( «mov rdx, {LEN} // будет сформирована инструкция ‘mov rdx, 14′», LEN = const MSG.len(), … ); }
  • Разрешена адресация выражений с признаком «static» в безопасном контексте без определения блока unsafe (операторы «&raw mut» и «&raw const» не влияют на значение операнда и лишь создают указатель на него): static mut STATIC_MUT: Type = Type::new(); extern «C» { static EXTERN_STATIC: Type; } fn main() { let static_mut_ptr = &raw mut STATIC_MUT; let extern_static_ptr = &raw const EXTERN_STATIC; }
  • В разряд стабильных переведена новая порция API, в том числе стабилизированы методы и реализации типажей:
    • std::thread::Builder::spawn_unchecked
    • std::str::CharIndices::offset
    • std::option::Option::is_none_or
    • [T]::is_sorted
    • [T]::is_sorted_by
    • [T]::is_sorted_by_key
    • Iterator::is_sorted
    • Iterator::is_sorted_by
    • Iterator::is_sorted_by_key
    • std::future::Ready::into_inner
    • std::iter::repeat_n
    • impl DoubleEndedIterator for Take

      Աղբյուր: opennet.ru
Գնել հուսալի հոստինգ կայքերի համար, DDoS պաշտպանությամբ, VPS VDS սերվերներ 🔥 Գնել հուսալի հոստինգ կայքերի համար, DDoS պաշտպանությամբ, VPS VDS սերվերներ | ProHoster