LINUX.ORG.RU

Rust 1.17

 ,


3

9

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

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

$ rustup update stable

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

Что вошло в стабильную версию 1.17.0

Выпуск Rust 1.17.0 в основном вносит небольшие улучшения, преимущественно касающиеся удобства использования. Например, время жизни 'static теперь автоматически подразумевается для констант или статических переменных. При создании константы или статической переменной:

const NAME: &'static str = "Ferris";
static NAME: &'static str = "Ferris";

Rust 1.17 позволит вам больше не писать 'static, так как это единственное время жизни, которое имеет смысл:

const NAME: &str = "Ferris";
static NAME: &str = "Ferris";

В некоторых ситуациях это позволит избавиться от лишних повторений:

// было
const NAMES: &'static [&'static str; 2] = &["Ferris", "Bors"];

// стало
const NAMES: &[&str; 2] = &["Ferris", "Bors"];

Другим подобным косметическим улучшением является «короткая инициализация полей». Подобно ECMAScript 6, который называет это «Сокращение Значения Свойства Объектного Литерала» («Object Literal Property Value Shorthand»), дублирование может быть удалено при объявлении структур, к примеру:

// определение
struct Point {
    x: i32,
    y: i32,
}

let x = 5;
let y = 6;

// было
let p = Point {
    x: x,
    y: y,
};

// стало
let p = Point {
    x,
    y,
};

То есть форма записи x, y будет предполагать, что значения x и y соответствуют переменным с аналогичными именами, находящимися в данной области видимости.

Другое маленькое, но полезное улучшение касается в основном новичков в Rust, которые пытаются использовать +, чтобы соединить две &str вместе. Но это не работает, соединить вы можете лишь String + &str. Поэтому, было добавлено новое сообщение об ошибке, чтобы помочь пользователям, которые совершают подобную ошибку:

// код
"foo" + "bar"

// было
error[E0369]: binary operation `+` cannot be applied to type `&'static str`
 --> <anon>:2:5
  |
2 |     "foo" + "bar"
  |     ^^^^^
  |
note: an implementation of `std::ops::Add` might be missing for `&'static str`
 --> <anon>:2:5
  |
2 |     "foo" + "bar"
  |     ^^^^^

// стало
error[E0369]: binary operation `+` cannot be applied to type `&'static str`
 --> <anon>:2:5
  |
2 |     "foo" + "bar"
  |     ^^^^^
  |
  = note: `+` can't be used to concatenate two `&str` strings
help: to_owned() can be used to create an owned `String` from a string
reference. String concatenation appends the string on the right to the string on
the left and may require reallocation. This requires ownership of the string on
the left.
  |     "foo".to_owned() + "bar"

При использовании сценариев сборки Cargo вы должны указать расположение скрипта в вашем Cargo.toml. Однако, подавляющее большинство людей писали build = «build.rs», тем самым используя файл build.rs, расположенный в корне проекта. Теперь это соглашение поддерживается самим Cargo, и будет использовано по умолчанию, если существует файл build.rs. Мы предупреждали об этом изменении в течение нескольких последних выпусков. Вы также можете использовать build = false для отказа от этого соглашения.

В этом выпуске удалена старая система сборки на основе Makefile. Новая система, анонсированная в Rust 1.15, написана на Rust и в основном использует Cargo для управления сборкой. На данный момент она уже достаточно зрелая, чтобы быть единственной системой сборки.

В рамках этого изменения, пакеты из crates.io теперь можно использовать в системе сборки Rust. Первым был добавлен mdBook, и он теперь используется при сборки нашей разнообразной книжной документации:

Обратите внимание на ссылки на соответствующие репозитории; документы были перемещены из основного дерева. Кроме того, мы добавили четвертую книгу, которая все еще расположена в основном дереве: Книга «Нестабильные возможности Rust». Она описывает нестабильные возможности, содержит ссылки на задачи, связанные с их стабилизацией, и может содержать исходную документацию. Если есть возможность, которую вы хотите увидеть стабилизированной, то пожалуйста, примите участие в ее обсуждении!

Несколько выпусков назад rustup перестал по умолчанию устанавливать документацию. Мы внесли это изменение, чтобы немного разгрузить канал, а также потому, что не все пользователи в действительности хотят хранить локальную копию документации. Однако это создало ловушку: некоторые пользователи не были в курсе, что произошло изменение, и заметили бы это, только если бы у них пропало подключение к Интернету. Кроме того, некоторые пользователи хотели иметь локальную копию документации, независимо от их подключения. Таким образом, мы откатили данное изменение, и документация снова устанавливается по умолчанию.

Подробнее смотрите примечания к выпуску.

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

