Автоматическое управление памятью в 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).
Источник: http://www.opennet.ru/opennews/art.shtml?num=51302