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)

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

Если не принимать специальных мер в программе, то да

Специальных это каких?

Впрочем вру, GC тут не при чём. Зависит от того перемещающий это менеджер памяти или нет.

Следовательно фрагментации можно избежать и без gc

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

Раст можно любить хотя бы за наличие таких тредов

мелкий ты, некоторые вот из-за любви к холиварным тредам яйца к брусчатке прибивают)

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

Мне бы было интересно узнать как это сделать без него (Без сарказма, действительно).

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

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

Следовательно фрагментации можно избежать и без gc

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

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

Фичи раста на самом деле реализуемы и в с++

Хоть одну фичу в расте в крестах реализовали? Без boilerplate? Как заставить авторов к примеру qt переписать код в этом стиле?

Безопасно работать с буферами можно и без раста. У меня вообще сегфолтился только qt пятый до 5.9 изза бага в нем

Взаимоисключающие параграфы. То что безопасно не падает из-за сегфолта и тем более не корёжит память по тихому

То что проектируется нормально не падает.

То что тестируется хомячками нормально не падает, же!

NextGenenration ★★
()

Ну почему они не сделают какой-нибудь официальный кроссплатформенный gui? Люди уже бы написали кучу gui-софта на rust. Все, что есть не официально - сегодня есть, а завтра нет. Вот Qt же делают. Почему мазиловцы не клепают модный, современный gui к своему браузеру? Или все сведется к html5?

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

расходов на двойное разыменование

Никаких аппаратных ускорений не предвидится?

и возможных задержек при копировании участков памяти

Как минимум в одном потоке это должно быть безопасно

clover к тебе тоже вопрос: вот есть куча софта написанного на крестах и си. Как в них борются с фрагментацией? Или просматривая особым образом сформированные папки можно уронить файловый менеджер?

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

А код, в котором нет ошибок, даже можно не тестировать.

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

Я же писал, для 64-х битных систем виртуальное адресное пространство порядка сотен терабайт. Если можно выделить непрерывный участок всего на 20 терабайт при доступных 100 и физической памяти в терабайт, то это не та проблема, которую стоит бросаться решать. На мелких системах, где ограничена как физическая, так и виртуальная память, память просто стараются лишний раз не выделять.

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

Да, было бы хорошо. Главное что бы не родился б-гопротивный уродец, проде электрона.

Deleted
()

А как думаете, сложный ли это язык для изучения:

1. Новичку вообще в мире программирования.

2. После какого-нибудь бейсика.

3. После других языков.

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

Это не я поставил глобальные статические функции и статические методы в один ряд. В C и C++ static на функциях уровня пространств имён имеет одинаковый эффект, просто в C++ есть и другое значение. В C++/Java/C# и подобном смысл очень даже близок, а речь в посте как раз о методах и полях.

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

2. После какого-нибудь бейсика.

Если готов к тому что часть вещей придётся делать по другому - не сложный

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

1. Да.
2. Да.
3. Смотря каких, но да(Лично знаю пришедших из Джжавы, Ноды и Питона, C, C++ испытавших боль при переходе. Мне зашло только с третьего раза.).

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

Вот Qt же делают.

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

Сложная это задача. А уж абстрагировать GUI от конкретных реализаций, сохранив при этом возможность без особых разрывов натягивать его на конкретные оконные системы, предоставляя native look&feel - это вообще на грани фантастики.

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

Лол в том, что твой браузер написан на c++

это как-то делает твой тезис верным?

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

Это понятно, но во всех нормальных языках функция sort гарантирует отсортированность

В java гарантирует стабильность. Жаба - нормальный язык?

Писать sort, если нужно отсортировать устойчиво, и sort_unstable, если требуется просто отсортировать — очень странно в любом случае.

Если требуется просто отсортировать - можно писать просто sort. Отсортирует. Кстати, вовсе необязательно что будет медленно, все эти тимсорты хорошо работают на частично отсортированных последовательностях, т.е. если к сортированному массиву добавили ещё немного или если конкатенировали несколько сортированных последовательностей (причём каждая последовательность может быть как в прямом, так и в обратном порядке) и запустили сортировку, просто сорт управится быстрее чем анстейбл.

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

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

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

pftBest ★★★★
()

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

Это скорость с GC и параллелизм без модели памяти? Про безопасность не в курсе.

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

Это скорость с GC и параллелизм без модели памяти?

Как уже надоели люди, которые не знают что в расте нет сборщика мусора и чуть ли не в каждой теме спрашивают про него

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

Я думаю нет, андроид еще не готов. Вот для десктопа уже есть хорошие либы типа piston, на которых довольно удобно всякие платформеры писать, и для 3d много чего есть, даже майнкрафт нарисовали.

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

Понятия не имею что там на андройдах, но раст можно скомпилировать хоть в asm.js, на пару с sdl2, например.

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

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

O02eg ★★★★★
()

Нет такого софта который ржавчики не начали переписывать на своём ржавом ... И Нет такого софта который они переписывать ___закончили___ ! :-D

мазилле годик-другой осталось жыть, а потом пойдут растеры Go учить :-)))))

Как то так!

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

Считается сложным, хотя кому как. В любом случае, раст далеко не самый простой язык.

quantum-troll ★★★★★
()

Это что же за фигня такая на десяточке:

Rust requires the Microsoft C++ build tools for Visual Studio 2013 or later

Раст не растом компиляется?

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

Раст не растом компиляется?

LLVM бекэнд никто не отменял.

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

Так а зачем тогда путать новичков? Если человек спрашивает можно ли писать игры, это не значит «возможно ли это сделать впринципе», а насколько удобно это делать. Так можно сказать что и на Коболе возможно писать игры под андроид, потому что у него есть биндинги для C. Только сначала поди напиши сам все обертки под апи системы, потом напиши свой движок, а там уже и игры будут.

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

по поводу фрагментации от сектантов комментарии будут?)

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

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

С такими заявлениями у меня возникают мысли «да пошло оно всё ***уй» и пойти в менее болезную область, например в дизайнеры.

Deleted
()
Ответ на: Rust и игорь от Deleted

Даже в стиме уже что-то зааппрувленное было.

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

С такими заявлениями у меня возникают мысли

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

Похоже эта профессия не для тебя

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

Для меня, просто ещё хз в какую облать пристроиться. Главное - не наступить в гуану вроде вёба или мобильности.

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