LINUX.ORG.RU

Вышел Rust 1.20

 


2

7

Команда разработчиков Rust с удовольствием объявляет о выходе новой стабильной версии Rust: 1.20.0.

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

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

rustup update stable

(Прим. пер. - иногда предварительно нужно выполнить rustup self update)

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

Что нового в стабильной версии Rust 1.20.0

В предыдущих версиях Rust вы уже могли определять «ассоциированные функции» для трейтов, структур и типов-сумм:

struct Struct;

impl Struct {
    fn foo() {
        println!("foo - это ассоциированная функция структуры Struct");
    }
}

fn main() {
    Struct::foo();
}

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

В Rust 1.20 добавлена возможность использовать «ассоциированные константы»:

struct Struct;

impl Struct {
    const ID: u32 = 0;
}

fn main() {
    println!("ID структуры Struct: {}", Struct::ID);
}
Здесь константа ID ассоциирована со структурой Struct. Как и функции, ассоциированные константы могут быть определены для трейтов и типов-сумм.

Использование ассоциированных констант в трейтах предоставляет дополнительные возможности. Ассоциированная константа в трейте используется также, как и ассоциированный тип: её можно определить, не присваивая ей значение. Значение константы будет указано при реализации трейта:

trait Trait {
    const ID: u32;
}

struct Struct;

impl Trait for Struct {
    const ID: u32 = 5;
}

fn main() {
    println!("{}", Struct::ID);
}
В предыдущих релизах Rust при реализации трейта, представляющего числа с плавающей точкой, приходилось писать такой код:
trait Float {
    fn nan() -> Self;
    fn infinity() -> Self;
    ...
}
Это немного неудобно, но, что более важно, такие функции невозможно использовать для определения констант. Из-за этого приходилось вводить дополнительные константы:
mod f32 {
    const NAN: f32 = 0.0f32 / 0.0f32;
    const INFINITY: f32 = 1.0f32 / 0.0f32;

    impl Float for f32 {
        fn nan() -> Self {
            f32::NAN
        }
        fn infinity() -> Self {
            f32::INFINITY
        }
    }
}
Ассоциированные константы позволяют реализовать всё это намного проще. Трейт будет выглядеть таким образом:
trait Float {
    const NAN: Self;
    const INFINITY: Self;
    ...
}
А его реализация станет намного проще и расшит возможности использования трейта:
mod f32 {
    impl Float for f32 {
        const NAN: f32 = 0.0f32 / 0.0f32;
        const INFINITY: f32 = 1.0f32 / 0.0f32;
    }
}
Ассоциированные константы были предложены три года назад в RFC 195. И мы наконец смогли их реализовать! Этот RFC содержал все виды ассоциированных элементов, не только константы. Некоторые из них мы смогли реализовать быстрее чем другие. Мы много работаем над улучшением поддержки работы с константными выражениями, чтобы увеличить возможности Rust в области мета-программирования во время компиляции. В будущем в этой области появятся дополнительные возможности.

Кроме того, мы исправили ошибку при работе с макросом include! в тестах документации: пути к файлам определялись относительно рабочего каталога, а не каталога, в котором находится файл кода.

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

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

Макро unimplemented! теперь принимает параметр, в котором можно указать причину отсутствия реализации.

Добавлена поддержка Unicode 10.0.0.

Функции min и max были переписаны на Rust, и больше не используют cmath.

Внедрена защита от уязвимости Stack Clash. Основные изменения: stack probes и отключение дополнительных ручных проверок для стека основного потока. Для включения защиты достаточно скомпилировать проект в Rust 1.20, изменения в коде не требуются.

В стандартную библиотеку добавлены три новые функции сортировки: slice::sort_unstable_by_key, slice::sort_unstable_by и slice::sort_unstable. Как вы заметили, все три содержат «unstable» в названиях. Стабильность — это свойство алгоритма сортировки, которое требуется не всегда, но раньше в стандартной библиотеке не было алгоритмов нестабильной сортировки. Теперь доступны обе возможности! Для демонстрации разницы между этими видами сортировки рассмотрим список:

