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)
Ответ на: комментарий от pftBest

Я сторонник честности по отношению к пользователям поделий.

Если ломаешь совместимость после 1.0.0 - будь добр сделай мажорный релиз.

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

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

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

б) беда с тестовой инфраструктурой,

в) им просто лень заморачиваться,

г) присутствует комбинация двух или более предыдущих пунктов.

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

2017 год, у всех давно цветные мониторы и подсветка синтаксиса.

Ни одна схема подсветки из известных мне это убожество распарсить не поможет.

Esper
()

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

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

А я вам посоветую больше не пить

Даже воду?

а в хипстора превращаетесь

Бабульки на лавочке боятся не существующих террористов. Угадай кого боятся дедульки.

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

Ни одна схема подсветки из известных мне это убожество распарсить не поможет.

Специально для лиспа есть подсветка позволяющая быстро находить парные скобки.

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

Due to the struct field optimisation, using transmute on structs that have no repr attribute or #[repr(Rust)] will no longer work.

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

эти люди рассказывают про undefined behavior в других языках!

Это же ансейф, ему можно.

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

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

Here is another parser, written without using nom's macros this time: ... take4(i:&[u8])...
This function takes a byte array as input, and tries to consume 4 bytes. With macros, you would write it like this: named!(take4, take!(4));

Ну, как-бы они говорят и там дальше, что это без использование комбинаторов и дальше приводят пример с использованием макросов nom'а как элегантного решения. Или я чего-то не понимаю.

А что, в реактивном программировании не возникает задачи синхронизации потоков?

Не понимаю что понимается под этим, но вроде не возникает.

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

Как поделка на коленке выглядит Microsoft Visual Studio

Орнул в голосину

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

и дальше приводят пример с использованием макросов

Разве можно всё приложени написать исключительно с помощью макросов?

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

В смысле макросов nom'а, мол смотрите какая у нас хорошая библиотека на комбинаторах.

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

какая у нас хорошая библиотека на комбинаторах.

Пожалуй всё нужно использовать без злоупотребления. То что годится для библиотеки подойдёт ли для целого приложения?

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

Тут привели пример того что я имел ввиду Rust 1.18 (комментарий)

Go ужасный язык, да.

Паскаль просто шикарный ЯП

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

Конечно удобно. Мешает писать функции в 2000 строк. Но к теме это не относится, разговор шёл о двоеточиях.

Что не понятного в такой записи

int a

Да вообще ничего не понятно. Два каких-то слова.

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

Вот именно, что программа сольётся в огроменный ком.

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

Специально для лиспа есть подсветка позволяющая быстро находить парные скобки.

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

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

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

В Rust-е вообще почти все решения в стиле краткости. std, а не standard. Да и в юниксе по большому счёту так же, mkdir, а не make_directory, например. Уж не знаю, как лучше, но этот подход используется многими, значит смысл имеет.

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

А почему бы и нет? В каком приложении были бы особые трудности в реализации с использованием комбинаторов?

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

Go ужасный язык, да.

Разве это решение не прекрасно?

Конечно удобно. Мешает писать функции в 2000 строк

Вот когда я напишу функцию в 2000 строк, тогда и поговорим.

Да вообще ничего не понятно. Два каких-то слова.

В случае си подобного объявление - первое слово это тип, а второе это имя переменной.

Вот именно, что программа сольётся в огроменный ком.

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

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

В паскале надо лезть куда-то вверх, объявив переменную, и только потом возвращаться в код ниже, где её можно использовать. Очень удобно же(сарказм)

Конечно удобно.

Спасибо, посмеялся.

Мешает писать функции в 2000 строк.

Спасибо, взоржал.

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

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

Тебе нужно читать код записанный в одну строчку? Давайте пожалеем бедного человека. В go вообще утилиту создали, чтоб код форматировала.

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

Да вообще один символ. Прекрасно будет и эстетично. m -f 3 -l 4 -p «val» --blabla

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

Нет, из крана у меня водка не течёт.

Так вот, нельзя пить то что течёт из крана? Даже прокипятив?

Не знаю, где ты такие краны видел.

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

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

что там с браузером на расте? он уже отучился зависать?

Там виснет в основном GUI на джаваскрипте.

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

Вы всё еще обсуждаете программирование? Краны, вентили, процессы? Это связанно с потоками?

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

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

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

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

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

Тебе нужно читать код записанный в одну строчку?

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

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

что там с браузером на расте? он уже отучился зависать?

Зачем чинить тестовый полигон?

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

Если это выражение короче 100 символов

А его точно нельзя сократить? А то аргументы противников вывода типов - «не понято что записано»

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

Там виснет в основном GUI на джаваскрипте.

JS, который там С++, по сути единственное, что нормально и полноценно работает. Все остальное тормознутое, кривое и недоделанное.

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

Разве это решение не прекрасно?

Мне не нравится.

Вот когда я напишу функцию в 2000 строк, тогда и поговорим.

Не так. Вот когда ты поисправляешь баги в функции в 2000 строк, вот тогда и поговорим.

В случае си подобного объявление - первое слово это тип, а второе это имя переменной.

return a — пример, когда это не так. x y() ещё один пример.

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

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

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

а к каким тулкитам есть биндинг у этого чуда?

http://gtk-rs.org/

https://rust-qt.github.io/rustdoc/qt/qt_gui/

https://github.com/kenz-gelsoft/wxRust

https://github.com/servo/cocoa-rs

https://retep998.github.io/doc/winapi/

Это что нашлось за пару минут.

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

Rust совместим с C, так что берётся и привязывается: https://blog.rust-lang.org/2015/04/24/Rust-Once-Run-Everywhere.html Он даже умеет автоматически генерировать простые байндинги: https://github.com/servo/rust-bindgen

ну и да, опенгл есть?

https://crates.io/crates/glium, например, но лучше https://github.com/tomaka/vulkano :)

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

Между func и fn я бы лично предпочел сокращение func. А fn уж очень легко пропустить в тексте. Особенно, когда народ не стесняется писать функции на 3-4-5 экранов.

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

На пятилетнем atom с 4 гигами вообще работать невозможно. Хром более-менее шевелится, например

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

Это уже систему типизации надо винить, исправлять и добавлять нужное. Например, есть такая вещь как линейные зависимые типы позволяющие указать сколько памяти той же использует программа. Или там тот же Idris (или там Coq, Agda, но Idris, ИМХО, самый практичный для промышленного использования) имеет правила и эвристики для того же, что рекурсия хотя бы завершиться. Конечно, проблему останова не решает, но в реальном мире вроде как и работает.

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

Почему при таком количество биндингов к различным графическим библиотекам раст для своего можно сказать, самого главного проекта Servo выбрал какую-то невзрачную графическую библиотеку на джаваскрипте? Ведь она дает существенное ощущение тормозов.

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

Мне не нравится.

Чем?

Не так. Вот когда ты поисправляешь баги в функции в 2000 строк, вот тогда и поговорим.

Я не пишу код на 2000 строк. Мне лень в функции из-за 5 строк туда-сюда лазить. А те кому не лень, их это не остановит.

return a — пример, когда это не так. x y() ещё один пример

Ты хочешь код регулярками парсить?

Параграфы тоже в главы разносят и отбивают красной строкой.

Абзац слишком большая единица для одной мысли.

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

Ты хочешь код регулярками парсить?

Во-истину хорошо сказано. Синтаксис надо максимально упростить и сделать однородным.

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