LINUX.ORG.RU

Rust 1.18

 


1

10

Команда Rust анонсирует релиз 1.18.

Обновление предыдущей версии легко:

$ rustup update stable

Сам rustup можно установить здесь.

Основные изменения

Одно из главных изменений - новая версия «The Rust Programming Language», официального учебника по Rust. Он пишется открыто на Github, и имеет более ста авторов. В этом релизе включен черновик второй версии книги, имеющий 19 из 20 глав; двадцатая глава будет готова к релизу 1.19. Купить бумажную версию можно через No Starch Press. Новая версия книги полностью переписана и учитывает последние два года нашего опыта обучения Rust. Вы найдете новые объяснения основных принципов Rust, новые проекты и прочее.

В самом языке улучшено ключевое слово pub. По умолчанию, в Rust объекты приватны; можно использовать pub чтобы сделать их публичными. В Rust 1.18, pub имеет новый вариант:

pub(crate) bar;

Слово в скобках - ограничение, контролирующее степень публичности объекта. Если указанно pub(crate), то bar будет публичным для всего крейта (пакета), но не вне него. Это позволяет декларировать интерфейсы, «внутренне публичные» для пакета, но не доступные для внешних пользователей.

Также можно указать путь, например:

pub(in a::b::c) foo;

Это значит «доступно в иерархии a::b::c, но не в прочих местах».

Для пользователей Windows Rust 1.18 имеет новый атрибут, #![windows_subsystem]. Он работает так:

#![windows_subsystem(console)]
#![windows_subsystem(windows)]

Он контролирует флаг /SUBSYSTEM в компоновщике. На текущий момент доступны только console и windows. Если вы разрабатываете графическое приложение, и не указываете windows, в момент пуска программы всплывет окно консоли. С атрибутом windows этого не произойдет.

Далее, в Rust кортежи, варианты перечисляемых типов и структуры (без атрибута #[repr]) всегда имели неопределенное расположение в памяти. Мы включили автоматическое упорядочивание, которое может привести к уменьшению потребления памяти путем уменьшения необходимого выравнивания. Например:

struct Suboptimal(u8, u16, u8);

В прежних версиях Rust на платформе x86_64 эта структура имела бы размер в шесть байтов. Но согласно исходному коду, ей достаточно должно быть четырех. Остальные два байта - результат выравнивания. Поскольку мы имеем u16, он требует двух байтов. Но в данном случае, он был смещен на один байт из-за предыдущего u8. Для последнего же u8 требуется еще один байт выравнивая. В итоге, мы имеем 1 + 1 (пусто) + 2 + 1 + 1 (пусто) = 6 байтов.

Но что если структура выглядит так?

struct Optimal(u8, u8, u16);

Эта структура оптимально выравнена; u16 находится на рубеже двух байтов, как и остальная структура. Выравнивание не требуется. Это дает нам 1 + 1 + 2 = 4 байта.

При дизайне Rust мы оставили физическое расположение данных в памяти неопределенным как-раз по этой причине; любой safe-код (не следующий по «сырым» указателям) не будет затронут подобной оптимизацией. Благодаря этому, мы можем научить компилятор оптимизировать Suboptimal в Optimal автоматически. В Rust 1.18 обе структуры занимают в памяти размер в четыре байта.

Мы долго планировали это изменение; оно было и ранее в нестабильной версии Rust, но некоторые программисты писали unsafe-код, который предполагал определенное расположение данных в памяти. Если вам необходима гарантия, что физическое расположение в памяти в точности совпадает с расположением вариантов в исходном коде (например, при обращению к оболочкам Cи-кода), пометьте вашу структуру с атрибутом #[repr(C)].

Напоследок, улучшено время компиляции; например, компиляция самого rustc теперь на 15%-20% быстрее.

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

  • Child::try_wait, неблокирующая форма Child::wait.
  • HashMap::retain и HashSet::retain - версия существующего retain от Vec<T> теперь и у этих двух структур.
  • PeekMut::pop позволяет взять ранее прочитанный верхний элемент от BinaryHeap<T> без необходимости повторно упорядочивать кучу.
  • TcpStream::peek, UdpSocket::peek, UdpSocket::peek_from позволяют прочесть крайний элемент у потока или сокета.

Новый функционал Cargo

Cargo добавил поддержку системы управления версиями Pijul, который написан на Rust:

cargo new my-awesome-project --vcs=pijul

У Cargo несколько новых флагов, дополняющих --all: --bins, --examples, --tests и --benches позволяют собрать все программы указанных типов.

И наконец, Cargo теперь поддерживает Haiku и Android.

Подробнее об изменениях написано здесь.

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



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

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

Втопку ржавчину, на хаскле и то проще кодить.

А при чём тут хаскель? Rust это язык, максимально приближенный к железу с абстракциями нулевой стоимости. Хаскель это язык очень высокого уровня с GC. Если можешь себе позволить писать на хаскеле — конечно так и надо делать.

А вообще тупиковая ветвь развития ЯП. Что-то вроде pvs studio - более верный подход к надежности кодинга.

Вряд ли. PVS Studio это попытка лечения симптомов. Нужно, конечно, но лучше лечить причину.

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

Если только окропить святой водой.

Теперь пошли в ход ритуалы?

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

Эм, а не лучше по поводу упорядочивания u8, u16, u8 как в примере сообщить программиста? Мол так и так-то, вы сможете экономить память, если поменяете расположение вот так-то и так-то. А то как-то пугает такое решение вида темных операций. Хотя сейчас и компилятор не знает об организации процессора много да и вообще. Всё усложнено.

Угу, может ещё сообщать — если вы ручками размотаете цикл, ваш код будет работать быстрей :) Цель компилятора — генерировать оптимальный для процессора код. Цель программиста — в первую очередь писать оптимальный для чтения другими программистами код. Порядок полей это тоже информация, например они могут быть сгруппированы по смысловому назначению и если их мешать так, как хочется компилятору, то читаемость кода пострадает и главное — непонятно для чего.

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

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