rust
crate
package
cargo
Список, отсортированный алгоритмом стабильной сортировки только по первой букве, должен выглядеть таким образом:
crate
cargo
package
rust
То есть, если в исходном списке слово crate предшествовало слову cargo, то и в отсортированном списке оно должно стоять первым. Алгоритм нестабильной сортировки тоже может выдать такой результат, но допускается и вариант с измененной последовательностью:
cargo
crate
package
rust
Как вы понимаете, меньшее количество ограничений часто позволяет создать более быстрый алгоритм. Если вам не важна стабильность сортировки, нестабильная сортировка может оказаться быстрее, чем стабильный вариант. Как обычно, лучше попробовать оба варианта и сравнить их скорость. Эти функции сортировки были добавлены в RFC 1884. По ссылке вы можете узнать больше подробностей, включая результаты бенчмарков.

Также были стабилизированы следующие API:

и некоторые другие.

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

Этот релиз внес полезные улучшения в менеджер пакетов cargo. Первое и самое важное: токен аутентификации для crates.io хранился в ~/.cargo/config. Обычно маска доступа для файлов конфигурации устанавливается в 644, то есть чтение разрешено всем. Но в этом файле хранится секретный токен. Мы переместили токен в отдельный файл ~/.cargo/credentials, таким образом для него может быть установлен доступ 600, и он будет скрыт от других пользователей системы.

Если вы использовали пакеты Cargo, создающие дополнительные исполняемые файлы, вы знаете, что их исходный код хранится в src/bin. Но иногда вам может понадобиться создать несколько дополнительных исполняемых файлов, требующих много кода. В этом случае код может храниться в файлах src/bin/client.rs и src/bin/server.rs и все субмодули этих файлов попадут в один каталог, что неудобно и создает путаницу. Теперь мы используем соглашение, что такие файлы как src/bin/server/main.rs и src/bin/client/main.rs также используются для создания дополнительных исполняемых файлов. Это позволяет удобнее разграничить код.

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

★★★

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

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

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

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

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

Поэтому для quick sort-а нужно unsafe использовать. Unsafe. Для quick sort-а. Логично же.

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

Ты прям Лев Толстой. Какой гуй написал ты сам, я так понял, сишники и плюсовики каждый второй гуй пишут, и у них этого понимания ого-го сколько?)


Как бы для некоторых вещей надо залезать в Qt и править. Это, оказывается, довольно легко. ООП, однако. Которого в rust не завезли

Не завезли. Пока. Но всё ведь может измениться. Придумали уже, к чему тогда будете придираться?) Я бы понял, если все критики пошли и разнесли в пух и прах разработчиков языка, но нет, приятнее спорить с его адептами, для пущего веса приписывая себе достижения C/C++/etc.

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

А в Хаскелле, чтобы записать строку в файл, придумали монады. Целую отдельную сущность, чтобы просто записать строку в файл, Карл! С ума сойти.

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

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

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

Достаточно прочитать мотивацию запрета на рекурсию или бесконечные циклы (вроде бы не путаю).

Я написал рекурсивную функцию и могу доказать, что глубина никогда не превысит, допустим, пяти, и тем не менее, не могу её использовать, потому что так написано в книжке. Даже если моя задача на рекурсию ложится отлично. Потому что, очевидно, что в большинстве (из тех двух с половиной) случаев, когда кто-то пишет рекурсию, никто ничего не доказывает. Отсюда и запрет.

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

Поэтому для quick sort-а нужно unsafe использовать. Unsafe. Для quick sort-а. Логично же.

Не для квиксорта per se, а для маленькой функции из стандартной библиотеки. Они могли эту функцию в компилятор встроить, тогда бы этот unsafe глаза бы не мозолил, только это бы не поменяло ничего на практике.

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

А в Хаскелле, чтобы записать строку в файл, придумали монады.

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

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

Я понимаю. А ты понимаешь, что мишенью для внедрения бэкдоров станет unsafe-код на crates.io?

Каких ещё бэкдоров?

