Выпуск 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_value
mem::size_of
иmem::align_of
ptr::null
иptr::null_mut
Подробности смотрите в примечаниях к выпуску.
Улучшения Cargo
Самое большое изменение — включение инкрементальной компиляции по умолчанию, как было упомянуто выше.
Подробности смотрите в примечаниях к выпуску.
Разработчики 1.24
Множество людей участвовало в разработке Rust 1.24. Мы не смогли бы этого добиться без участия каждого из вас. Спасибо!