А я думаю, что люди, которым «multiply» нравится больше, чем «*», неадекватны.

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

А при чём тут переделка языка? В C++ переопределение операторов это часть языка. Как и практически во всех остальных языках, кстати.

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

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

А потом приодит такой бесполезноботан и задаёт вопросы типа

воробей может съесть горсточку зерна а лошадь не может почему

Хорошая статья про то как программисты хлеб пекли. Рекомендую почитать.

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

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

Звёздочка много чего означает. То же самое разыменовывание. Из=за этого и проблемы.

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

Ну, так это структура данных всё-таки.

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

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

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

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

Сторонникам подхода «взять и отрезать» не нужна причина. Им нужен повод.

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

А если это компилятор с голосовых сообщений в LLVM IR

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

Как например разработчики LLVM

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

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

С другой стороны, это может говорить о/об:

а) том, что в коде чёрт ногу сломит

два компилятора этому ясновидцу!

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

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

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

в Rust-е ключевое слово fn выбрали потому, что одному из разработчиков не нравилось набирать function в JavaScript-е.

Не совсем так :)
С тем же успехом можно сказать что auto ввели потому что Страуструп так захотел.
fn решили использовать потому что это идею поддержало большинство.

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

С тем же успехом можно сказать что auto ввели потому что Страуструп так захотел.

Вообще-то auto досталось в наследство от C.

По поводу fn и function — это байка из вот этого доклада: https://www.youtube.com/watch?v=lO1z-7cuRYI

eao197 ★★★★★
()

В сравнении с грамотно используемым современным С++ раст не даёт никаких преимуществ. Разве что кому-то возня с ошибками mutable borrow доставляет больше возни с ошибками шаблонов. В нагрузку имеем ещё и ужасный синтаксис с непомерным сокращением ключевых слов.

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

А потом приодит такой бесполезноботан

Ну, сама-то по себе «гибкость мышления» — это инструмент такой. А уж применять его можно по-разному. У некоторых, действительно, выходит что-то типа «а вот смотрите как я ещё загнуть [мышление] могу».

Хорошая статья про то как программисты хлеб пекли

Читал я её когда-то. И как же ты думаешь, у кого из двоих там мышление более косное?

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

каша типа '<T<Box<T<Box'a'b'c>>::d();

Такую кашу на любом современном ЯП можно сделать, если разраб ленивая скотинка и не подумал о декомпозиции подобной каши. Либо это говорит о неопытности разраба.

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

ибо ядро линукса пишут на си

Ядро redox пишут на расте, когда начинали писать ядро линукса раста не было

игрульки все на плюсах

Есть уже и на расте, например под андроид, на реддите проскакивал отзыв геймдевела

звук на плюсах

Не в курсах

большой софт под всякие оси на плюсах

Новый софт пилят на JS и вообще облака белокрылые лошадки, а старый так тогда раста не было

