Релиз языка программирования 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) функций 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;