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 также используются для создания дополнительных исполняемых файлов. Это позволяет удобнее разграничить код.

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

Еще недавно был релиз 1.19, а уже 1.20 выкатили. Молодцы, чо. Ржавчина пилится и развивается. Уверен, что именно этот язык заменит C и тем более C++ в будущем.

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

Еще недавно был релиз 1.19, а уже 1.20 выкатили. Молодцы, чо. Ржавчина пилится и развивается. Уверен, что именно этот язык заменит C и тем более C++ в будущем.

даешь срач еще до подтверждения!

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

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

Ржавчина решает все системные задачи. Для этого он и создавался. Это единственный язык, которые предложил безопасное управление памятью без GC. Возможно пока-что компитлятор ржавчины генерирует код с мелким оверхедом относительно Сишки, но это со временем исправят.

Для ынтырпрайза не нужен низкоуровневый язык с ручным управлением памяти. Поэтому там юзается Java, C#, Go, Python и прочие языки со сборщиком мусора.

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

но почему стабильность навязывается по умолчанию, а не наоборот?

A: Because stability is a good default. A programmer might call a sort function without checking in the documentation whether it is stable or unstable. It is very intuitive to assume stability, so having slice::sort perform unstable sorting might cause unpleasant surprises. See this story for an example.

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

It is very intuitive to assume stability

Очень спорное утверждение. Хочешь стабильную сортировку — вызови стабильную сортировку, а предлагать явно вызывать нестабильную, если стабильность не нужна (что, однако, не значит, что нужна нестабильность) — это уже шизофазия какая-то.

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

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

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

anonymous ()

Есть ли в стандартной либе Rust'a аналог джавовых потоков(streams)? Чтобы можно было городить что-то вроде

readLines().filter(...)
           .map(...)
           .take(n)
           .collect(...);
NegatiV ()
Ответ на: комментарий от 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 ()

Ассоциированные константы были предложены три года назад в RFC 195. И мы наконец смогли их реализовать!

Бгооо! растаманы смогли запилить аналог static.

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

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

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

bread ()