Был стабилизирован 21 новый интерфейс:

  • Arc::into_raw и Rc::into_raw позволят вам забрать Arc или Rc и получить сырой указатель.
  • Arc::from_raw и Rc::from_raw позволят вам забрать сырой указатель и получить Arc или Rc.
  • Arc::ptr_eq и Rc::ptr_eq возвращает true если оба Arc или оба Rc указывают на одно и то же значение (не обязательно значения, которые сравниваются, равны).
  • Ordering::then позволит вам сцепить два Ordering вместе, и Ordering::then_with позволит сделать это с помощью функции.
  • BTreeMap::range позволит вам итерировать лишь по части BTreeMap, и BTreeMap::range_mut позволит вам сделать это с возможностью изменения. collections::Bound может дать вам еще больше контроля.
  • process::abort будет полностью завершать процесс анормальным образом.
  • ptr::read_unaligned и ptr::write_unaligned аналогичны ptr::read и ptr::write, но без требований к выравниванию.
  • Result::expect_err зеркально подобен Result::expect, то есть работает с вариантом Err, а не с вариантом Ok.
  • Cell::swap аналогичен std::mem::swap, но позволяет вам делать это с &Cell вместо &mut T.
  • Cell::replace аналогичен std::mem::replace, но позволяет вам делать это с &Cell вместо &mut T.
  • Cell::into_inner позволит вам взять Cell, и извлечь его значение.
  • Cell::take позволит вам забрать значение Cell наружу, заменив его на Default::default.

Что касается других изменений, для многих методов Cell<T> требовалось ограничение T: Copy, но теперь это требование значительно ослаблено.

Box<T> теперь реализует более дюжины новых преобразований с помощью From.

SocketAddr и IpAddr также теперь имеют несколько новых преобразований. Раньше вы должны были писать код вроде этого:

"127.0.0.1:3000".parse().unwrap()

Сейчас же вы можете писать
SocketAddr::from(([127, 0, 0, 1], 3000))
// или
([127, 0, 0, 1], 3000).into())

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

Обратная трассировка теперь имеет более приятное форматирование, опуская некоторые незначительные детали по умолчанию.

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

Помимо ранее упомянутых изменений, касающихся build.rs, у Cargo есть еще несколько новых улучшений. cargo check --all и cargo run --package — два отсутствовавших до этого момента флага, которые теперь поддерживаются.

Теперь вы можете игнорировать проверки отзыва SSL. Конечно, по умолчанию проверка все еще производится.

Новое поле в Cargo.toml, required-features, позволяет указать конкретные возможности, которые должны быть установлены для цели, которую нужно собрать. Вот пример: предположим, что мы пишем контейнер, который взаимодействует с базами данных, и хотим, чтобы он поддерживал несколько баз данных. Мы могли бы это сделать в нашем Cargo.toml:

[features]
# ...
postgres = []
sqlite = []
tools = []

Возможность tools позволяет нам включить дополнительные инструменты, а возможности postgres и sqlite указывают, какие базы данных мы хотим поддерживать.

Раньше cargo build пыталась собрать все цели, которые вам нужны. Но что, если у нас есть файл src/bin/postgres-tool.rs, который является нужным только при условии, что возможности postgres и tools были включены? Раньше нам приходилось писать что-то вроде этого:

#[cfg(not(all(feature = "postgres", feature = "tools")))]
fn main() {
    println!("This tool requires the `postgres` and `tools` features to be enabled.");
}

#[cfg(all(feature = "postgres", feature = "tools"))]
fn main() {
    // код
}

Слишком много шаблонного кода для работы с cargo build. Еще печальнее дело обстояло с examples/, которые должны демонстрировать, как использовать вашу библиотеку. Но такие махинации возможны только при работе внутри самого пакета, поэтому вы потерпите неудачу, если попытаетесь использовать пример вне этого пакета.

С помощью нового ключа required-features мы можем добавить следующее:

[[bin]]
# ...
required-features = ["postgres", "tools"]

Теперь cargo build будет собирать наш postgres-tool, только если у нас включены две эти возможности, и поэтому мы можем написать нормальный fn main без всяких нагромождений вроде cfg.

Разработчики версии 1.17.0

Много людей внесли свой вклад в создание Rust 1.17. Мы не смогли бы сделать это без всех вас. Спасибо!

Авторы перевода и публикации @kgv, @vitvakatu, @ozkriff.

>>> Подробнее смотрите примечания к выпуску

★★★★★

Проверено: Shaman007 ()
Последнее исправление: sudopacman (всего исправлений: 3)

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

Rust не претендует на замену Ada. И даже не пытается. Применение в подобных областях остановится на выбрасывании std, ибо динамическая память + panic. Да и llvm этот ваш как-то подозрительный. В итоге проще использовать всякие MISRA C.

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

