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)
Ответ на: комментарий от Valeg

С такими проектами как Redox и Servo он свою нишу найдёт.

Хорошая шутка. Servo - недоделанное, глючное и тормозное УГ, Redox - игрушечная ОС.

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

Servo - недоделанное, глючное и тормозное УГ, Redox - игрушечная ОС.

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

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

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

Development of Servo began in 2013. The very first commit on 8 February 2012. Мелкософт свой Edge на новом движке в 2014-м начал, в 2015-м зарелизил. И не надо говорить, что им было можно было взять часть старого кода, в servo тоже движок JS на С++, да и никто не заставлял их велосипедить все и вся.

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

да и никто не заставлял их велосипедить все и вся

Серво research project же.

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

Ты не правильно понимаешь суть. Servo - это экспериментальный проект, никто его «доделывать» не собирается. Сейчас как раз то, чего добились в Servo, переносят в Gecko и симбиоз будет называться Quantum.

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

Вот, например, читани про Quantum CSS (aka Stylo): https://habrahabr.ru/post/336722/

А вот и одна из основных проблем, которую решает Rust:

В большинстве браузеров будет сложно реализовать это правильно. Параллелизм — это заведомо сложная задача, а CSS-движок достаточно сложный и сам по себе. Он также находится между двумя другими самыми сложными частями движка рендеринга — DOM и разметки. В общем, ошибку допустить легко, и распараллеливание может привести к достаточно трудноотловимым багам, под названием «гонки данных» (data races).

Если Вы принимаете правки от сотен тысяч контрибьюторов, как Вы можете применять параллелизм без страха? Для этого у нас есть Rust.

Так-то!

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

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

Облажались и решили как пиявки примазаться к готовому.

Вот, например, читани про Quantum CSS (aka Stylo): https://habrahabr.ru/post/336722/

Такие же сказки говорили и про servo, мол все работает идеально быстро, а по факту - тормознутее движка просто не бывает.

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

А вот и одна из основных проблем, которую решает Rust:
Так-то!

Rust может и решает, а servo нет. Тормозить, нагружая вся ядра CPU, - небольшая заслуга.

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

А вот и одна из основных проблем, которую решает Rust

очередная выдуманная растоманами проблема, которую сами героически решали всем сообществом - параллелизм) то что все решено до них, то что уже давно есть high-level api и абстракции для многопоточности - это для старперов, ага

это прям как замена сегфолтов на панику, или замена скорости выполнения на libbacktrace

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

Вангую, что со временем серво допилят. Присобачат к нему js-движок на расте и станет оно отдельным браузером, который заменит FF. Т.к. растаманы обожают pure rust проекты и на дух не переносят вкраплений Си/Си++ (и cargo, умеющий собирать только rust, тому потворствует)

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

станет оно отдельным браузером, который заменит FF.

отдельным станет, заменит - врядли, ну либо FF сначала повторит судьбу Netscape. у растаманов все замены невменяемые)

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

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

Если им к тому времени платить не перестанут, потому-что работы много, а толку мало.

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

Servo - это экспериментальный проект, никто его «доделывать» не собирается.

А так красиво начинали: Самсунг и Мозилла анонсируют новый супербезопасный браузерный движок на новом дупербезопасном языке для покорения новых горизонтов блаблабла. Развели просто Самсунг на бабки, и пилят их уже не первый год. На выходе парсер CSS...

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

Вообще да, но нет. Если есть сишные зависимости, можно всё это тоже приспособить через build.rs.

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

Вообще через build.rs можно что угодно собирать.

и паззлы на 1000 кусков можно? и автомобили лучше чем на Автовазе ?

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

И тебе по головке погладить, мой зеленый друг.

нене, я не из ваших, гладьте там друг друга сколько хотите, не надо лезть к нормальным людям

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

либо FF сначала повторит судьбу Netscape

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

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

Вот, например, читани про Quantum CSS (aka Stylo)

они запилили thread pool с workerами что ли? ну ни хера себе. вот это поворот. никогда такого нигде не было.

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

это прям как замена сегфолтов на панику

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

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

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

ну да, еще кулер процессора - потенциальная дыра, вот пруф: https://geektimes.ru/post/277724/

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

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

Ты считаешь что на один вектор проникновения меньше - это то же самое, что оставить как есть? Тебе не помочь.

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

Спасибо за озвучивание столь невероятного факта.

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

Ты считаешь что на один вектор проникновения меньше - это то же самое, что оставить как есть? Тебе не помочь.

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

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

Развели просто Самсунг на бабки

Подгнило что-то в Датском королевстве

hyper почти опочил. Какие-то проблемы с правами участников разработки релизить новые версии на гитхабе

Автор Zinc не совладал со сложностью языка и убил свое детище https://users.rust-lang.org/t/zinc-mini-post-mortem/7079

В reddit постоянные нападки на tokio из-за его чрезмернейшей сложности и непонятности

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

В reddit постоянные нападки на tokio из-за его чрезмернейшей сложности и непонятности

Это лоровские хейтеры наверно. Еще они клевешут, что на расте ни единого успешного проекта нет пока.

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

ни единого успешного проекта

