Выпуск Rust 1.24

оригинал: The Rust Core Team • перевод: LooMaclin • новости • поддержите на Patreon

Команда Rust рада сообщить о новой версии Rust: 1.24.0. Rust — это системный язык программирования, нацеленный на безопасность, скорость и параллельное выполнение кода.

Если у вас установлена предыдущая версия Rust, для обновления достаточно выполнить:

1
$ rustup update stable

Если же у вас ещё не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта. С подробными примечаниями к выпуску Rust 1.24.0 можно ознакомиться на GitHub.

Что вошло в стабильную версию 1.24.0

Этот выпуск содержит два очень интересных нововведения: rustfmt и инкрементальную компиляцию!

rustfmt

В течение многих лет нам нужен был инструмент, который мог бы автоматически форматировать Rust код в какой-то «стандартный» стиль. В этом выпуске мы рады объявить о выходе предварительной версии rustfmt, которая может быть использована со стабильной версией 1.24. Чтобы попробовать, выполните следующую команду:

1
$ rustup component add rustfmt-preview

Здесь есть два важных момента: во-первых, необходимо использовать rustup component add вместо cargo install. Если вы до этого использовали rustfmt, установленный через cargo install, вы должны удалить его в первую очередь. Во-вторых, это предварительная версия, как и сказано в названии. rustfmt пока не достиг версии 1.0 и мы ещё исправляем и настраиваем некоторые вещи. Как только rustfmt достигнет версии 1.0, мы выпустим компонент rustfmt, а rustfmt-preview будет считаться устаревшим.

В ближайшем будущем мы планируем написать пост об стратегии выпуска rustfmt, поскольку информации будет много и она выходит за рамки поста данного релиза.

Больше информации можно узнать на странице rustfmt на github.

Инкрементальная компиляция

Ещё в сентябре 2016 года мы писали об инкрементальной компиляции. Этот пост вдавался в подробности, о том как она работает, но ключевая идея такова: когда вы работаете над проектом, приходится часто компилировать его после небольших изменений в коде. Исторически так сложилось, что независимо от объёма изменений компилировался весь ваш код. Идея инкрементальной компиляции — компиляция только того кода, который действительно изменился. Это обеспечивает ускорение последующих компиляций.

Начиная с версии 1.24, это будет включено по умолчанию. Это означает, что ваши сборки будут быстрее. Не забывайте также о команде cargo check, которая позволит получить минимальное время сборки (прим. перев.: эта команда не собирает бинарный файл, а лишь проверяет корректность кода, но всё равно ведёт к ускорению сборки в отладочном режиме, т. к. кэш инкрементальной компиляции, насколько я понимаю, у них общий).

Это не конец работ по производительности компилятора и инкрементальной компиляции. В будущем мы планируем намного больше работы в этой области. Например, в этом выпуске мы стабилизировали ещё одно изменение, влияющее на производительность: codegen-units теперь установлены в 16 по умолчанию. Оно делает сборку быстрее, но конечный код будет немного медленней. Для максимальной производительности итогового кода необходимо выставить codegen-units равным 1 в Cargo.toml вашего проекта.

Другие изменения

Есть ещё одно изменение, о котором мы хотели упомянуть здесь: неопределённое поведение (UB). Rust стремится минимизировать неопределённое поведение: в безопасном коде его не должно быть совсем, а в небезопасном его должно быть по минимуму. Раньше вы могли вызвать неопределённое поведение в безопасном коде, выполнив panic! в FFI-функции. Например, так:

1
2
3
extern "C" fn panic_in_ffi() {
    panic!("Test");
}

Это не может работать, поскольку точный механизм работы паники должен быть согласован с C ABI — в данном случае; или с другим ABI в случае вызова из другой среды исполнения.

В Rust 1.24 этот код теперь прерывается (abort), а не создаёт неопределённое поведение.

Подробности смотрите в примечаниях к выпуску.

Стабилизация библиотек

Если вы фанат функции str::find, которая используется, чтобы найти необходимый char в &str вас порадует это изменение: теперь она в 10 раз быстрее! Это случилось благодаря memchr. [u8]::contains также использует её, но ускоряется не так сильно.

Также в этом выпуске стабилизированы несколько новых API:

Теперь следующие функции могут быть использованы в константных выражениях (например, чтобы инициализировать static):

Подробности смотрите в примечаниях к выпуску.

Улучшения Cargo

Самое большое изменение — включение инкрементальной компиляции по умолчанию, как было упомянуто выше.

Подробности смотрите в примечаниях к выпуску.

Разработчики 1.24

Множество людей участвовало в разработке Rust 1.24. Мы не смогли бы этого добиться без участия каждого из вас. Спасибо!