Представлен релиз Rust 1.14 — системного языка программирования, нацеленного на безопасную работу с памятью, скорость и параллельное выполнение кода. В этот релиз вошли 1230 патчей.
Самое большое изменение в Rust 1.14 не связано с языком или компилятором: rustup достиг версии 1.0 и теперь является рекомендуемым способом установки Rust. Rustup предоставляет такие возможности, как установку Rust из официальных каналов, возможность обновления и переключения между стабильным, бета и ночным версиями компилятора, упрощение кросс-компиляции с бинарными сборками стандартной библиотеки под распространенные платформы. И, конечно, rustup работает на всех платформах, которые поддерживает Rust, включая Windows. Подробнее о rustup можно прочитать в официальном блоге или на странице GitHub.
Другая интересная новинка, это экспериментальная поддержка WebAssembly в качестве новой цели сборки, wasm32-unknown-emscripten
. Поддержка находится на раннем этапе, поэтому разработчики просят помочь в тестировании и сообщать им о найденных ошибках. С установленным emscripten компиляция кода на Rust в WebAssembly выглядит следующим образом:
$ rustup target add wasm32-unknown-emscripten
$ echo 'fn main() { println!("Hello, Emscripten!"); }' > hello.rs
$ rustc --target=wasm32-unknown-emscripten hello.rs
$ node hello.js
Касательно платформ, большое количество платформ получило дополнительную поддержку:
Для rustc
:
mips-unknown-linux-gnu
mipsel-unknown-linux-gnu
mips64-unknown-linux-gnuabi64
mips64el-unknown-linux-gnuabi64
powerpc-unknown-linux-gnu
powerpc64-unknown-linux-gnu
powerpc64le-unknown-linux-gnu
s390x-unknown-linux-gnu
И для std
:
arm-unknown-linux-musleabi
arm-unknown-linux-musleabihf
armv7-unknown-linux-musleabihf
Если вы используете одну из вышеперечисленных платформ, то следуйте инструкции по установке на сайте или добавляйте цели к текущей установке при помощи команды rustup target add
.
Все эти платформы 2-го уровня, подробнее об уровнях можно узнать на странице описания поддержки платформ.
Как и в примере работы сообщества над новой целью WebAssembly, в Rust на подходе другие, не менее примечательные, кроме вышеперечисленных, цели. Например, xargo упрощает кросс-компиляцию Rust для работы на голом железе. Если вы пишете операционную систему на Rust, или делаете что-то интересное на микроконтроллере, xargo может очень сильно облегчить вашу жизнь.
С появлением поддержки MIR в последних релизах, также продолжается работа над улучшением времени компиляции.
В языке появилось маленькое улучшение: поддержка RFC 1492. При помощи этого маленького улучшения увеличились места, где можно использовать ..
. Допустим, у вас есть структура:
struct Point {
x: i32,
y: i32,
z: i32,
}
..
, чтобы проигнорировать места, которые вам не интересны. Например:
let p = Point { x: 0, y: 1, z: 2 };
match p {
Point { x, .. } => println!("x is {}", x),
}
..
игнорирует y
и z
.Рассмотрим похожий Point
, но в качестве структуры кортежа:
struct Point(i32, i32, i32);
..
, чтобы проигнорировать все три элемента:
let p = Point(0, 1, 2);
match p {
Point(..) => println!("found a point"),
}
let p = Point(0, 1, 2);
match p {
Point(x, ..) => println!("x is {}", x),
}
Стабилизация библиотек
Было несколько дополнений в стандартную библиотеку, но они не вписываются в какие-то особые категории в этом релизе. Вот основные моменты:
- println!(), без аргументов, выводит новую строку. Раньше требовалась пустая строка.
- Wrapping impls standard binary and unary operators on references, as well as the Sum и Product iterators, making references to these types easier to use.
- Реализация From<Cow<str>> для String и From<Cow<[T]>> для Vec<T>.
- Расширение специализации .zip() на .map() и .cloned() для улучшенной производительности.
- Реализация RefUnwindSafe для атомарных типов.
- Специализация Vec::extend в Vec::extend_from_slice для производительности.
- Не использовать повторно случайные ключи HashMap. Это облегчает борьбу с одним из типов DDoS-атак.
- Более дружественное к кешированию представление внутренней памяти HashMap, для значительного улучшения в некоторых операциях.
- Реализация Add<{str, Cow<str>}> для Cow<str>. Поддержка
Add
присутствует в других строковых типах, поэтому отсутствие реализации дляCow
привносило противоречивость.
Более подробный список изменений.
Возможности Cargo
В Cargo был реализован RFC 1721. Cargo теперь будет передавать значение вывода команды rustc --print cfg
сборочным скриптам. Мотивацией для этой функции послужила возможность Cargo компилировать объекты для статической компоновки с msvcrt под платформой MSVC.
Cargo теперь должным образом работает с CARGO_HOME
, установленным только для чтения.
Cargo теперь будет игнорировать конфигурацию panic для профилей test и bench. Это важно, так как человек запустивший тесты полагается на панику как непрошедший тест, и со значением panic=abort
, непрошедший тест отменит весь набор тестов.
>>> Подробности