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)

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

Какой-то растяз прямо. Такие функции называются статическими.

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

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

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

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

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

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

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

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

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

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

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

и какой вывод ты отсюда делаешь?

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

Версии выходят, как горячие пирожки.

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

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

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

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

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

Ассоциативностью с экземпляром структуры? В чём тогда остаётся разница со статическими функциями?

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

Ни в чём. Я к тому что это синонимы в данном контексте и растоманы просто зашли с другой стороны, поэтому сеи функции там называются так, а не иначе.

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

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

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

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

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

Такие функции называются статическими

Статические функции из C, это не то же самое, что статические функции класса в С++, которые в свою очередь отличаются от статических функций в Java 8, которые можно использовать в интерфейсах, но нельзя использовать вне классов.

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

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

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

Я это понимаю, но они принципиально не отличаются, поэтому и называются одинаково. Не вижу причины вводить нестандартную терминологию.

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

С плохой стороны они зашли. Я подвис на этой фразе

От обычных функций эти отличаются лишь ассоциативностью.

задумавшись о приоритетах операторов и их ассоциативности.

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

C нормальной. Это мне просто логопед нужен, не могу выговорить «ассоциированностью» или вроде того :D

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

Если определить статическую функцию как функцию без параметра «this», «self» и т.п, не являющуюся свободной, то да.

Но в Rust ещё есть ассоциированные типы, ассоциированные константы, будут ассоциированные конструкторы типов. И статические функции. Выбивается из ряда.

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

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

Наверное, потому что изначально была только стабильная сортировка, а изменение поведения имеющихся функций может поломать кому-то что-то?

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

Разница в том, что у классов C++ «обычные» функции берут неявно «this», а «static» функции - нет. В расте иначе: у имплементации структуры «обычные» функции - обычные функции, а «динамичные» берут «self»/«&self»,«&mut self» явно.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Это, конечно, так, но когда функция sort даёт какую-то странную гарантию и к ней добавляют функцию sort_без_странной_гарантии, то выглядит это очень странно.

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

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

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

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

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

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

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

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

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

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

Как в нём с фрагментацией памяти? Пример (). Создаём 3 массива: 10, 10 и 20 байт. Через какое-то время освобождаем 1-й и 3-й. Повторяем многократно, чуть увеличивая размер массивов. Через какое-то время у нас свободно 75% памяти, но негде разместить 3-й массив.

Как Rust избегает подобных ситуаций?

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

Как Rust избегает подобных ситуаций?

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

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

это замена сегфолтов на панику и больше ничего

Не стесняйтесь, пишите как есть. «Замена сегфолтов и remote code execution vulnerabilities на панику».

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

когда функция sort даёт какую-то странную гарантию и к ней добавляют функцию sort_без_странной_гарантии, то выглядит это очень странно.

Без гарантии работает быстрее.

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

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

Поясни.

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

Не стесняйтесь, пишите как есть. «Замена сегфолтов и remote code execution vulnerabilities на панику».

по поводу фрагментации от сектантов комментарии будут?) или RCE - это все что умещается у тебя в стеке?)

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

Памятью занимается jemalloc, системный или самописный менеджер памяти. Перемещений занятых участков памяти в виртуальном адресном пространстве в них не предусмотрено, так как это вызовет инвалидацию указателей. Что тут ещё писать?

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

Фрагментация — не уязвимость, какое она отношение имеет к безопасности?

Ясен хрен, что без рантайма проблема фрагментации в общем случае не решаема.

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

Фрагментация — не уязвимость, какое она отношение имеет к безопасности?

о как) это уже новый подход) потенциальный вектор DoS атаки объявляем «не уязвимостью» и славим раст)

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

1.Heap compaction - штука хорошая, но таки не к вопросу о безопасности. Да и какой наркоман будет делать такую кучу на столько мелких объектов да при том специально в таком порядке? 2. В расте абузят RAII и стараются не выделать/освобождать в куче когда не надо. 3. Можешь, как и в Джавке, абузить пул, но для других целей. 4. Могу врать, особо не вникал, но вроде как jeamlloc имеет несколько пулов памяти, которые освобождаются вместе со смертью потока, за которым закреплён пул, что весьма неплохо. 5. Память не так проста, то что видят программы - виртуальное пространство. На уровне железа, если есть MMU, то это не такая уж и беда, т.к. несколько нестоящих рядом страниц могут быть объеденины в один блок, что в общем то не поможет для твоего синтетического примера, но сработает для объектов пожирнее.

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