И, ВНЕЗАПНО найти места, куда нужно внедрять уязвимости тоже легче, unsafe же.

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

Legioner ★★★★★
()
Ответ на: комментарий от shkolnick-kun

Я понимаю. А ты понимаешь, что мишенью для внедрения бэкдоров станет unsafe-код на crates.io?

Вы уже победили https://underhanded.rs/en-US/

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

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

Это там где языки для программирования контроллеров строго определены. Их 5 штук. А другие нельзя. Или это из требований МЭК?

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

Но всё ведь может измениться.

Ага. Вот тогда я, сидя с удочкой на берегу пруда и буду rust ковырять. На пенсии.

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

Это вроде как требования из MISRA-C и MISRA-C++.

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

А в Хаскелле, чтобы записать строку в файл, придумали монады

Утверждение уровня «в си чтобы вывести Hello world придумали функции»

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

Итератор == метод реализация метода next. Всякие map, filter и fold сами сгенерируются трейтом. Ты не можешь реализовать итеративный фибоначчи?

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

А в Хаскелле, чтобы записать строку в файл, придумали монады

Утверждение уровня «в си чтобы вывести Hello world придумали функции»

Я не знаю Си, но подозреваю, что вывести на печать в нем можно и без printf. Покажешь, как в Хаскелле записать «hello world» в файл без монады IO? Чтобы я убедился в правомочности твоего сравнения.

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

Среда гарантирует отсутствие прерывания и переключения нити во время «грязного» состояния объекта?

Давно в эмбедеде перестали быть нужны примитивы синхронизации?

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

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

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

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

А зачем учить писать на расте людей, которые не знают структуру двусвязного списка и не могут ее реализовать? Для этого есть гораздо более подходящие языки.

Rust для людей, которым уже не нужно учиться писать списки, а нужно использовать готовые примитывы stdlib и в крайне редких случаях имплементить свои структуры данных (которые они знают как исплементить).

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

Вы не находите что ваша риторика очень напоминает

В эмбедеде будет больше использоваться ассемблерный код и явные приведения адресов из констант к указателям
Следовательно выгод от использования Си там будет меньше

Весь эмбеддед пишется на ассемблере, Си и тем более С++ там вообще нет.

@ 30 лет назад

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

Мне кажется, что C и C++ начали применять в системных задачах практически как только, так сразу.

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

Но Rust-оманам приятнее говорить о том, как всем будет хорошо где-то там, в прекрасном будущем. Продолжайте, это очень интересно.

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

но если в «гондурасе» перестанут спонсировать разработку Rust-а, в РФ ее никто развивать не будет.

Да, но нет. Т.к. это опенсурс, то всегда найдется кучка RMSов и Линусов на развитие аля just for fun.

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

Но Rust-оманам приятнее говорить о том, как всем будет хорошо где-то там, в прекрасном будущем. Продолжайте, это очень интересно.

Не намного лучше рассказов о том, что вот концепты и модули добавят - и заживём.

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

Но Rust-оманам приятнее говорить о том, как всем будет хорошо где-то там, в прекрасном будущем.

Так и в нашей небольшой фирме на 600 человек Rust стали применять сразу в системных задачах. Для ARM\MIPS\PowerPC онли Rust. Всё ваше сообщение основано на эмоциях, но не на фактах

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

Мне кажется, что C и C++ начали применять в системных задачах практически как только, так сразу.

Дык. Что проще, какой-нибудь PL/I на Unix портировать или пользоваться комплектным cc? C++ всего за 7 лет с момента выпуска 1.0 переместился на 2-е место, обогнав паскаль и аду, да. Но до сих пор есть не на всех embedded платформах, и не в ядре линукса.

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

Фибоначчи на итераторах? В смысле на обычном наборе типа range/map/flatmap/filter/fold? Я вот так сходу не представляю.

Не так уж и сложно https://play.rust-lang.org/?gist=cf3b94ec5b3d4f7190995789a6092673&version...

Третья реализация

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

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

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

Если сделают среду, по удобству не хуже Arduino, то выстрелит.

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

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