дайте анониму красночерное дерево с линками на родителя в нодах.

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

Rust не претендует на замену Ada. И даже не пытается.

Вы уже определяете вектор развития языка Rust и выбираете прикладные ниши для него?

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

ну он как бы старший помощник младшего стажера в бригаде второй группы мидлов по разработке.

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

Конкретно дерево — BTreeSet, upper и lower bounds как раз в этом релизе пропихнули.
Bidirectional итераторов точно нет, разве что может быть в itertools найдется то, что нужно.
С дропаньем элементов, на которых сидишь — смотри сам API, я не в курсе тут

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

да?

Да. Фокусы с x++ и ++x — это все из мира C. C++ привнес еще и своих заморочек.

а в гцц 6.3.0 до сих пор компилируется.

Мой пример так же, к сожалению, gcc 6.3.0 компилируется.

не пора ли переходить на раст?

Можно ли на нем заработать?

Есть определенное количество дебилоидов, которые говорят, что если нужен быстрый нативный язык, то вместо C++ нужно брать plain old C. Вот таким дебилоидам, действительно, пора переходить на Rust.

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

во, годный ответ! пошел смотреть. попробую свою поделку про дерево инетрвалов переписать.

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

ТАМ 300 СЖАТЫХ МЕГАБАЙТ!!!

Уже почти 400.

Теперь понятно, почему они только под 64bit разрабатывают. Чтобы эту монстрину собрать, нужно несколько десятков гигов оперативы.

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

ауеть. Может там вся история коммитов, картинки, иконки и прочее? чот я сомневаюсь что там кода столько. Качать лень, у меня интернет на собаках.

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

То есть на Си будет меньше? Я не совсем улавливаю связь между языком программирования и объёмом исходного кода конкретного приложения

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

Боже, какая истерика

19M	./components
68K	./docs
912K	./etc
1.9M	./ports
544K	./python
3.3M	./resources
772K	./support
1.3G	./tests
1.3G	./

Код в директории components, остальное — ресурсы, css, js библиотеки хтмл, картинки, бандленные зависимости и прочее

И если поcчитать, то это всего ~250KLOC, вообще даже близко несравнимо с объемом кода хромиума или лисы

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

Я особо и не возражал. Но пока Rust выйдет из категории «слишком новый», чтобы его начали серьёзно рассматривать для использования в упомянутых нишах, пройдёт много времени. Так что сравнивать, конечно, можно, но пока только для удовлетворения любопытства.

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

Боже, какая истерика

Мне проще было на лоре вбросить, чем все это говно распаковывать :)

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

Если лет через десять они его таки допилят до вменяемого состояния

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

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

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

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

anonymous
()

Rust — это системный язык программирования,

А почему это именно системный язык программирования?
Может наоборот - язык общего назначения, который (при особом извращении) можно использовать в качестве системного?

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

Эм, нет. Их перенесут (уже некоторые перенесли в виде quantum) на расте в огнелис

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

А почему это именно системный язык программирования?

Что вы понимаете под словом системный? Например на википедии написано что C# это тоже системный язык, но мы то понимаем что это не так. Скажите конкретно какие критерии не позволяют Rust быть системным языком, по вашему мнению.

при особом извращении

Кто вам такое сказал?

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

Что вы понимаете под словом системный?

Безпроблемный доступ к низкому уровню: возможность создания обработчика прерывания(не путать с линуховыми сигналами), полный контроль над памятью, возможность работать с портами и т.д.
Т.е. возможность написать софт без использования ОС, в идеале(до которого даже Си далеко) даже без асм-вставок или доп. либ(вроде HAL)
А то, и на Паскале сразу после Begin можно зарядить асм-вставку и забыть что на паскале пишешь, зато всем орать, что Паскаль в первую очередь системный язык, а не язык общего назначения.

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

написать софт без использования ОС

На голом железе разве что. Современные ОС защищают потроха от вмешательства, обработчик прерывания, полный контроль над памятью и т.д. невозможны в современных ОС, и дело не в языке.

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

Заморочено как-то там. И наверняка command.com в 64Кб уже не впихнёшь :)

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

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

На голом железе разве что. Современные ОС защищают потроха от вмешательства, обработчик прерывания, полный контроль над памятью и т.д. невозможны в современных ОС, и дело не в языке.

