Rust 1.37 - опубликован релиз языка системного программирования Rust
Опубликован релиз языка системного программирования Rust 1.37, основанного проектом Mozilla. Язык сфокусирован на безопасной работе с памятью, обеспечивает автоматическое управление памятью и предоставляет средства для достижения высокого параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime.
Автоматическое управление памятью в Rust избавляет разработчика от манипулирования указателями и защищает от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo, позволяющий получить нужные для программы библиотеки в один клик. Для размещения библиотек поддерживается репозиторий crates.io.
Основные новшества:
- В компиляторе rustc обеспечена поддержка оптимизации на основе результатов профилирования кода (PGO, Profile-Guided Optimization), позволяющих генерировать более оптимальный код на основе анализа статистики, накопленной в процессе выполнения программы. Для генерации профиля предусмотрен флаг "-C profile-generate", а для использования профиля при сборке - "-C profile-use" (вначале программа собирается с первым флагом, обкатывается и после создания профиля собирается повторно со вторым флагом);
- При выполнении команды "cargo run", которую удобно использовать для быстрого тестирования консольных приложений, добавлена возможность автоматического выбора исполняемого файла для запуска, в случае если в пакете присутствует несколько исполняемых файлов. Выполняемый по умолчанию файл определяется через директиву default-run в секции [package] с параметрами пакета, которая позволяет обойтись без явного указания имени файла через флаг "--bin" при каждом запуске "cargo run";
- В пакетный менеджер Cargo интегрирована команда "cargo vendor", ранее поставляемая в виде отдельного пакета. Команда позволяет организовать работу с локальной копией зависимостей - после выполнения "cargo vendor" все исходные тексты зависимостей проекта загружаются с crates.io в локальный каталог, который затем можно использовать для работы без обращения к crates.io (после выполнения команды показывается подсказка по изменению конфигурации для использования каталога при сборках). Указанная возможность уже применяется для организации поставки компилятора rustc с упаковкой всех зависимостей в один архив с релизом;
- Появилась возможность создания ссылок на варианты перечислений (enum), используя псевдонимы типа (например, в теле функции "fn increment_or_zero(x: ByteOption) можно указывать "ByteOption::None => 0"), конструкции вычисления типов (‹MyType‹..››::вариант => N) или обращения Self (в блоках c &self можно указать "Self::Quarter => 25");
- Добавлена возможность создания неименованных констант в макросах. Вместо определения имени элемента в "const" теперь можно использовать символ "_" для динамического выбора неповторяющегося идентификатора, позволяющего избежать конфликта имён при повторном вызове макроса;
- Добавлена возможность использования атрибута "#[repr(align(N))" с перечислениями (enums), используя синтаксис, аналогичный определению структуры AlignN‹T› с выравниванием и последующему использованию AlignN‹MyEnum›;
- В разряд стабильных переведена новая порция API, в том числе стабилизированы методы BufReader::buffer, BufWriter::buffer, Cell::from_mut, Cell::as_slice_of_cells, DoubleEndedIterator::nth_back, Option::xor, {i,u}{8,16,64,128,size}::reverse_bits, Wrapping::reverse_bits и slice::copy_within.
Дополнительно можно отметить начало тестирования проекта Async-std, предлагающего асинхронный вариант стандартной библиотеки Rust (порт библиотеки std, в котором все интерфейсы предложены в версии с async и готовы для использования с синтаксисом async/await).