Ну вообще само по себе заимствование мутабельной ссылки в нескольких местах одновременно небезопасно, язык же не знает особенностей вашей платформы, поэтому без unsafe в этом случае никак. Если не ошибаюсь тут нужен UnsafeCell, так как без него вообще будет UB. Можно вроде над ним просто сделать свою обертку вроде Mutex, но без локов, если это будет на данной платформе безопасно. Но это очень специфичный случай.

Точно сказать не могу, тк с rust пока не слишком хорошо знаком.

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

С «для выполнения IO придумали монаду IO» спорить не буду. Возражение было на «для выполнения IO придумали монады».

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

Согласен, был неточен.

Суть в том, что фундаментальное ограничение, на котором построен ЯП, вызывает неудобство при решении определенного класса задач. Можно ли из-за этого неудобства считать тотальную иммутабельность или правило «на каждый объект должна единовременно существовать только одна изменяемая ссылка и сколь угодно неизменяемых» ненужной блажью, если они приводят к избыточному программированию?

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

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

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

«на каждый объект должна единовременно существовать только одна изменяемая ссылка или сколь угодно неизменяемых»

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

let fibcomb = iter::repeat(()).scan((1u32, 1), |s, ()| { ... });

Пипец ты изврат-мастер.

extern crate itertools as it;
let fibcomb = it::iterate((0, 1), |&(prev, curr)| (curr, prev + curr)).map(|(_, a)| a);

Или вот, почти копипаст твоего варианта::

extern crate itertools as it;
let fibcomb = it::unfold((1u32, 1), |s| {
    let r = s.0;
    let b = s.1;
    s.1 += s.0;
    s.0 = b;
    Some(r)
});
Esper
()

Один rust не педе-rust, как ховорится.

Ну или cargo build --release

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

Т.к. это опенсурс, то всегда найдется кучка RMSов и Линусов на развитие аля just for fun.

Тут вот соседняя новость про релиз языка D, который 17 лет развивается just for fun, без поддержки больших корпораций.

Так и в нашей небольшой фирме на 600 человек Rust стали применять сразу в системных задачах.

Тут очень хочется спросить: а вы там случайно не в числе топовых разработчиков числитесь?

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

Но забываю, что playground теперь некоторые крейты может подтягивать.

Топ-100 крейтов с crates.io, емнип.

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

Тут вот соседняя новость про релиз языка D, который 17 лет развивается

Ruby тоже развивается. Но он никому не нужен, т.к. у всех уже есть PHP, который плюс-минус то же самое. Удивительно, кстати, как python умудрился пролезть в сферу линукс-админства. Наверное подкупил кучей батареек. Иначе и там бы был PHP.

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

У Ruby своя ниша, где он успешно рулит. Своеобразный такой язык с отличным сообществом

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

Удивительно, кстати, как python умудрился пролезть в сферу линукс-админства.

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

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

Ruby тоже развивается. Но он никому не нужен.

Руби типичная жертва хайпа. Немодно стало и кранты. А ведь сейчас сам язык и его реализации стали намного лучше и шустрее. Забавно, что раскрутить можно любое днище, тот же руби 1.8 - самый тормозной в мире на то время, или Го - самый тупой язычок на все времена.

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

Да ты же поехавший! По однострочникам судишь о языке, ничего не понимая ни в языке ни в однострочниках

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

Интернет-магазины в одну строку уже давно никто не пишет

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

Ruby тоже развивается. Но он никому не нужен

Без обид, но мне иногда кажется, что часть LOR-овский растоманов живет в каком-то особом мире. В котором Ruby никому не нужен, Ada не существует, embedded — это только микроконтроллеры...

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

В котором Ruby никому не нужен

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

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

Не стоит экстраполировать мнение одного человека на всё сообщество.

Если не ошибаюсь, то автор дока раста сам пришёл с руби. Как и многие другие.

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

Я, конечно, написал с ошибкой, но все-таки:

что часть LOR-овский растоманов

Как разговор о «части LOR-овских растоманов» может быть экстраполяцией на все сообщество?

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