Выпуск Rust 1.24
Команда 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):
- Функции
newдляCell,RefCell, иUnsafeCell - Функции
newдля различных числовых типовAtomic*(AtomicBool,AtomicIsize,AtomicUsize) {integer}::min_valueи{integer}::max_valuemem::size_ofиmem::align_ofptr::nullиptr::null_mut
Подробности смотрите в примечаниях к выпуску.
Улучшения Cargo
Самое большое изменение — включение инкрементальной компиляции по умолчанию, как было упомянуто выше.
Подробности смотрите в примечаниях к выпуску.
Разработчики 1.24
Множество людей участвовало в разработке Rust 1.24. Мы не смогли бы этого добиться без участия каждого из вас. Спасибо!