LINUX.ORG.RU

Rust 1.14

 


1

6

Представлен релиз 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
Сообщество экспериментирует и делает интересную работу в этой сфере: некоторые примеры можно посмотреть на слайдах (Jan-Erik) с семинара Rust Belt Rust или классический проект TodoMVC (Tim Ryan) как пример, построенный на библиотеке webplatform (позволяет работать с DOM в Rust).

Касательно платформ, большое количество платформ получило дополнительную поддержку:

Для 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),
}
Это привносило противоречивость, и теперь, когда RFC 1492 стабилизирован, в этом релизе всё замечательно компилируется. Это относится ко многим ситуациям кроме кортежей; для подробностей смотрите RFC.

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

Было несколько дополнений в стандартную библиотеку, но они не вписываются в какие-то особые категории в этом релизе. Вот основные моменты:

Более подробный список изменений.

Возможности Cargo

В Cargo был реализован RFC 1721. Cargo теперь будет передавать значение вывода команды rustc --print cfg сборочным скриптам. Мотивацией для этой функции послужила возможность Cargo компилировать объекты для статической компоновки с msvcrt под платформой MSVC.

Cargo теперь должным образом работает с CARGO_HOME, установленным только для чтения.

Cargo теперь будет игнорировать конфигурацию panic для профилей test и bench. Это важно, так как человек запустивший тесты полагается на панику как непрошедший тест, и со значением panic=abort, непрошедший тест отменит весь набор тестов.

Более подробный список изменений.

>>> Подробности

★★★★★

Проверено: Shaman007 ()
Последнее исправление: dotcoder (всего исправлений: 1)
Ответ на: комментарий от pftBest

Честно говоря не знал, что cargo --release собирает с -O3. Т.к. вообще пишут, что это вроде бы нестабильная оптимизация. Поэтому тест №2 (для всех участников) собирал с -O2.

Попробовал clang версии 3.4.1.

#clang new.c -o newclang -O2

#time ./newclang real 0m1.526s user 0m1.518s sys 0m0.007s

microbash
()
Ответ на: комментарий от Legioner

Почему? Не встречал ситуаций, в которых мне был бы удобней динамический язык. Чем веб-разработка тут может выделяться?

Бэкенд писать на динамическом языке — боль страшная. Но зависит от бэкенда.

Ну а фронтенд писать просто, там зачастую один тип: строка. И логика редко бывает очень сложной. Потому система типов будет скорее обузой.

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

Freyr69 ★★★
()
Ответ на: комментарий от makoven

Принять хтмл, а отправить html

Бывает, я и написал, зависит от бэкенда. В таком бэкенде хватит и баша с awk.

Если у тебя сервер статистики или сложная логика помимо генерации страничек, нужно обрабатывать данные разных типов, тогда начинается боль.

Да даже рест апи писать во сто крат проще и приятнее, когда есть алгебраические типы или хотя бы строгая статическая типизация.

Freyr69 ★★★
()
Ответ на: комментарий от microbash

-O3 может попортить программу только в одном случае - если в коде есть undefined behavior. Это опасно в C, потому что там UB на каждом шагу, но в Rust е UB нет, так что opt-level=3 абсолютно безопасен и рекомендуется к использованию.

Попробовал clang версии 3.4.1.

Rust использует версию 3.9 так что эксперимент не совсем чистый получается.

pftBest ★★★★
()
Ответ на: комментарий от microbash

Rust нельзя собрать без llvm :)
Выполни команду rustc --version --verbose
Просто некоторые дистрибутивы собирают раст с системным llvm а некоторые собирают с форком llvm что лежит в исходниках раста.
Для версий 1.13 и 1.14 в исходниках раста лежит llvm 3.9

pftBest ★★★★
()
Последнее исправление: pftBest (всего исправлений: 1)
Ответ на: комментарий от eao197

Сарказм относился к тому, что был задан простой вопрос, на который ожидался простой ответ «нравится»/«не нравится» и «создает проблемы»/«не создает». Вместо этого понеслось «а зачем», «а когда это может стать проблемой» и т.д.

Мы точно об одном и том же сообщении говорим?

Rust 1.14 (комментарий)

Я вижу, что ответ был дан, но сопровождался вопросом, причём совершенно без всей этой экспрессии, которую ты изображаешь.

И да, я прекрасно понимаю, что раст (особенно «сейчас») подойдёт далеко не всем и для такого выбора нужно удачное стечение обстоятельств. Поэтому мне тоже интересно представить условиях в которых, с одной стороны, достаточно «свободы» для такого выбора и при этом имеются серьёзные ограничения в плане возможностей обновиться.

Будет. Обязательно будет.

Вот именно обязательно? Напомню: речь шла о «диктовать выбор языка». В моей практике это происходит далеко не в 100% случаев, так что «обязательно» опять похоже на бред.

DarkEld3r ★★★★★
()
Ответ на: комментарий от DarkEld3r

Мы точно об одном и том же сообщении говорим?

Вот вопрос: Rust 1.14 (комментарий)

Нормальные ответы на него начались не сразу.

Вот именно обязательно? Напомню: речь шла о «диктовать выбор языка».

Откуда «диктовать выбор языка», если мы здесь разговариваем только о Rust-е?

