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)

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

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

Что там с сахарком для делегации? По прежнему вручную переписывать все методы или юзать сторонний и непонятный макрос от Васяна и Ко?

foror ★★★★★
()

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

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

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

Slackware_user ★★★★★
()

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

я думал, что мы живем в эпоху неограниченной памяти

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

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

https://en.wiktionary.org/wiki/toolkit

toolkit: set of basic components for developing software

Это вопрос по инфраструктуре rust? Я бы тут поискал: https://crates.io/

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

https://crates.io/search?q=opengl

Displaying 1-10 of 61 total results

nezamudich ★★
()

В треде про канпеляцию ядра ещё не всё обсудили, а на главной новый вброс :\

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

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

opengl есть

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

libc FFI

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

Если ты про IDE, то я, например, в саблайме на нем пишу.

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

я думал, что мы живем в эпоху неограниченной памяти

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

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

Когда Rust убьет C++?

Только после того, как это сделает Java. А потом C#. А потом D. Так что в очередь, пожалуйста! :)

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

Да как бы уже. Зачем использовать C++, если есть Rust?

ну я вот сейчас присматриваюсь к разработке кросс платформенных плагинов в форматах vst / AU / AAX, есть такой замечательный фреймворк JUCE который умеет во все платформы и типы плагинов одним кодом, аналогов на Rust не увидел, писать свой велосипед 10 лет не хочется (цели другие), поэтому придется брать C++

кроме того у штейнберга сдк только на плюсах..

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

Да как бы уже. Зачем использовать C++, если есть Rust?

Затем, что rust выглядит как поделка на коленке. Совершенно не интуитивные реализации, сокращения и наименования рано или поздно похоронят его как и перл. Хайп пройдет, раст умрёт.

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

В треде про канпеляцию ядра ещё не всё обсудили, а на главной новый вброс

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

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

ну я вот сейчас присматриваюсь к разработке кросс платформенных плагинов в форматах vst / AU / AAX, есть такой замечательный фреймворк JUCE который умеет во все платформы и типы плагинов одним кодом, аналогов на Rust не увидел, писать свой велосипед 10 лет не хочется (цели другие), поэтому придется брать C++

кроме того у штейнберга сдк только на плюсах..

Ну вот это «придётся» и характеризует C++. Если я под какой-нибудь Google App Engine хочу писать код, мне тоже придётся на Java или другом поддерживаемом языке. А если нет ограничения на «придётся» — C++ не нужен. И со временем будет всё более не нужен.

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

А если нет ограничения на «придётся» — C++ не нужен

только чаще всего они есть и нет выбора, так бы я скорее всего бы захотел Rust, но тут шашечки или ехать, ибо на Rust мне еще 10 лет «приседать» нужно будет что бы получить схожую функциональность, а делать то продукт хочется, а не инструменты

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

Затем, что rust выглядит как поделка на коленке.

Как поделка на коленке выглядит Microsoft Visual Studio. А Rust выглядит на редкость качественно. Пожалуй один из самых качественных проектов, которые я видел.

Совершенно не интуитивные реализации, сокращения и наименования рано или поздно похоронят его как и перл. Хайп пройдет, раст умрёт.

Дай бог каждому языку пожить, как Perl. Но я с тобой не согласен, там всё вполне интуитивно. Да и не нужно это для популярности. Вон вспомни JavaScript: parseInt парсит строку в число в неопределённой системе счисления, т.е. parseInt("011") может выдавать как 9, так и 11 в зависимости от разных браузеров, это ли не лютый ппц, однако люди пишут.

Rust умрёт, если мозилла его выкинет, это да. По крайней мере пока он не оброс жирком, альтернативными реализациями, независимыми комитетами. Но пока вроде планов таких нет и всё вполне себе цветёт и развивается.

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

Ну так себе фреймворк если сишный интерфейс не предусмотрели. Типа все должны писать на плюсах и только на плюсах. Дух qt

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

в этой индустрии все написано на плюсах

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

только чаще всего они есть и нет выбора

Смотря какие задачи. Достаточно часто выбор есть.

так бы я скорее всего бы захотел Rust, но тут шашечки или ехать, ибо на Rust мне еще 10 лет «приседать» нужно будет что бы получить схожую функциональность, а делать то продукт хочется, а не инструменты

