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

Новости мира unix. Хотите узнать секрет вечного счастья? Откройте страницу 246.
Ответить
acolyte
Аватара пользователя
Сообщения: 3640
Зарегистрирован: 20.08.2022

#

Выпуск Rust 1.82. Новый браузер на Rust. Использование Rust в Volvo
Дата публикации:Fri, 18 Oct 2024 23:28:35 +0300




Опубликован релиз языка программирования общего назначения 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
      [/url]
    • std::str::CharIndices::offset
      [/url]
    • std::option::Option::is_none_or
      [/url]
    • [T]::is_sorted
      [/url]
    • [T]::is_sorted_by
      [/url]
    • [T]::is_sorted_by_key
      [/url]
    • Iterator::is_sorted
      [/url]
    • Iterator::is_sorted_by
      [/url]
    • Iterator::is_sorted_by_key
      [/url]
    • std::future::Ready::into_inner
      [/url]
    • std::iter::repeat_n
      [/url]
    • impl DoubleEndedIterator for Take
      [/url]
    • impl ExactSizeIterator for Take
      [/url]
    • impl ExactSizeIterator for Take
      [/url]
    • impl Default for std::collections::binary_heap::Iter
      [/url]
    • impl Default for std::collections::btree_map::RangeMut
      [/url]
    • impl Default for std::collections::btree_map::ValuesMut
      [/url]
    • impl Default for std::collections::vec_deque::Iter
      [/url]
    • impl Default for std::collections::vec_deque::IterMut
      [/url]
    • Rc<T>::new_uninit
      [/url]
    • Rc<T>::assume_init
      [/url]
    • Rc<[T]>::new_uninit_slice
      [/url]
    • Rc<[MaybeUninit<T>]>::assume_init
      [/url]
    • Arc<T>::new_uninit
      [/url]
    • Arc<T>::assume_init
      [/url]
    • Arc<[T]>::new_uninit_slice
      [/url]
    • Arc<[MaybeUninit<T>]>::assume_init
      [/url]
    • Box<T>::new_uninit
      [/url]
    • Box<T>::assume_init
      [/url]
    • Box<[T]>::new_uninit_slice
      [/url]
    • Box<[MaybeUninit<T>]>::assume_init
      [/url]
    • core::arch::x86_64::_bextri_u64
      [/url]
    • core::arch::x86_64::_bextri_u32
      [/url]
    • core::arch::x86::_mm_broadcastsi128_si256
      [/url]
    • core::arch::x86::_mm256_stream_load_si256
      [/url]
    • core::arch::x86::_tzcnt_u16
      [/url]
    • core::arch::x86::_mm_extracti_si64
      [/url]
    • core::arch::x86::_mm_inserti_si64
      [/url]
    • core::arch::x86::_mm_storeu_si16
      [/url]
    • core::arch::x86::_mm_storeu_si32
      [/url]
    • core::arch::x86::_mm_storeu_si64
      [/url]
    • core::arch::x86::_mm_loadu_si16
      [/url]
    • core::arch::x86::_mm_loadu_si32
      [/url]
    • core::arch::wasm32::u8x16_relaxed_swizzle
      [/url]
    • core::arch::wasm32::i8x16_relaxed_swizzle
      [/url]
    • core::arch::wasm32::i32x4_relaxed_trunc_f32x4
      [/url]
    • core::arch::wasm32::u32x4_relaxed_trunc_f32x4
      [/url]
    • core::arch::wasm32::i32x4_relaxed_trunc_f64x2_zero
      [/url]
    • core::arch::wasm32::u32x4_relaxed_trunc_f64x2_zero
      [/url]
    • core::arch::wasm32::f32x4_relaxed_madd
      [/url]
    • core::arch::wasm32::f32x4_relaxed_nmadd
      [/url]
    • core::arch::wasm32::f64x2_relaxed_madd
      [/url]
    • core::arch::wasm32::f64x2_relaxed_nmadd
      [/url]
    • core::arch::wasm32::i8x16_relaxed_laneselect
      [/url]
    • core::arch::wasm32::u8x16_relaxed_laneselect
      [/url]
    • core::arch::wasm32::i16x8_relaxed_laneselect
      [/url]
    • core::arch::wasm32::u16x8_relaxed_laneselect
      [/url]
    • core::arch::wasm32::i32x4_relaxed_laneselect
      [/url]
    • core::arch::wasm32::u32x4_relaxed_laneselect
      [/url]
    • core::arch::wasm32::i64x2_relaxed_laneselect
      [/url]
    • core::arch::wasm32::u64x2_relaxed_laneselect
      [/url]
    • core::arch::wasm32::f32x4_relaxed_min
      [/url]
    • core::arch::wasm32::f32x4_relaxed_max
      [/url]
    • core::arch::wasm32::f64x2_relaxed_min
      [/url]
    • core::arch::wasm32::f64x2_relaxed_max
      [/url]
    • core::arch::wasm32::i16x8_relaxed_q15mulr
      [/url]
    • core::arch::wasm32::u16x8_relaxed_q15mulr
      [/url]
    • core::arch::wasm32::i16x8_relaxed_dot_i8x16_i7x16
      [/url]
    • core::arch::wasm32::u16x8_relaxed_dot_i8x16_i7x16
      [/url]
    • core::arch::wasm32::i32x4_relaxed_dot_i8x16_i7x16_add
      [/url]
    • core::arch::wasm32::u32x4_relaxed_dot_i8x16_i7x16_add
      [/url]
