Дата публикации:Thu, 08 Feb 2024 23:04:58 +0300
Опубликован релиз языка программирования общего назначения Rust 1.76, основанного проектом Mozilla, но ныне развиваемого под покровительством независимой некоммерческой организации Rust Foundation. Язык сфокусирован на безопасной работе с памятью и предоставляет средства для достижения высокого параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime (runtime сводится к базовой инициализации и сопровождению стандартной библиотеки).
Методы работы с памятью в Rust избавляют разработчика от ошибок при манипулировании указателями и защищают от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo. Для размещения библиотек поддерживается репозиторий crates.io.
Безопасная работа с памятью обеспечивается в Rust во время компиляции через проверку ссылок, отслеживание владения объектами, учёт времени жизни объектов (области видимости) и оценку корректности доступа к памяти во время выполнения кода. Rust также предоставляет средства для защиты от целочисленных переполнений, требует обязательной инициализации значений переменных перед использованием, лучше обрабатывает ошибки в стандартной библиотеке, применяет концепцию неизменяемости (immutable) ссылок и переменных по умолчанию, предлагает сильную статическую типизацию для минимизации логических ошибок.
Основные новшества:
- В документацию добавлена отдельная секция, описывающая совместимость различных типов аргументов и типов возвращаемых значений функций на уровне ABI. По сравнению с прошлыми версиями гарантирована совместимость на уровне ABI типов "char" и "u32", которые имеют идентичный размер и выравнивание.
В дополнение к ранее доступному вызову "any::type_name::<T>()", возвращающему строковое описание для типа, указанного в параметре "T", добавлена функция "type_name_of_val(&T)" позволяющая получить информацию о типе на основе любой неименованной ссылки.
fn get_iter() -> impl Iterator<Item = i32> {
[1, 2, 3].into_iter()
}
fn main() {
let iter = get_iter();
let iter_name = std::any::type_name_of_val(&iter);
let sum: i32 = iter.sum();
println!("The sum of the `{iter_name}` is {sum}.");
}
На выходе получим:
The sum of the `core::array::iter::IntoIter<i32, 3>` is 6.
В разряд стабильных переведена новая порция API, в том числе стабилизированы методы и реализации типажей:
[url=https://doc.rust-lang.org/stable/std/sync/struct.Arc.html#method.unwrap_or_clone]Arc::unwrap_or_clone[/url]
Дополнительно можно отметить демонстрацию экспериментального планировщика задач scx_rustland, написанного на языке Rust и выполняемого в пространстве пользователя (вынос логики планирования задач из ядра в пространство пользователя реализовано при помощи инструментария sched-ext, использующего BPF). Планировщик оптимизирован для повышения приоритета интерактивных задач на фоне задач, интенсивно нагружающих CPU. Например, в тесте запуска игрового приложения одновременно со сборкой ядра планировщик scx_rustland позволил добиться в игре более высокого FPS, чем при использовании штатного планировщика EEVDF.
Новость позаимствована с opennet.ru
Ссылка на оригинал: https://www.opennet.ru/opennews/art.shtml?num=60575