Разпространение на Rust 1.82. Нов браузър на Rust. Използване на Rust в Volvo

Обявен е изданието на езика за програмиране общо предназначение Rust 1.82, основан от проекта Mozilla, но в момента развиван под егидата на независимата неправителствена организация Rust Foundation. Езикът е фокусиран върху безопасната работа с паметта и предоставя средства за постигане на висока паралелност на изпълнение на задания, като в същото време не се нуждае от използване на garbage collector и runtime (runtime се свежда до основна инициализация и поддръжка на стандартната библиотека).

Методите за работа с паметта в Rust освобождават разработчиците от грешки при манипулиране на указатели и ги защитават от проблеми, произлизащи от ниско ниво работа с паметта, като достъп до освободена памет, разыменоване на нулеви указатели, излизане извън границите на буфера и др. За разпространение на библиотеки, осигуряване на компилация и управление на зависимостите проектът продължава да развива пакетния мениджър Cargo. Поддържа се хранилище за библиотеки на crates.io.

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

Основни нововъведения:

  • В пакетния мениджър cargo е добавена команда «info» за извеждане на информация за пакета в репозитория.
  • Добавена е поддръжка на синтаксиса «use» в «impl Trait», който определя информация за скрити типове. Например, «impl Trait + use» указва, че в скрития тип е разрешено да се използват само параметрите «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(x: Result) -> 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