Команда разработчиков Rust рада представить релиз Rust 1.12 — системного языка программирования, нацеленного на безопасную работу с памятью, скорость и параллельное выполнение кода. В этот релиз вошёл 1361 патч.
Новое в 1.12
По словам разработчиков, релиз 1.12 является, возможно, самым значительным с момента выпуска релиза 1.0.
Самое заметное для пользователей изменение в версии 1.12 — это новый формат ошибок, выдаваемых rustc
. Сообществом была проделана многочасовая работа по переводу вывода ошибок на новый формат. Кроме того, для лучшей интеграции и взаимодействия со средой разработки и другим инструментарием ошибки теперь можно выводить в формате JSON при помощи специального флага --error-format=json
.
Самое большое внутреннее изменение — это переход на новый формат внутреннего представления программы MIR. Незаметное сегодня, это изменение открывает путь к череде будущих оптимизаций компилятора, и для некоторых кодовых баз оно уже показывает улучшения времени компиляции и уменьшение размера кода. Переход на MIR открывает ранее сложнодоступные возможности анализа и оптимизации. Первое из многочисленных грядущих изменений — переписывание прохода, генерирующего промежуточное представление LLVM, того, что rustc
называет «трансляцией». После многомесячных усилий новый бэкенд, основанный на MIR, доказал, что готов к реальной работе.
MIR содержит точную информацию о потоке управления программы, поэтому компилятор точно знает, перемещены типы или нет. Это значит, что он статически получает информацию о том, нужно ли выполнять деструктор значения. В случаях, когда значение может быть перемещено или не перемещено в конце области действия, компилятор просто использует флаг из одного бита на стеке, что, в свою очередь, проще для оптимизации проходов в LLVM. Конечный результат — уменьшенный объем работы компилятора и менее раздутый код во время исполнения.
Другие улучшения:
- Множество мелких улучшений документации.
-
rustc
теперь поддерживает три новые цели MUSL на платформе ARM:arm-unknown-linux-musleabi
,arm-unknown-linux-musleabihf
иarmv7-unknown-linux-musleabihf
. Эти цели поддерживают статически скомпонованные бинарные файлы. Однако, в собранном виде они пока не распространяются. - Повышена читабельность описаний ошибок в ссылках и неизвестных числовых типах.
- Компилятор теперь может быть собран с LLVM 3.9.
- Тестовые бинарные файлы теперь поддерживают аргумент
--test-threads
для указания количества потоков для запуска тестов, который действует точно так же, как переменная окруженияRUST_TEST_THREADS
. - В случае продолжительности выполнения тестов больше минуты показывается предупреждение.
- Вместе с выпусками Rust теперь доступны пакеты с исходными кодами, которые можно установить при помощи rustup через команду
% rustup component add rust-src
. Исходные коды могут быть использованы для интеграции и взаимодействия со средой разработки и другим инструментарием. - Ускорено обновление индекса реестра.
-
cargo new
получил флаг--lib
. - Добавлен вывод профиля сборки (release/debug) после компиляции.
-
cargo publish
получил флаг--dry-run
. - Сокеты на Linux в подпроцессах теперь закрываются правильно через вызов
SOCK_CLOEXEC
. - Определения Unicode обновлены до 9.0.
Стабилизация библиотек:
-
Cell::as_ptr
иRefCell::as_ptr
. -
IpAddr
,Ivp4Addr
иIpv6Addr
получили несколько новых методов. -
LinkedList
иVecDeque
теперь имеют новый методcontains
. -
iter::Product
иiter::Sum
. -
Option
реализуетFrom
для содержащегося в нём типа. -
Cell
,RefCell
иUnsafeCell
реализуетFrom
для содержащихся в них типах. -
Cow<str>
реализуетFromIterator
дляchar
,&str
иString
. -
String
реализуетAddAssign
.
Возможности Cargo
Самая большая возможность, добавленная в Cargo в этом цикле — «рабочие области». Описанные в RFC 1525, рабочие области позволяют группе пакетов разделять один общий файл Cargo.lock
. Это позволяет намного легче придерживаться единственной версии общих зависимостей при наличии у вас проекта, который делится на несколько пакетов. Для включения этой возможности в большинстве мультипакетных проектов достаточно добавить одну единственную строчку [workspace]
в Cargo.toml
верхнего уровня, более сложным установкам может потребоваться дополнительная настройка.
Другая существенная возможность — переопределение источника пакета. При помощи инструментов cargo-vendor
и cargo-local-registry
можно переопределять зависимости локально (vendoring). Со временем это станет фундаментом для построения инфраструктуры зеркал crates.io.
>>> Подробности