До сих пор часто используется DOS`ка, только потому, что даёт «полный» контроль над железом. По сути выполняет роль FreeRTOS для x86(хоть последняя и поддерживает его)

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

1.3 G тестов. И кто-то еще говорит, что формальная верификация программ сложная и не стоит того.

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

Используется, то есть приносит пользу? Есть какие-то примеры, кроме «мам, смотри как я могу?»?

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

Опять начинается. Тебе еще лэйаут директории чтоли скинуть так же? Там куча CSS хрени и js-либ

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

Так я и понял что одни только домыслы и догадки. Конечно можно на Rust писать обработчики прерываний без ассемблерных вставок. Вот, например: http://blog.japaric.io/quickstart/ Полный стек для программирования arm микроконтроллеров без вставок на C и ассемблере.

Но надо понимать что все зависит от архитектуры, например на x86_64 ты и на C не сделаешь обработчик прерывания без ассемблерных вставок.

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

Стоит ли начинать учить Rust вместо Си? Или Си ещё актуален?

Си будет актуален как минимум для чтения чужих исходников. Так же рекомендую поучить C++. Не обязательно с расчётом писать, но на ютубе сейчас появились курсы на русском. Так вот, понимание (или хотя бы знакомство) всей низкоуровневой петрушки C++ (вроде 100500 конструкторов/деструкторов статических объектов, концепции ссылок, перемещения и прочего) здорово упрощает понимание любых других языков, в том числе и rust.

atrus ★★★★★
()

увидел это и отпало желание открывать сайт с рустом

#[cfg(not(all(feature = «postgres», feature = «tools»)))]
fn main() {
println!(«This tool requires the `postgres` and `tools` features to be enabled.»);
}

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

В данной статье есть такая запись: «As we are not using any interrupt we just register a catch all handler for all the possible interrupt sources.» Т.е. они возможно не используют прерывания в данном случае. При этом используют крейт cortex-m. Я залез в него на гитхабе: «The cortex-m crate provides an API to use functionality common to all Cortex-M microcontrollers.» Возможно, он как раз дает функционал прерываний. И у него внутри asm.

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

Т.е. возможность написать софт без использования ОС

https://www.redox-os.org/ Оно? Конечно, ОСь игрушечная, с микроядром и прочими библиотекаршами, да и пилится в полтора рыла, но все же ...

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

В этой статье не показаны прерывания, потому что japaric готовит вторую статью специально про них. Причем это будет прорыв, потому что он придумал как разграничить использование регистров из прерываний и main loop, а так же local storage для прерываний.

Крейт cortex-m использует ассемблерные вставки не для прерываний, а для спец инструкций таких как wfi и bkpt, а так же для распечатки стека и регистров, если нужно. Все это нельзя сделать на С без ассемблера, значит и на расте нужны вставки.

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

Шутка удалась.

Ваши проблемы. Не умеете находить информацию - страдайте. Я вот только недавно видел пару вполне приличных наборов лекций для начинающих.

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

увидел это и отпало желание открывать сайт с рустом

Так в том и смысл, что теперь - начиная с 1.17 - этот workaround не нужен.

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

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

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

Ну вот такую ерунду в Rust-е просто так не напишешь:

А в чем проблема? (разумеется, при условии что a+b возвращает новую строку, а не меняет состояние a или b)?

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

Меня больше всего озадачивает, почему, вместо того чтобы сделать нормальные variadic generics, команда Раст упорно продолжает разрабатывать макросы. Причем есть уже два типа макросов с разным синтаксом (1.0 и 1.1), и активно пилится третий (2.0).

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

Если нужен какой то экзотический метарограмминг или ДСЛ, так и быть, юзаем макросы. Но в Расте нужно использовать макрос, чтобы вывести «Hello World» в stdout. (!)

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

Первое что на ум пришло - ПОС-системы для FixPrice (но там они заряжают emudos для РМК-кассира, а потом сами дописывают дрова(под ДОС) для дисплеев покупателя и сканеров)

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

Но надо понимать что все зависит от архитектуры, например на x86_64 ты и на C не сделаешь обработчик прерывания без ассемблерных вставок.

Ну почему же. 80с51(всё семейство), атмега(всё семейство) - кто не хочет мозолить пальцы в АСМе - пишут на C. Эти контроллёры под силу rust?

Ну конечно даже под x64 на C нельзя работать в SMM без асма(о чём я выше и говорил)

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

Темплейты, особенно как в стл или у всяких александреск, это чисто декларативное программирование. Этакий урезанный чисто функциональный язык, исполняемый во время компиляции. Это круто, но не у каждого хватит мозгов что-то сложное на этом написать и, тем более, прочитать. Макросы - более простая вещь, особенно когда допилят 2.0, ну и результат применения макросов можно посмотреть, отлаживать удобнее.

Форматированный вывод - это как раз тот самый dsl, которым описывается формат. Хелло уорлд - просто частный случай.

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

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

Дискуссии по этому поводу идут с 2014 года и бьют рекорды по количеству комментариев:

https://github.com/rust-lang/rfcs/issues/376 https://github.com/rust-lang/rfcs/pull/1935

Но воз и ныне там.

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