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)

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

Можно в raw stdout. Можно с буферизацией. Можно в сокет. Можно в строку на куче, динамически её расширяя.

А можно и в статический буфер на стеке или где угодно, вроде snprintf. Как-то так: https://is.gd/rAr7RL

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

Огласите весь список! Что там полезного создали в первой половине 70-х?

Не можешь огласить - просто слейся, ну или подай признаки мысли.

Ты такой смешной.))

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

Компилятора С версии 1972-го года? Месяца за два-три набросать можно. Но зачем.

Какой ты кокетливый. Твой друг 5 раз пощекочет тебя бородкой перед утренним смузи.)) Сравнивать можно только сравнимое. Приведу тебе еще пример. Есть firefox, написанный на C++ (с небольшим количеством файлов на «C»). Им пользуются сотни миллионов людей. А есть еще servo, написанный на rust. Им не пользуется никто, даже разработчики. Потому как servo дерьмо дерьмом.

Так тебе доступно?

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

Есть firefox, написанный на C++ (с небольшим количеством файлов на «C»). Им пользуются сотни миллионов людей. А есть еще servo, написанный на rust.

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

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

не поддерживается компилятором llvm который используется в rust.

А сам-то он что нить может без виртуальной машины(которая между прочим на плюсах написана)? Чем же он тогда системный???

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

Зачем?

Вот системный язык нужен, а зачем его с нуля писать, не пользуясь готовыми инструментами?

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

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

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

Странная нападка, учитывая что мы на сайте посвященном open source. Вот llvm - open source, разрабы раста кинули его себе в директорию и используют, нужна поддержка какой-то архитектуры, так запили в llvm, тогда ее смогут использовать и clang и кто угодно. Да, llvm написан на плюсах, раст еще не был готов, и что теперь все остальное тоже на плюсах писать?

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

...Есть рабочий firefox и нерабочий servo...

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

И где тут можно уловить связь? Твой бородатый друг, соблазнивший тебя маффинами, не рассказал тебе, что они с каннабисом и буквально грязно тобой воспользовался.))

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

Тем что готовый инструмент не всегда удобен. Пример со старыми архитектурами я показал. Эта прослойка в виде llvm и делает rust в первую очередь прикладным, а уже потом в какой-то мере системным, а не наоборот, как сказано в новости.

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

Ты хочешь сказать, что язык не является системным, если он не поддерживает все архитектуры, которые поддерживает Си? А пацаны то и не знали.

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

Эта прослойка в виде llvm позволяет разделять труд и ответственность, что очень важно при создании больших проектов. Допили в llvm нужные архитектуры.

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

Любой байт-код не способен отразить все нюансы архитектуры. К тому же он вынужден тянуть за собой тонну ненужного хлама. Этакий, своеобразный HAL(который тоже можно рассматривать как виртуальную машину) - изоляция от нормального железячного уровня, до набора кем-то придуманных правил и законов.

Напомню, что и сам HAL является прототипом виртуализации, скрывая железо, и обеспечивая доступ к нему за свой счёт. Именно это я имел ввиду под виртуальной машиной. Программа, написанная по правилам и законам HAL/VM никогда не сможет достучаться до железа, если это ей не разрешено.

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

Что бы увидеть имеет ли твоя фраза смысл надо всего лишь заменить слово llvm на слово gcc и посмотреть что получится:

Эта прослойка в виде gcc и делает rust в первую очередь прикладным, а уже потом в какой-то мере системным, а не наоборот, как сказано в новости.

Получилась ли что то осмысленное? нет, значит и оригинальное предложение не имеет смысл.

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

Любой байт-код не способен отразить все нюансы архитектуры.

А байткод gcc почему способен отразить все нюансы?

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

Что бы увидеть имеет ли твоя фраза смысл надо всего лишь заменить слово llvm на слово gcc и посмотреть что получится:

Ну почему именно gcc? мало ли спецом заточенных компилеров, своими расширениями дающих доступ именно к нужной архитектуре полностью (keil C51)?

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

С++ — не системный язык? Как жаль

Он так же приспособлен к системному программированию как и паскаль и ваш раст. Т.е. можно использовать, но при «особых болезнях».

З.Ы. Забыл ещё - есть sdcc

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

Любой байт-код не способен отразить все нюансы архитектуры.

Язык C тоже не способен отразить все нюансы архитектуры (OUT DX, EAX на чистом С, а?). Точнее, он отражает кое-какие особенности PDP-11 1970 года выпуска. При чём тут это?

К тому же он вынужден тянуть за собой тонну ненужного хлама.

