Состоялся (https://blog.rust-lang.org/2018/02/15/Rust-1.24.html) релиз языка программирования Rust 1.24 (http://www.rust-lang.org), развиваемого проектом Mozilla. Язык сфокусирован на безопасной работе с памятью, обеспечивает автоматическое управление памятью и предоставляет средства для достижения высокого параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime.
По структуре язык Rust напоминает C++, но существенно отличается в некоторых деталях реализации синтаксиса и семантики. Автоматическое управление памятью избавляет разработчика от манипулирования указателями и защищает от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo (http://blog.rust-lang.org/2014/11/20/Cargo.html), позволяющий получить нужные для программы библиотеки в один клик. Для размещения библиотек поддерживается репозиторий crates.io (https://crates.io/).
В подготовке нового выпуска приняли участие 152 разработчика. Основные новшества (https://github.com/rust-lang/rust/blob/master/RELEASES.md#ve...):
- Реализована утилита rustfmt (https://github.com/rust-lang-nursery/rustfmt) для автоматического формирования исходных текстов в соответствии с рекомендациями (https://github.com/rust-lang-nursery/fmt-rfcs) по оформлению кода на языке Rust. Для установки утилиты следует использовать команду "rustup component add rustfmt-preview";
- Включена по умолчанию инкрементальная компиляция, позволяющая пересобирать только изменившиеся части кода. Данный режим позволяет значительно сократить время сборки проекта при повторной компиляции после внесения мелких правок. Кроме того, в новом выпуске параметр codegen-units по умолчанию увеличен до 16, что позволило существенно (https://github.com/rust-lang/rust/issues/45320) ускорить процесс сборки за счёт распараллеливания операций, ценой незначительного снижения производительности результирующего исполняемого файла (для обеспечения максимальной производительности можно указать codegen-units=1);
- Устранено неопределённое поведение обработчиков краха в контексте функций FFI (https://doc.rust-lang.org/book/first-edition/ffi.html) (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.
URL: https://blog.rust-lang.org/2018/02/15/Rust-1.24.html
Новость: https://www.opennet.ru/opennews/art.shtml?num=48087