Релиз языка программирования Rust 1.24
Состоялся релиз языка программирования Rust 1.24, развиваемого проектом Mozilla. Язык сфокусирован на безопасной работе с памятью, обеспечивает автоматическое управление памятью и предоставляет средства для достижения высокого параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime.
По структуре язык Rust напоминает C++, но существенно отличается в некоторых деталях реализации синтаксиса и семантики. Автоматическое управление памятью избавляет разработчика от манипулирования указателями и защищает от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo, позволяющий получить нужные для программы библиотеки в один клик. Для размещения библиотек поддерживается репозиторий crates.io.
В подготовке нового выпуска приняли участие 152 разработчика. Основные новшества:
- Реализована утилита rustfmt для автоматического формирования исходных текстов в соответствии с рекомендациями по оформлению кода на языке Rust. Для установки утилиты следует использовать команду «rustup component add rustfmt-preview»;
- Включена по умолчанию инкрементальная компиляция, позволяющая пересобирать только изменившиеся части кода. Данный режим позволяет значительно сократить время сборки проекта при повторной компиляции после внесения мелких правок. Кроме того, в новом выпуске параметр codegen-units по умолчанию увеличен до 16, что позволило существенно ускорить процесс сборки за счёт распараллеливания операций, ценой незначительного снижения производительности результирующего исполняемого файла (для обеспечения максимальной производительности можно указать codegen-units=1);
- Устранено неопределённое поведение обработчиков краха в контексте функций FFI (Foreign Function Interface), работа которых могла отличаться в зависимости от ABI. Например, до сих пор оставался непредсказуемым код на базе «C» ABI:
extern "C" fn panic_in_ffi() { panic!("Test"); }
В Rust 1.24 такой код теперь всегда приводит к прерыванию выполнения, вместо неопределённого поведения; - До 10 раз ускорено выполнение операции поиска символов внутри строки при помощи функции str: find, которая переписана с использованием memchr. На memchr также переведена реализация [u8]:: contains, но ускорение её работы не столь внушительно (ускорение примерно в 3 раза). С использованием ассемблерных инструкций проведена оптимизация f32:: min и f32:: max;
- В разряд стабильных переведена новая порция API, в том числе RefCell: replace, RefCell: swap и std: sync: atomic: spin_loop_hint;
- Обеспечена возможность использования внутри неизменных выражений (constant, static) функций Cell, RefCell, UnsafeCell, {integer}:: min_value, max_value, mem«s size_of, align_of, ptr: null, null_mut, а также функции работы с различными целыми типами Atomic (AtomicBool: new, AtomicPtr: new, AtomicIsize: new и т.п.). Например, теперь можно указать «static COUNTER: AtomicUsize = AtomicUsize: new (1);»
- Добавлена поддержка новых целевых платформ armv4t-unknown-linux-gnueabi и aarch64-unknown-openbsd.
© OpenNet