Э? В смысле? Весь LLVM IR остаётся внутри LLVM, наружу выходит только оптимизированный код для целевой машины и немного инфраструктурного кода.

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

С++ — не системный язык?
Он так же приспособлен к системному программированию как и паскаль

Ыыы. Это достойно записи в комментарий.

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

Язык C тоже не способен отразить все нюансы архитектуры (OUT DX, EAX на чистом С, а?).

http://www.tutorialspoint.com/unix_system_calls/inw.htm
И для каждой OS компилер С сделает оптимальный вариант. Если же есть доступ к железу(тот же ДОС), то и превратится этот вызов в OUT BL/DX, регистр/значение, без всяких АСМ-вставок.

...немного инфраструктурного кода.

И сколько же?

И в довесок, в rust можно отключить поддержку многопоточности, контроля за памятью/указателями? Или опять же будет «немного инфраструктурного кода.»

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

Ыыы. Это достойно записи в комментарий.

Записывай - дарю. Только полностью пиши, а то забыл про «Т.е. можно использовать, но при «особых болезнях».». Если мне надо на С++ пару байт в BDA записать я это везде сделаю, а вот драйверок накатать - ну я даже не ведаю как надо на С++ «извернуться» для этого.

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

Т.е. поддержку многопоточности, контроля за памятью/указателями всё-таки можно? Или все эти вещи реализуются чем-то другим?

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

в rust можно отключить поддержку многопоточности, контроля за памятью/указателями?

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

Для начала стоит ознакомится с no_std.

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

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

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

LLVM IR остаётся внутри LLVM, наружу выходит только оптимизированный код для целевой машины и немного инфраструктурного кода.

И это растовский инфраструктурный код.

И причем тут llvm?

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

ну я даже не ведаю как надо на С++ «извернуться»

Так бы и сразу сказал: «не знаю ни одного языка кроме C и ассемблера, поэтому все остальные языки не системные»

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

Так бы и сразу сказал: «не знаю ни одного языка кроме C и ассемблера, поэтому все остальные языки не системные»

Ну поведай хоть один драйвер, работающий в 0м кольце на С++, если его конечно не превратили обратно в С.

А-то пукать все умеют.

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

И причем тут llvm?

Как я и написал: не при чём. Но, скажем, LLVM intrinsic popcnt может развернуться в вызов подпрограммы.

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

Ну поведай хоть один драйвер, работающий в 0м кольце на С++, если его конечно не превратили обратно в С.

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

https://github.com/redox-os/kernel/tree/master/src

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

Ну поведай хоть один драйвер, работающий в 0м кольце на С++, если его конечно не превратили обратно в С.

Ну OS haiku например и некоторые ее дрова.

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

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

raw-cpuid = { git = "https://github.com/gz/rust-cpuid", branch = "master" }

Ладно, лезем к соседям, а там:

extern crate gcc;

fn main() {
    gcc::compile_library("libcpuid.a", &["src/cpuid.c"]);
}

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

Ну OS haiku например и некоторые ее дрова.

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

Или же всё-таки из С++ сделали С?

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

Ага моя, а это шо за папка затесались? https://github.com/haiku/haiku/tree/master/src/system/kernel/arch/x86/64

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

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

шаблоны

Почему все сишники так боятся шаблонов? Они же никак не влияют на рантайм. Это просто генераторы кода.

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

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

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

Потому что на самом деле видели только жабу и не в курсе что в плюсах шаблоны это не блоатваре жабы а замена #define

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

Там того С++ кот наплакал. Куда ни плюнь - везде С++, опущенный до С. И пока не насобирается «низкий» код, появляются классы, использование которых только ради принципа, а не разумного выбора

Про АСМ вставки я уже говорил -

Т.е. возможность написать софт без использования ОС, в идеале(до которого даже Си далеко) даже без асм-вставок или доп. либ(вроде HAL).

Ну а по поводу паскаля - так команд.ком, xcopy и пр. на чём угодно можно написать - это уже прикладной уровень

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

А ты заглянул что лежит в cpuid.c?

#include <stdint.h>

void c_cpuid(uint32_t* a, uint32_t* b, uint32_t* c, uint32_t* d) {
   asm volatile ("cpuid"
      : "+a"(*a), "=b"(*b), "+c"(*c), "=d"(*d)
   );
}
pftBest ★★★★
()
Ответ на: комментарий от drfaust

Там с++ все ядро, как бы тут не усирался.

неймспейсы, классы, наследования, шаблоны.

И пока не насобирается «низкий» код, появляются классы, использование которых только ради принципа, а не разумного выбора

мамким разработчик ядер в треде, все в по коляскам!

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