Например, заказчик говорит, что у него сейчас основная система — это Ubuntu 14.04 LTS. Там GCC 4.8. Будь добр пиши на плюсах так, чтобы код собирался под GCC 4.8. Потому, что твой код заказчик будет затем использовать совместно с кодом от других подрядчиков. И колупаться с тем, чтобы ставить какой-то более свежий gcc или clang никому не упало.

Собственно, не вижу причин, по которым с Rust-ом должно быть как-то по другому. За исключением ситуации, когда на Rust-е пишут 5 человек, и каждый делает свой собственный пет-проджект.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

Нормальные ответы на него начались не сразу.

Ага, не сразу, а аж во втором сообщении после вопроса (если не учитывать (два) не относящиеся к нему). Причём в первом сообщении тоже не вижу «а зачем», «а когда это может стать проблемой» и т.д.

Откуда «диктовать выбор языка»,

Из моего сообщения, которое было процитировано.

И колупаться с тем, чтобы ставить какой-то более свежий gcc или clang никому не упало.

Приложение может поставляться заказчику вместе со всем необходимым, так что ему «колупаться» не придётся.

DarkEld3r ★★★★★
()
Ответ на: комментарий от pftBest

Команду выполнил, но ничего нового не увидел.

# rustc --version --verbose

rustc 1.13.0

binary: rustc

commit-hash: unknown

commit-date: unknown

host: x86_64-unknown-freebsd

release: 1.13.0

По поводу llvm спасибо за информацию, понял.

microbash
()
Ответ на: комментарий от DarkEld3r

Ага, не сразу,

Не сразу. Еще и объяснять пришлось.

Вот и сейчас мы говорим не о том, мешает ли Rust-оманам темп развития Rust-а или нет. Тогда как меня интересует именно это.

Вы можете что-то по теме моего вопроса сказать?

Из моего сообщения, которое было процитировано.

Вы в своем сообщении попытались уйти в какую-то другу степь. Поэтому ответ был дан только на то, что остается в рамках обсуждения Rust-а. Заказчик будет диктовать версию ОС. И версию компилятора. В мире C++ такое происходит сплошь и рядом.

Приложение может поставляться заказчику вместе со всем необходимым, так что ему «колупаться» не придётся.

Да, это всегда именно так и происходит.

eao197 ★★★★★
()
Ответ на: комментарий от microbash

Странно, у меня так:

$ rustc --version --verbose
rustc 1.14.0 (e8a012324 2016-12-16)
binary: rustc
commit-hash: e8a0123241f0d397d39cd18fcc4e5e7edde22730
commit-date: 2016-12-16
host: x86_64-unknown-linux-gnu
release: 1.14.0
LLVM version: 3.9

pftBest ★★★★
()
Последнее исправление: pftBest (всего исправлений: 1)
Ответ на: комментарий от eao197

Вы можете что-то по теме моего вопроса сказать?

Всё, что хотел - уже сказал.

В мире C++ такое происходит сплошь и рядом.

В очередной раз убеждаюсь, что мы живём в разных мирах. Что ж, мой мне нравится больше, постараюсь и дальше в нём оставаться.

Да, это всегда именно так и происходит.

Не уловил сарказм это или нет.

DarkEld3r ★★★★★
()
Последнее исправление: DarkEld3r (всего исправлений: 1)
Ответ на: комментарий от DarkEld3r

Всё, что хотел - уже сказал.

И там не было ничего, что могло бы быть ответом на мой вопрос.

В очередной раз убеждаюсь, что мы живём в разных мирах.

У меня разные условия. Где-то выбор зависит от меня, где-то нет. Опыт подсказывает, что если не бежать впереди паровоза и оглядываться на заказчиков, которые сидят на не самых новых дистрибутивах, то работать проще.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

О, так и думал, что сюда прибежит этот трёхзвёздочный клоун.

Что там новенького в мире повсеместного C++17?

anonymous
()
Ответ на: комментарий от pftBest

1. Тест С-версии с Clang39:

# clang39 -o newclang new.c -O2

# time ./newclang

real 0m1.441s
user 0m1.452s
sys 0m0.001s

2. Тест Rust-версии с Rust-1.14

# rustc --version --verbose
rustc 1.14.0 (e8a012324 2016-12-16)
binary: rustc
commit-hash: e8a0123241f0d397d39cd18fcc4e5e7edde22730
commit-date: 2016-12-16
host: x86_64-unknown-freebsd
release: 1.14.0
LLVM version: 3.9

# rustc -C opt-level=2 -o newrs new.rs

# time ./newrs

real 0m1.998s
user 0m1.981s
sys 0m0.015s

microbash
()
Ответ на: комментарий от microbash

Странно что clang быстрее gcc получился, а еще странно что такая большая разница с rust, надо будет посмотреть что там мешает.

pftBest ★★★★
()
2 февраля 2017 г.
Ответ на: комментарий от pftBest

С этим исправлением у меня теперь так работает:

# time ./new_rs
200574
60372774
120544974
180717174
240889374
301061574
309886830

real    0m1,422s
user    0m1,418s
sys     0m0,001s

Т.е. полностью догнал Clang!

microbash
()
Ответ на: комментарий от microbash

Да, я видел, но получается, при написании кода надо учитывать то что компилятор не сможет сделать такую оптимизацию сам.

pftBest ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.