Хабрахабр

[Перевод] Выпуск Rust 1.24

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

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

$ rustup update stable

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

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

rustfmt

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

$ rustup component add rustfmt-preview

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

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

Для большей информации можете посетить страницу rustfmt на github.

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

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

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

Другие изменения вошедшие в релиз

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

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

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

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

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

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

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

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

  • new функции для Cell, RefCell, и UnsafeCell
  • new функции для различных числовых атомик типов (примечание: AtomicBool, AtomicIsize, AtomicUsize)
  • {integer}::min_value и {integer}::max_value
  • mem::size_of и mem::align_of
  • ptr::null и ptr::null_mut

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

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

Теги
Показать больше

Похожие статьи

Кнопка «Наверх»
Закрыть