Если не считать svgcleaner конечно же!

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

мда. Похоже что C/C++ останутся с нами еще надолго (по крайней мере до массового распространения квантовых ПК)

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

servo

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

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

это прям как замена сегфолтов на панику

Внутри своей памяти ты можешь творить любую ерунду и никаких сегфолтов не будет

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

Ничего больше не должен, но факт остается фактом

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

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

В reddit постоянные нападки на tokio из-за его чрезмернейшей сложности и непонятности

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

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

В reddit постоянные нападки на tokio из-за его чрезмернейшей сложности и непонятности

Там даже на ; жалуются. Так себе показатель.

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

Он больше не пришет, я подложил ему в еду яд! ;D

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

Там даже на ; жалуются. Так себе показатель.

Компилятор Rust настолько туп, что не может найти конец строки без ";"? И это в XXI то веке? Ужс.

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

Всё намного хуже. Он и вложенный блок без костылей вроде {} найти не может!

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

Тебе, деревне, нужно рассказать что такое expression-oriented programming language и что `;` делает из expression statement?

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

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

Говорю же, у всех уже век XXI и только растоманы всё ещё запрягают.

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

Чувак, ты отстал от жизни. Уже в конце 20го века был джаваскрипт, который и точки с запятой расставлял и переменные позволял не объявлять и даже поля в объектах. В 21м веке нужен наконец язык, который сам будет алгоритм реализовывать.

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

Ясно. Можешь не лечиться, только эвтаназия.

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

На самом деле Tokio простой как топор

На самом деле нет. И фреймворки второй волны (rocket, gotham) прямо об этом заявляют. Мол, в кишках мы используем токио, но он так непроходимо сложен, что вы о его наличии даже не заподозрите.

В результате имеем глубоко внутри один зоопарк (mio, futures, tokio-*, hyper), а снаружи - совершенно иные абстракции.

Из фреймворков должны торчать типы hyper, tokio-server, которе должны являться общим знаминателем для взаимодействия между разными библиотекамии и фреймворками. А по факту пока имеем разброд и шатание, как в Си, с его сотнями несовместимых друг с другом сетевыми либами

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

А по факту пока имеем разброд и шатание, как в Си, с его сотнями несовместимых друг с другом сетевыми либами

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

Куча конкурирующих либ? Пусть конкурируют. Кого в итоге полюбит общество больше прочих тот и заслуживает приз в виде интеграции в стандартную библиотеку. Но не раньше.

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

Куча конкурирующих либ? Пусть конкурируют. Кого в итоге полюбит общество больше прочих тот и заслуживает приз в виде интеграции в стандартную библиотеку. Но не раньше.

А потом появится новая, более лучшая либа, и что делать? Выпиливать предыдущего фаворита из stdlib?

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

А потом появится новая, более лучшая либа, и что делать? Выпиливать предыдущего фаворита из stdlib?

Если библиотека была фаворитом общественности еще до добавления в std, то в своей нише скорее всего она и останется таковой. Другая парадигма - другой разговор (например, если в std синхронная либа, а кто-то потом написал асинхронную).

Если лучше только внутренняя имплементация а не внешний интерфейс, то можно пропатчить std.

Главное, не начать с самого начала пихать в std всякое дерьмо, еще не зная, пройдет ли оно испытание общественности или нет.

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

Не надо вообще тащить ничего в stdlib. Популярные либы просто могут получать какой-нибудь особый статус и промоутиться на crates.io.

Хотя и это излишне. И без статусов с промоутингами все знают, что tokio — самая популярная либлиотека для асинхронщины

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

Куча конкурирующих либ? Пусть конкурируют

Э не. Это для обычных либ правдиво. А неблокирующая сетевая либа - вещь ключевая. Вокруг нее языки пишут (go, scala, erlang). Хорошие сетевые неблокирующие абстракции - язык живет. Плохие - нет языка

Сейчас есть низкоуровневая mio (lite аналог libuv) и все согласились, что это стандарт. Поверх нее пошли абстракции сомнительного качества - futures, tokio. И если тут начнутся форки и аналоги - язык загнется. Так как не будет прочного основания для построения серверных приложений. Банально http и websockets сервера от разных разработчиков в один eventloop не встроишь

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

Не все пишут вебсервера. Мне 300 лет не сдался сетевой фреймворв в std.

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

Это для обычных либ правдиво. А неблокирующая сетевая либа - вещь ключевая.

Вы что-то путаете. Ключевая вещь - это удобный гуй с датабиндингом и депенденси инджекшн. Сравните, сколько пишут высоконагруженных серверов, а сколько форм1.лабел1.

Хорошие сетевые неблокирующие абстракции - язык живет. Плохие - нет языка

Ну и чтоб не умирать вместе с плохими абстракциями логично не включать их в библиотеку. Можно такую штуку придумать, чтоб если нужна тебе библиотека модная молодёжная, просто пишешь её название и номер версии, а она сама берёт и скачивается, и можно использовать, как будто она уже в std либе. Вот бы кто такую вещь сделал, верно?

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

На их инструментах, они не смогут добиться(практически будет сложно) того же. У Mozilla это будет эффективнее на Rust.

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