браузеры на плюсах

см. Servo

серверы сейчас пишут на чем угодно и раст там сомнителен

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

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

Есть Futures (https://aturon.github.io/blog/2016/08/11/futures/), но там пока нужно руками писать .and_then(|| code) и так далее.

Сейчас активно разрабатывается поддержка yield/генераторов, и поверх них есть экспериментальный синтаксис async/await для futures: https://github.com/alexcrichton/futures-await

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

пивас в ведре ловил баги которые вполне можно городить и на расте.

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

Ядро redox пишут на расте

;)) redox это студенческий проект

Есть уже и на расте, например под андроид, на реддите проскакивал отзыв геймдевела

1 игра? кул стори, а вся индустрия на плюсах

Не в курсах

вот так вот

Новый софт пилят на JS и вообще облака белокрылые лошадки, а старый так тогда раста не было

это какой софт пишут на js? браузеры на жс, фотошопы на жс и прочее? это скорее будет в webassemby, где уже плюсы успешно и хорошо копилятся

см. Servo

посмотрел, кто то этим серьезно пользуется? все так плохо?

Отнюдь, если бы сделали наследование или его подобие очень многим серверным ЯП пришлось бы несладко.

Ээ че? да никто на нем бекенд массово писать не будет

Кроме того на расте можно много чего под серверсайд на гитхабе найти, в том числе какие-то БД уже пилят.

ну там куча «хелло ворлд» веб фреймворков у которых 0 инсталляций по миру - такая себе тудушка да, а что за базы?

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

Вот пример, как Rust в Dropbox-е используется

эту ссылку кидали уже сто раз, в одной дырке они там заюзали раст да, по приколу, больше он нигде у них не используется и навряд ли будет ;)

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

Брейнфак отдыхает fn closed<F: Fn(&Rc<RefCell<S2>>) + 'static >(f: &F)

Это нормально пишется как

type SRef = Rc<RefCell<S2>>;
fn closed<F>(f: F) where F: Fn(&Sref) + 'static {
   // code
}
anonymous
()
Ответ на: комментарий от dave

.and_then - это монадическая связка (>>=), получается?

Да, именно. А async-await/генераторы/yield — это как do notation.

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

Читал я её когда-то. И как же ты думаешь, у кого из двоих там мышление более косное?

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

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

1 игра? кул стори, а вся индустрия на плюсах

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

NextGenenration ★★
()

Почему, когда выходит новость о новой версии какого-либо языка, на ЛОРе начинается джихад в комментариях га n>5 страниц?

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

Ну, сама-то по себе «гибкость мышления» — это инструмент такой. А уж применять его можно по-разному. У некоторых, действительно, выходит что-то типа «а вот смотрите как я ещё загнуть [мышление] могу».

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

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

Почему, когда выходит новость о новой версии какого-либо языка, на ЛОРе начинается джихад в комментариях га n>5 страниц?

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

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

;)) redox это студенческий проект

Уверен? Значит история повторяется.

1 игра? кул стори

С чего решил, что она одна? Я говорю о человеке поделившийся опытом разработки на ржавом под андроид.

вся индустрия на плюсах

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

это какой софт пишут на js?

Atom, Eclipse Che, Visual Studio, Google Docs, PgAdmin, Thunderbird и еще куча софта, лень вспоминать и перечислять.

браузеры на жс, фотошопы на жс и прочее?

Это легаси, когда начинали кроме плюсов ничего не было.

посмотрел, кто то этим серьезно пользуется?

Если пользуешься Firefox, то некоторыми частями из Servo ты уже пользуешься, в будущем большая часть лисы будет на ржавом.

все так плохо?

Нет. К концу года обещают юзабельный Google Docs или ты думал современный браузерный движок за один год делается?

да никто на нем бекенд массово писать не будет

Массово может и нет, но надежные и шустрые бекенды на нём писать вполне будут те кому это нужно.

а что за базы?

https://github.com/search?o=desc&q=database language:rust&s=stars&amp...

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

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

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

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

Массово может и нет, но надежные и шустрые бекенды на нём писать вполне будут те кому это нужно

Пока не будет возможности писать код линейно, в духе Go или Scala, единственные бэкенды на которые годится Rust - это технология CGI. Или «поток на соединение», что не далеко ушло от CGI.

Городить лапшу из futures себе дороже

makoven ★★★★★
()
Последнее исправление: makoven (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.