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 addr = try!(parse());

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

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

Только такой вариант не будет работать.

<'a> - определение, &'a - использование

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

После апострофа что-то кроме лайфтайма может быть? Если нет то и так понятно что a - это lifetime.

Или наоборот, если объявляем что a - это лайфтайм, то зачем апостроф? Это как если бы в плюсах везде писали typename перед параметром шаблона.

Намного проще читается? Я сомневаюсь.

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

&a str longest<a>(&a str x , &a str y)  {

Без апострофов меньше шума.

typedef bool Fn() predicate;

bool stuff(predicate a_predicate)

Если писать справа, то шума больше - нужно двоеточие.

typedef Fn() bool  predicate;

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

Есть реализация предложения по stackless короутинам в Visual C++ (по-моему, она доступна начиная с Visual Studio 2015 up3, в Visual Studio 2017 есть сразу). С новыми ключевыми словами co_yield, co_await, co_return: https://blogs.msdn.microsoft.com/vcblog/2017/02/02/using-ibuv-with-c-resumabl...

Вроде как аналог собираются сделать в clang-е. Насколько их реализация будет соответствовать MS-ной — не знаю, не слежу.

Говорят, что с высокой долей вероятности эти stackless короутины войдут в C++20. В C++17 их не успели впихнуть.

На счет того, когда и в каком виде в стандарте будут stackfull короутины, не знаю, не моя тема, не слежу. На C++ CoreHard Spring 2017 в мае слышал, что прогнозы неутешительные. Так что stackfull короутины пока только на уровне сторонних библиотек.

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

Двоеточие позволяет чётко разделить имя переменной и её тип. Но это вкусовщина.

Ну и костыль, в виде сишного typedef, тут не нужен.

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

Ну и костыль, в виде сишного typedef, тут не нужен.

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

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

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

А можете пример найти?

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

А чем отличается двоеточие от ключевого слова as?

двоеточие - объявление типа; as - это приведение к типу

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

as используется для coersion. Двоеточие - тоже.

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

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

Так это rfc только. В языке этого ещё нет, как я понимаю.

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

если rfc начинается на 0000 значит у него нету официального номера, то есть его еще не приняли. И может никогда не примут.

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

Читая RFC надо помнить что:

- не все rfc приняты

- из них не все реализованы в компиляторе

- из тех что реализованы не все стабильны

Некоторые фичи получились так плохи что их никогда не стабилизируют, хоть для них принят RFC, и готова реализация.

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

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

Хотя местами, думаю, перегибы. Например, необходимость установки крейта rand для генератора случайных чисел. Это как же так возможно «ошибиться» в имплементации rand, чтоб бояться включать его в стандартную библиотеку?

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

необходимость установки крейта rand для генератора случайных чисел.

Что в этом плохого, кроме того что «непривычно»?

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

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

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

Читаю вот книгу «The Rust Programming Language», 2nd ed. Дошел до главы 10, и пока как для человека с опытом с C++, Haskell и некоторым знанием Smalltalk, в Rust все выглядит логично, понятно и очень знакомо

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

с опытом с C++, Haskell

Rust как раз и пытается быть помесью C, C++, Haskell и OCaml.

Низкоуровневый, с функциональщиной и ML синтаксисом.

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

У меня нехороший вопрос есть, не связанный с вашей дискуссией.

А можно на сайте cargo размещать свои пакеты под собственнической лицензией, которую условно назовем Academic Public License, где исходники будут открытыми в буквальном смысле, но под моими лицензионными ограничениями?

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

Этот вопрос лучше задать в /r/rust или https://users.rust-lang.org/

Из доки: http://doc.crates.io/manifest.html

If a project is using a nonstandard license, then this key may be specified in lieu of the above key and must point to a file relative to this manifest (similar to the readme key).
license-file = "..."

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

Просто в Haskell-community такой пакет тебе не дадут запостить на хранилище пакетов Hackage DB. Там сразу отошьют, если лицензия указана как AllRightsReserved. С другой стороны, на NuGet и Maven это проходит на ура. В NuGet даже попросят прочитать и согласиться с лицензией перед установкой.

За ответ спасибо!

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

Ну crates.io агитирует за использование MIT/Apache 2.0. То есть несвободные лицензии не приветствуются.

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

А можно на сайте cargo размещать свои пакеты под собственнической лицензией, которую условно назовем Academic Public License, где исходники будут открытыми в буквальном смысле, но под моими лицензионными ограничениями?

Какой смысл открывать, делая закрытым?

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

Этот вопрос лучше переадресовать авторам OMNeT++. Кстати, там сопрограммы

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

посмотри sdl  — позволяет рисовать в памяти, причем кроссплатформено

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

Что в этом плохого, кроме того что «непривычно»?

Очевидно: дополнительные телодвижения.

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

Классная штука этот bindgen. Умная весчь, но не умеет #define в правильный тип делать. Ну т.е. все хорошо делает, но мало функционала. Например, я хотел бы эти самые #define регулировать. Сказать: «А ну-ка! Генерируй для целых чисел безнаковый тип, а здесь пускай знаковый». Заносить ручками для каждого имени. Мало еще фишек. Это еще один камень в огород препроцессора языка C.

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

Lua появился раньше этого несчастья. Большинство известных игр класса ААА, такие как S.T.A.L.K.E.R. или ArmA(популярнейшая игра и моды к ней, вроде нашумившего DayZ ), не говоря про WoW, Payday 2, SimCity, Sims, Saints Row, Tom Clancy's H.A.W.X, Freelancer, Dark Souls, Dota 2, Mafia, Natural Selection 2(до сих пор в нее гамаю, и есть переполненные сервера) и еще сотню две культовых игр с миллионными аудиториями. А также в таких больших приложениях как OpenWrt, Wireshark, MySQL Workbench, VLC. Ваши любимые ion и awesome юзают его.

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

Lua уже использовался в первом CryEngine(аж 2003 год), когда про JS еще не слышали даже на веб платформе.

Посему пренебрежительное отношение к JavaScript не поменялось. и менятся не будет. Когда ты можешь за 5 минут тут же подключить сишные файлы и сразу начать скрипты писать, которые дергают функционал «сверху», а веберы в 2017 году только говорят про какие-то движки. НЕЧЕСЕ продвижение! Те кто писали сталкера, уже начали JIT прикручивать к Lua в далеком 2007, а эти только проснулись.

Когда я попадаю в среду веберов, у меня постоянное чувство дежавю и чувство «велосипедостроения». Все эти конференциии, все эти вопли, все эти статьи, все эти рекламы, весь этот хайп производить впечатение, что люди спали 50 лет развития компьютеров, а теперь для себя открывают быструю сортировку, а написать свой двигл с реферсным рендером - ЭТО НОВОЕ СЛОВО. А сишники в 90-ых только этим и занимались, что как бы свой дум или кваку на пентиумах запустить.

После того как я использовал Lua на практике во многих моих проектах, я на JS смотрю как на убожество.

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

Ну т.е. все хорошо делает, но мало функционала. Например, я хотел бы эти самые #define регулировать. Сказать: «А ну-ка! Генерируй для целых чисел безнаковый тип, а здесь пускай знаковый». Заносить ручками для каждого имени. Мало еще фишек. Это еще один камень в огород препроцессора языка C.

Не знаю, как bindgen, а препроцессор С это позволяет

#define UNSIGNED_A 10u
#define UNSIGNED_B 11u
#define SIGNED_A 12 
Или что имелось в виду?

deadskif
()

Новый блог пост от энтузиаста Golang Дейва Чейни, обосновывающий решения дизайна Go.

Сам пост хороший и информативный, но суть сводится к следующему:

Почему в Go нет генериков?
Будет сложно новичкам.

Почему Go не использует монады для обработки ошибок и резултатов?
Будет сложно новичкам.

Почему в Go нет возможности немутабельности или модели ownership?
Будет сложно новичкам.

И так далее.

Принцип «простота - превыше всего» - для Go является центральным.

Я не утверждаю, что качество и сложность языка есть одно и тоже; напротив, простота и доступность - вполне похвальные качества. Если на Go перейдут многие веб-разрабочики, сегодня используещие, например, Ruby или PHP, которым нужен простой и отсносительно производительный язык, где все решения, не прямо связанные с функциональностью продука - «выведены за экран» - тем лучше.

Но в таком формате соотноешния простоты и гибкости, Go не способен быть заменой языка уровня С или С++ для тех задач, где возможность низкоуровнего контроля и моделирования процесса вплоть «до железа» - необходима.

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

В добавок, думаю, уместна цитата Эйнштейна: «Все должно быть настолько простым, насколько возможно... но не проще».

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

Go не способен быть заменой языка уровня С или С++ для тех задач, где возможность низкоуровнего контроля и моделирования процесса вплоть «до железа» - необходима.

А Go и не планирует заменить C/C++ в нише low level programming, он их скорее выдавливает больше из бекендов и сетевого программирования, это у Rust наполеоновские планы ;)

p.s. не надо называть Ruby «простым языком», он очень навороченный уж

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

ерь для себя открывают быструю сортировку, а написать свой двигл с реферсным рендером - ЭТО НОВОЕ СЛОВО

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

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

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

По такому же пути идет и Rust. Вот есть C и С++, на которых можно сделать все, что угодно, и сделать это эффективно. Но для того, чтобы сделать это безопасно, приходится прикладывать много усилий.

Авторы Rust-а как бы говорят: ну, Ok, раз на C и C++ программировать сложно, то вот язык, из которого мы поубирали возможности, которые могли бы поставить разработчиков в ступор. И взяли под контроль возможности, которые бы позволили запросто отстрелить себе ноги.

Т.е. разработчики Rust-а идут по тому же самому пути, что и разработчики Go. Только если разработчики Go метят в аудиторию Python-истов, то Rust типа метит в аудиторию C-шников и C++ников.

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

И нет возможностей, которые бы позволили запросто так отстрелить себе ноги.

Легко:

f, err := os.Open("filename.ext")
if err != nil {
    log.Print(err)
}
O02eg ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.