Признак "const", определяющий возможность использования в любом контексте вместо констант, применён в функциях:
    • std::task::Waker::from_raw
      [/url]
    • std::task::Context::from_waker
      [/url]
    • std::task::Context::waker
      [/url]
    • $integer::from_str_radix
      [/url]
    • std::num::ParseIntError::kind
      [/url]
Реализован первый уровень поддержки для платформы macOS на 64-рядных процессорах Apple Silicon на базе архтитектуры ARM64 (aarch64-apple-darwin). Первый уровень поддержки подразумевает формирование бинарных сборок, проведение досконального тестирования и предоставление наивысшей гарантии поддержки платформы - каждое изменение в компиляторе проверяется выполнением полного тестового набора.

Реализован второй уровень поддержки платформ aarch64-apple-ios-macabi и x86_64-apple-ios-macabi, отождествлённых с технологией Mac Catalyst, позволяющей запускать приложения iOS на системах Mac. Второй уровень поддержки подразумевает гарантию сборки.




Дополнительно можно отметить несколько недавних событий и проектов, связанных с языком Rust:
  • Представлен новый браузер Gosub, написанный на языке Rust и использующий собственный web-движок, нацеленный на поддержку HTML5 и CSS3, и не пересекающийся с проектом Servo. Для обработки JavaScript предлагается подключать внешние движки. Браузер примечателен модульной архитектурой, позволяющей на свой вкус заменять web-движки и обработчики отрисовки контента. Разработка пока находится на начальном этапе, сосредоточенном на создании компонентов для разбора HTML/CSS, организации отрисовки контента и интеграции JavaScript-движков.



    Утверждается, что текущее состояние движка позволяет проходить большую часть тестов html5lib и обрабатывать почти любые документы HTML5. Парсер CSS3 и компонент отрисовки пока находятся в состоянии прототипов и способны обрабатывать только простейшие страницы. Из JavaScript-движков поддерживается v8. Код проекта доступен под лицензией MIT. Проект развивает Джошуа Тейссен (Joshua Thijssen), в прошлом активный участник сообщества разработчиков на языке PHP и автор книг про библиотеки SPL и Symfony.

    Изображение
    Компания Volvo задействовала в электромобилях EX90 и
    Polestar 3 электронный блок управления (ECU) на базе CPU Arm Cortex-M, отвечающий за активацию цепей питания, в котором использована прошивка, написанная на языке Rust. Проект признан удачным и руководство рассмотрит возможность расширения использования компонентов на Rust в других подсистемах. Отмечается, что по сравнению с проектами на C и C++ в коде на Rust удалось добиться более высокого качества и меньшего уровня ошибок за счёт более жестоких требований на этапе компиляции.

    Проект lm.rs подготовил написанный на Rust движок для выполнения больших языковых моделей машинного обучения, совместимый с моделями Gemma 2, Llama 3.2 и PHI 3.5, и похожий по своему назначению на llama2.c и llm.c.
    Lm.rs выполняет модель с использованием ресурсов CPU и не требует для работы внешних зависимостей и библиотек. Производительность lm.rs позволяет на ПК c 16-ядерным CPU AMD Epyc обрабатывать примерно 50 токенов в секунду для модели Llama 3.2 1B. Код открыт под лицензией MIT.


    Опубликован выпуск платформы Tauri 2.0, предоставляющей написанный на Rust инструментарий для создания многоплатформенных пользовательских приложений с графическим интерфейсом, конкурирующий с платформой Electron. Как и в Electron логика работы приложения определяется на JavaScript, HTML и CSS, а программы оформляются в виде самодостаточных исполняемых файлов, компилируемых для различных операционных систем. Для отрисовки окон на платформе Linux используется библиотека GTK (GTK 3 Rust), а в macOS и Windows библиотека Tao. Интерфейс формируется при помощи библиотеки WRY с обвязкой над браузерным движком WebKit для macOS, WebView2 для Windows и WebKitGTK для Linux. Среди ключевых улучшений в новой версии: поддержка мобильных платформ iOS и Android, переработка слоя IPC (Inter Process Communication) и добавление большого числа новых модулей.

    Разработчики свободного пакета для автоматизации проектирования печатных плат LibrePCB, оптимизированного для быстрой разработки плат и предоставления как можно более простого интерфейса, представили план по разработке выпуска LibrePCB 2.0. В плане упоминается интеграция поддержки использования Rust в кодовой базе и постепенное смещение при разработке от использования языка С++ в пользу Rust. Также упоминается намерение полностью переработать интерфейс пользователя, используя написанный на Rust фреймворк Slint вместо библиотеки Qt.

    Разработчики проекта Rust-for-Linux работают над предоставлением возможности использования в ядре умных указателей, соответствующих модели памяти ядра Linux.


Новость позаимствована с opennet.ru
Ссылка на оригинал: https://www.opennet.ru/opennews/art.shtml?num=62071

Жизнь за Нер'зула!

Ответить