LINUX.ORG.RU

Вышел Rust 1.23

 ,


2

8

4 января состоялся плановый релиз компилятора и стандартных средств разработки системного языка программирования Rust — 1.23.

Интересные изменения:

  • За счёт предотвращения ненужного копирования аргументов функций уменьшено потребление памяти. Например сам компилятор rustc стал потреблять на 5-10% меньше памяти.
  • rustdoc перешёл на рендеринг документации при помощи CommonMark. Раньше использовался Hoedown.
  • The Cargo Book переехал с doc.crates.io на doc.rust-lang.org и обновил формат.
  • cargo uninstall научился сразу удалять несколько пакетов. Например, команда cargo uninstall foo bar удалит foo и bar.
  • auto трейты теперь разрешены в трейтовых объектах. Один из коммитов этого изменения также окончательно удалил элемент языка send.
  • Проверки типов операндов бинарных операторов теперь производится относительно левого операнда, что предотвращает путаницу в соответствующих сообщениях об ошибках.
  • Исключена необходимость в T: Sync для RwLock<T>: Send.
  • Исключена необходимость в T: Sized для {<*const T>, <*mut T>}::as_ref и для <*mut T>::as_mut.
  • Оптимизирована реализация Thread::{park, unpark}.
  • Улучшена производительность SliceExt::binary_search.
  • Трейт AsciiExt объявлен устаревшим, а его методы перенесены в примитивные типы.
  • char::escape_debug теперь использует Unicode 10 вместо Unicode 9.
  • Включён LLVM-флаг TrapUnreachable.
  • musl, используемый для сборки musl rustc, обновлён до 1.1.17.
  • Улучшена производительность SliceExt::binary_search.
  • rustfmt включён в основную инсталляцию.
  • Минимальная версия LLVM изменена на 3.9.

>>> Полный перечень изменений

>>> Анонс

★★★★★

Проверено: Shaman007 ()

Сам я заинтересовался Rust лишь недавно, поэтому вполне может быть, что что-то понял и перевёл неправильно. Прошу более опытных растовщиков провести коррекцию.

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

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

Ну всё-таки проверка _подтипов_, если уж на то пошло. https://en.wikipedia.org/wiki/Subtyping

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

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

-    //~^ ERROR binary operation `+` cannot be applied to type `&'static str`
+    //~^ ERROR binary operation `+` cannot be applied to type `&str`

Разве тут речь идёт о подтипах?

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

Ты имел в виду, что 'static - это другое время жизни и поэтому &'static str - это подтип &str или наоборот? Даже если так, в приведённом отрывке коммита речь идёт о проверке типов. Именно поэтому я это так перевёл. А как бы перевёл ты?

bbk123 ★★★★★ ()

Тем временем на tiobe сабж снова свалился на 46-е место, так и до вылета из топ-50 недалеко. Какой то совсем квёлый хайп.

anonymous ()

Думаю таки с версии Раст 2.0, уже можно будет начать тыкать палочкой сее творение, не опасаясь, что через неделю впилят какую-нибудь несовместимую шишню

NetSurf ()

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

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

исключения не нужны.

Спорное утверждение. Я не согласен.

есть типы Option/Error — этого достаточно.

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

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

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

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

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

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

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

приятно перевыбрасывать исключения из обработчика исключений

Иногда бывает нужно. Для уточнения или переупаковки, чтобы снаружи api не торчали ненужные детали.

приятно выбрасывать исключения из конструктора

Очень полезная штука. Постоянно использую.

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

Нет. Exception тролли совсем измельчали.

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

https://github.com/withoutboats/failure

пример кода в ридми, спасибо реду за ссылку

enum ToolchainError - объявляем тип исключения

fn f(...) -> Result<T, ToolchainError> - указываем, что метод возвращает такое исключение (аналог жабовского throws)

open(path)?, key.parse()?, collect::<Result<Toolchains, ToolchainError>>()? - явный проброс исключений по стеку вызовов с помощью лишнего символа ?

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

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

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

Кроме того, некоторые исключения вроде «null object exception» эффективно и адектватно может обработать только программист, исправив баг в программе. На этот случай в Rust есть паники.

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

Это не особенность исключений. Коды возврата тоже дают возможность обрабатывать ошибку там, где надо.

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

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

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

fn foo() -> Result<String, Box<Error>>
red75prim ()
Последнее исправление: red75prim (всего исправлений: 1)
Ответ на: комментарий от not_rj45

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

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

Хипсторы раст и не должны любить.

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

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

Не, это про трейты, которые добавляет сам компилятор без подсказок. В описании говорится, что раньше можно было писать MyTrait + Send и/или +Sync, но теперь вот думают добавлять ещё подобных трейтов и заранее расточили под возможность добавлять их в объявление типа trait объекта.

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

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

да, да, а потом гоняем valgrind до посинения. хотя хипстеры без gc никак, тут ты прав

или может ли функция вернуть ошибку

а потом в лучшем случае крашим поток, в худшем запускаем космический спутник в океан

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

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

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

pftBest ★★★ ()