Если что, у Rust нормальный интероп с C, так что возможно приседать надо не 10 лет.

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

надо будет приседать вокруг штейнберга вначале и интеропится с его с++, потом все это поддерживать в рабочем состоянии (сдк то меняется), потом писать реализации для au и aax, ладно это не 10 лет, а пару лет точно, пару лет работы «в стол» которая никому не нужна, я бы это время потратил лучше на написание самих плагинов, ибо они нужны всем

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

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

umren ★★★★★
()

Кто такой Штейнберг?

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

альтернативными реализациями

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

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

Нет никаких претензий, чего ты выдумываешь? область применения просто пока еще никакая у языка, посмотрим что будет через n лет

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

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

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

область применения просто пока еще никакая у языка

Область применения вполне конкретная.

ибо ядро линукса пишут на си, игрульки все на плюсах...

А на чём их ещё писать? На rust, которого не было?

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

Я не ванга.

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

Rust выглядит на редкость качественно.

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

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

Область применения вполне конкретная

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

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

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

Давай уже конкретику, что ты ходишь вокруг да около.

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

В сравнении с C++, никаких странных сокращений там нет.

Я не спорю, я утверждаю. Куда не плюнь одни дурацкие сокращения и анахронизмы.

fn is_divisible_by(lhs: u32, rhs: u32) -> bool {
println(«Hello world»);
return false;
}

fn? Зачем? Что, компилятор настолько тупой, что ему понадобились эти два символа? Без этого никак? Мало того что совершенно бесмысленное сокращение слов ради невнятной экономии, так ещё и не шибко нужные дополнительные ключевые слова.
Зачем две точки в параметрах? Вот какую практическую цель они несут? Почему другие языки без них обходятся? Зачем добавлять ненужные сущности?
Зачем этот -> перед bool? От этого стало понятнее, что параметры закончились? Просто так добавили? Когда появляются такие бесмысленные добавления это первый признак, что поделка - говно.
Зачем bool там вообще писать? Во первых по телу функции компилятор и так может определить возвращаемый тип, а во вторых зачем тогда fn. Либо указывать тип, либо fn. Вместе они нафиг не нужны.

println - кто блин кого, что и куда печатает? В 2017-м году? Серьезно? Дань чему это бесмысленная «печать» не пойми чего и куда? У меня перед глазами сразу матричный принтер возникает. Никакой связи с консолью. Я бы руки отрубил создателям за столь дебильное наименование функций.

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

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

Зачем пихать? Судя по уровню экспертизы, этому чудному мальчику пора на тихий час.

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

Щас тебе напихают)

А причем тут пихание или нет. Я с интересом смотрю на новые языки, но то что я вижу в этом языке меня лишь отталкивает. Увы, не моё. Ради интереса зашел на team.html - одни школьники, что и требовалось доказать.

d9d9 ★★★★
()

В самом языке улучшено ключевое слово pub. По умолчанию, в Rust объекты приватны

А я думал ооп завезли...

В Rust 1.18 обе структуры занимают в памяти размер в четыре байта.

Наконец-то.

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

Совершенно не похожие на C реализации, сокращения и наименования рано или поздно похоронят его

Немного прояснил смысл твоей фразы. Не благодари.

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

println - кто блин кого, что и куда печатает? В 2017-м году? Серьезно? Дань чему это бесмысленная «печать» не пойми чего и куда? У меня перед глазами сразу матричный принтер возникает. Никакой связи с консолью.

Предпочитаете java подход - всё есть объект?

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

Я с интересом смотрю на новые языки

Позволь поинтересоваться, а какие языки из отсмотренных тебе нравятся?

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

Предпочитаете java подход - всё есть объект?

Работа с любым устройством, в том числе консолью, не должна быть частью языка вообще. Это забота библиотек, стандартных или нет - не важно. Нужно вывести на устройство консоль, подключил соответствующий код. Никаких глобальных невнятных функций. А объект это или нет, не важно. Это может быть и в функциональном стиле, что-то типа: using std:console; console_write(«hello world»);

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

Вот нафиг делать умный вид когда не в теме, что writeln! — макрос, который дергает стандартную библиотеку? Хоть бы Книгу бы осилил для наччала, перед разведение «оналитеги»

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