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)

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

Если уж стремиться к очевидности, то лучше уж let b = Int32(0);. Тем же самым grep-ом затем Int32 искать проще будет.

В реальном коде, скорее всего, такое явное указание типа и не потребуется (выведется из использования). Если же мы всё-таки решим сделать на это акцент, то как быть с возвращаемым значением из функции? let b = Int32(foo(0));?

А почему i32 грепать сложнее должно быть?

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

Ну... это всё-таки не библиотека. (:

А что, в Rust-е можно смотреть только на stdlib?

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

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

А почему i32 грепать сложнее должно быть?

Так ведь в литерале i32 будет только частью последовательности. Если грепать по \<i32\>, то литералы не будут в результат поиска попадать.

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

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

А ты смотрел вообще в какой теме ты сейчас находишься? И в контексте чего тут обсуждаются игровые движки и Rust? Я сомневаюсь, ибо если ты веришь что завтра хомяки с c# в юнити побегут писать на Rust игры или послезавтра если Rust «завезут» как альтернатива js даже в браузер - кто то на нем будет писать, то у меня для тебя плохие новости, Rust в этих нишах никому не нужен, он может только низкоуровевый слой в них занять (аля переписать v8 с C++ на Rust или переписать ядро Unity 3d с C++ на Rust)

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

на самом деле проблема в том, что вы хотите код в виде текста иметь. то есть ТОЛЬКО в виде текста. отсюда все проблемы и растут.

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

А что, в Rust-е можно смотреть только на stdlib?

Откуда такой вывод?

Просто одно дело писать библиотеку, которую предполагается другим людям использовать. Совсем другое - мелкую утилиту, которая решает необходимую тебе функцию.

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

то есть ТОЛЬКО в виде текста. отсюда все проблемы и растут.

Раскрой мысль.

Если что, я с удовольствием пользуюсь той же подсветкой синтаксиса в виде ИДЕ и аргумент про «писать код в блокноте» серьёзным не кажется. С другой стороны, читать код много где приходится.

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

То что я пишу пока что для себя, в формате прототипа и в стол вас волновать не должно.

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

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

Это да, паскалевский (алголовский) синтаксис намного читабельнее сишного.

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

завтра хомяки с c# в юнити побегут писать на Rust игры

Здесь очень тонкая грань, Нужно понять, что на ржавом разрабатывать приятнее и удобнее, чем на крестах. Может он чуть сложнее, чем шарп или джава, но он проще крестов. А профит как у крестов. Побегут может не все, но доля сторонников будет и не малая.

или послезавтра если Rust «завезут» как альтернатива js даже в браузер - кто то на нем будет писать

Ну не как альтернатива js, скорее как дополнение на васм-е делать на ржавом приятнее, чем крестах.

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

public func backup(self mutable ref, path mutable ref String) Result<_, Err>

Забавно, что ты сам предлагаешь использовать сокращение вместо полного function.

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

В общем, не хочу сказать, что синтаксис идеальный, но альтернативные варианты не особо лучше.

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

Смотрел. Я к тому что ты заврался о засилии плюсов везде. И раст никогда не планировался ни как альтеранатива C# или JS. Собсна на

низкоуровевый слой в них занять (аля переписать v8 с C++ на Rust или переписать ядро Unity 3d с C++ на Rust)

Он и планировался.

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

Собсна

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

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

Вы сами-то понимаете алогичность своего заявления?

Спойлер: rust на 32 года старше. Вам это ни о чём не говорит?

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

Доу. Но да. Как вы себе представляете идёю вытеснить всё легаси плюсов нажитое за 30+ лет с помощью раста, которому всего два года. Это тупо невозможно.

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

Так какой профит большим дядяам свой легаси переводить постепенно на Раст? быстрее работать не будет, жрать памяти меньше не будет, экономический смысл какой?

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

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

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

В том же юнити, если кому-то понадобится, то могут переписать движок на раст

так вот не перепишут, зачем им это? нужно было бы переписывать, давало бы это реальный профит - все бы уже побежали это делать

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

То-есть, появился официальный стандарт и гугл быстренько убрали PNaCL. Не вяжется как-то с твоим изначальным вбросом «Опять же вебу ненужен очередной IE6»

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

быстрее работать не будет, жрать памяти меньше не будет, экономический смысл какой?

Не будет падать. Меньше костылей и UB. Производительность и потребление памяти будет тем же.

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

Интересно сколько из этих процентов попадают в категорию «gcc vs llvm»

Не так много. eao197 ведёт себя как классический антипрививочник, вытягивая из текста только то, что угодно ему.

Во первых сравнение производилось не просто с референсом на C, а с сильно оптимизированным референсом, написанным с говнокодом со смесью goto и case, собранным с O3.

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

Ну и в третьих, сами-то они в этой статье остались довольны rust'ом. Похоже их вполне устроило небольшое падение скорости за большую надёжность.

The security and safety of Rust in a SECCOMP sandbox without the overhead of a garbage collector is a big win. It is worth the minor computational overhead of decompressing in a safe language with bounds checked arrays and determinism guarantees.

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

А у вас инсайдерская информация о том, что этого не делают?

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

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

Как по мне так правильнее подход из фортрана где write может делать и форматный и неформатированный вывод в любой юнит. А что подставлять вместо юнита это уже забота программиста. При желании оператор позволяет в строку (char) печатать с заданным форматом.

В Rust именно так. Макрос println печатает в stdout, а макрос writeln печатает в юнит.

Разве так сложно прежде чем что-то комментировать/критиковать хоть немного это изучить?

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

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

На самом деле, это тема для отдельного большого холивара. (:

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

Растовакансий стало внезапно много?

Ну и там где все прекрасно разбивается на объекты, никто в здравом уме не будет переводить на структурки и полное отсутствие нормального наследования и остальных радостей ООП. (это я про игровые движки и прочее околографическое). glibc как пример предлагать не стоит.

Ну и поржал на .unwrap_or_else() с лямбдой. И чего только люди не придумают чтобы не писать try{}catch{}

Q-Master
()
Ответ на: комментарий от Q-Master

И чего только люди не придумают чтобы не писать try{}catch{}

Почему try{}catch{} лучше?

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

Вы тут спорите такие.

А тем временем у меня пример рисования цветных точек в этом файле https://github.com/baist0/x11-rs/blob/master/x11/examples/xshm.rs

тяжела и неказиста...

А вы говорите про стабильность, про новые версии!

а это тут при чем? в 0.17 работало? или тебя обижает, что тут обсуждают стабильность, а не твои баги?

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

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

Напомню основной поинт ветки.

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

Человек просто говорит что на расте ничего не написанно, а фанбои агрятся.

Как по мне, похер сколько на расте написанно, и вообще напишут ли. Язык все равно крутой.

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

Ну и поржал на .unwrap_or_else() с лямбдой. И чего только люди не придумают чтобы не есть фекалии

fix that for you

А если серьезно, то у тебя ООП головного мозга. «Если есть только молоток, то все проблемы выглядят как гвозди»(с)

Aswed ★★★★★
()
Ответ на: комментарий от Q-Master

И чего только люди не придумают чтобы не писать try{}catch{}

Пока exceptions' side table мееедленно подтягивается из ОЗУ или, не дай ктулху, из свопа, можно сделать очень много unwrap_or_else.

Шучу.

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

Для планомерного внедрения языка и написания на нем чего-либо отличающегося от hello world нужны люди. Для ревью кода нужны лиды. Это все ДОЛЖНО сказываться на рынке и вакансий должно внезапно стать много. Вангую что команда разработки ядра юнити ну нифига не 2 человека и для переписывания этого всего на раст нужно будет раза в полтора больше людей просто за тем чтобы не продолбать сроки релиза.

Аргументов нет, переходим на личности?

Q-Master
()
Ответ на: комментарий от Aswed

Ну и поржал на .unwrap_or_else() с лямбдой. И чего только люди не придумают чтобы есть фекалии

fix that for you

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

Q-Master
()
Ответ на: комментарий от baist

ветка new_vers для посикса, а не мастер

Зачем тогда иметь мастер если там мусор

Ты попробуй сам. Там крашится.

Когда я собираю в дебаге и запускаю то получаю эту ошибку:

X Error of failed request:  BadValue (integer parameter out of range for operation)
  Major opcode of failed request:  1 (X_CreateWindow)
  Value in failed request:  0x48
  Serial number of failed request:  7
  Current serial number in output stream:  9
А когда собираю в релизе то эту ошибку:
X Error of failed request:  BadShmSeg (invalid shared segment parameter)
  Major opcode of failed request:  130 (MIT-SHM)
  Minor opcode of failed request:  3 (X_ShmPutImage)
  Segment id in failed request:  0xe21ee610
  Serial number of failed request:  21
  Current serial number in output stream:  22

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

Я просто оставлю это тут.

- Наш ресторан гарантирует вкусное питание.

- Позвольте! Я принес с собой стакан уксуса и вылил в ваш суп, и он получился совсем невкусным!

- Эммм....

gene1
() автор топика

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

Например, если в сигнатуре MyType, неявно принимать &MyType, Box<MyType>, Result(MyType) если там матч на вариант Ok а не Err,и так далее. На соответствующих трейтах дать возможность настроить #[implicit_deref], для подобного поведения.

Потому что повсеместные танцы с .to_owned, .into_inner(), .unwrap, итп, буквально через строку, начинают надоедать.

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

Не, так делать нельзя, например .to_owned для строк делает malloc + memcpy, а я не хотел бы неявных маллоков у себя в коде.

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

Ты попробуй сам. Там крашится.

Я нашел твою ошибку. Замени все `mem::uninitialized` на `mem::zeroed`. xlib читает эти атрибуты, а у тебя там мусор.

P.S. Еще не все, проблема с CreateWindow решилась, а ShmPutImage все еще ругается.

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