LINUX.ORG.RU

Rust 1.9

 


0

3

Анонсирована очередная версия языка программирования Rust 1.9, разрабатываемого Mozilla совместно с сообществом. Примечательно то, что с момента релиза первого стабильного выпуска прошел 1 год.

Основные изменения:

  • Стабилизирован модуль std::panic, позволяющий перехватывать раскрутку стека. Соответствующие функции рекомендуется применять только в исключительных ситуациях, но никак не для эмуляции механизма try-catch.
  • Стабилизированы методы настройки TCP и UDP соединений; расширены возможности OsString, BTreeSet и HashSet; char может быть получен из UTF-16 последовательности; стабилизирована функция copy_from_slice(); появилась возможность работы с волатильными переменными с помощью read_volatile и write_volatile; сырые указатели обрели .as_ref() и .as_mut(), которые возвращают Option<&T>, где null будет представлен как None; в libcore для всех типов реализован Debug.
  • Разработчикам библиотек доступен атрибут #[deprecated], разрешающий компилятору слать предупреждения при использовании устаревшего API.
  • Специализация уже используется в ночном релизе и будет доступна в стабильном 1.11 через 3 месяца, но оптимизация .to_owned() и .to_string() таки попала в текущий стабильный выпуск.
  • Расширен список поддерживаемых платформ: mips-unknown-linux-musl, mipsel-unknown-linux-musl, i586-pc-windows-msvc.
  • Ускорено время компиляции монады с одинаковыми функциями.

Изменения в менеджере зависимостей Cargo:

  • В системе могут работать несколько cargo одновременно, блокировки теперь применяются на файлы.
  • Переменную окружения RUSTFLAGS можно использовать для передачи произвольных флагов компилятору.

Для кросс-компиляции подготовлен инструмент rustup, обеспечивающий тривиальное взаимодействие с каналами сборок компилятора (stable, beta, nightly), стандартными библиотеками и их документацией к различным операционным системам, а также обновление всего этого зоопарка одной командой.

>>> Подробности



Проверено: Falcon-peregrinus ()
Последнее исправление: shaiZaigh (всего исправлений: 2)

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

Сделать там много чего можно, кроме нормального паттерн-матчинга. Но стандартных средств нет, соответственно повторение ситуации с std::string, QString, CString, MyString и прочими.

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

Плох. Компилятор не знает какому тэгу какое поле юниона соответствует (хотя в MSVC можно SAL-атрибуты использовать). Статические анализаторы тоже вряд ли что смогут в этой ситуации сделать.

То есть ещё один источник ошибок, каких в С++ и так хватает.

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

Ну можно ещё на лямбдах, макросах и темплейтной магии. Но опять-же проблема отсутствия стандартного решения.

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

Ну тут как посмотреть. В си да, хватит switch-а из-за наличия анонимных структур (С11), но в крестах будут уродливые суффиксы аля `t.res.foo` и `t.err.msg` вместо `t.foo` и `t.msg` соответственно.

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

Компилятор не знает какому тэгу какое поле юниона соответствует

Компилятор не знает, класс - знает. Ошибочный код скомпилируется, но бросит ошибку в рантайме.

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

Ну да, лучше бросать исключения и возвращать -1 в случае ошибки.

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

И чем оно лучше лиспа?

Да ЛЮБОЙ язык лучше ЛИСПа! Как и лучше брэйнфаков, рефалов и прочей ереси.
ЛИСП - это смешной язык из скобочек, позволяющий в краткой форме завинтить алгоритм так, что потом без косяка не разобраться. И нужно такое гуано в продакшене??

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

Между тем, писать на C++ не отстреливая себе ног можно уже давно

А в rust отстрелить их не выйдет в принципе. 90% ошибок C++ ловятся компилятором rust.

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

Да ЛЮБОЙ язык лучше ЛИСПа!

Malbolge видел?

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

Особенно в Rust-е, где кроме кодов возврата есть еще и паники.

Паника - частный случай. Достаточно посмотреть либы на расте - их все пишут panic-free. А если в либе есть паника или unsafe - быстро создаётся багрепорт, что бы автор ее убрал или в описании либы черным по белому пишут что она может «паниковать».

То есть panic в раст - это фича, которая нужна, но использовать ее нужно только в очень критических ситуациях, и зачастую не рекомендуется.

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

ЛИСП - это смешной язык из скобочек, позволяющий в краткой форме завинтить алгоритм так, что потом без косяка не разобраться.

Этот язык позволяет определять идиотов. Они обычно говорят что это смешной язык из скобочек. А в «продакшн», да, не всегда подойдёт.

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

Возможно

Отлично. BareMetal, ARM926EJ-S. Да вообще все прочие ARM, MIPS и так далее. Есть компиляторы? Когда появятся? Есть ли надежды? Как я понял, через unsafe вполне можно сказать: эта структура (Foo) отражает замапленные данные по адресу 0xEEEEEEE, т.е. что-то вроде:

volatile Foo* usb_configuration_regs = reiterpret_cast<volatile Foo*>(0xEEEEEEEE);

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

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

RTTI в нормальном ООП не нужен, а за неиспользование exceptions пороть розгами. Да, и обрабатывать задекларированные эксепшны надо заставлять еще на этапе компиляции.

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

Тривиальный приемер когда надо различать виды исключительных ситуаций: тебе надо отправить запрос на сервер. Если косяк со связью - отложить на повторить в следующий сеанс, если сервер сказал еррор 500 - кинуть тикет в поддержку, если 403 - спросить валидные реквизиты.

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

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

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

Между тем, писать на C++ не отстреливая себе ног можно уже давно
А в rust отстрелить их не выйдет в принципе. 90% ошибок C++ ловятся компилятором rust.

Никлаус Вирт читает этот текст, и усмехается: «Они не слышали об Обероне и Компонентном Паскале?»

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

Лучше сказать, у них ОЧЕНЬ маленькое сообщество, но Компонентный Паскаль все еще жив (развивающейся проект OpenBUGS)

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

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

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

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

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

будет ли разработчик языка продвигать его в этом направлении?

Вот я не вижу пока особого стремления. Возможно если раст станет достаточно популярным, то может быть будет. И то вполне вероятно что нет. Я думаю что нет. Ниша BareMetal очень консервативна, С там будет править ещё очень долго.

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

Не думаю. Наряду с сигнализацией прерыванием у железа есть сигнальные флаги - чем не тег результата.

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

будет ли разработчик языка продвигать его в этом направлении?

Вот я не вижу пока особого стремления.

А какое стремление должно быть? Rust с самого начала заявлялся как язык системного программирования, в том числе написания ОС - самый настоящий bare metal.

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

Стремление его там применять.

У core team? Потому что желания применять Rust для написания ОС - просто через край.

tailgunner ★★★★★
()

Rust-ишка.

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

В этом случае советуют смотреть zinc.rs: https://zinc.rs/

фуфло это все

      pll {
        m = 50;
        n = 3;
        divisor = 4;
      }

чем это безопасней чем аналогичный код на С ? и как руст спасет от аппаратных ошибок - а это для SoC и ядер ARM очень актуально ?

anonymous
()

Кто скажет опытный, это годно? На что похож синтаксис, насколько часто всё ломать будут, вообще, заслуживает внимания?

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

Годно для чего и по сравнению с чем?

Синтаксис как в плюсах.

За год с релиза ничего не сломали. За обратной совместимостью строго следят.

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

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

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

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

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

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

Заявить одно, а иметь инструмент для конкретной платформы

Ты раньше не был в темах о Rust? На нем написано несколько ОС разной степени серьезности, так что заявления вполне подкреплены фактами.

сложности портирования на новые

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

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

Вопрос был в том, зачем функциям определять по 2-3 типа ошибок. Зачем нужны типизированные ошибки, и так понятно.

tailgunner ★★★★★
()

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

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

Вопрос был в том, зачем функциям определять по 2-3 типа ошибок.

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

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

Мне она нужна для будущего, а не прошлого. Вы же предвещаете будущее. Мне тоже хочется.

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

Вопрос был в том, зачем функциям определять по 2-3 типа ошибок.

Странный вопрос, нужны чтобы сигнализировать об ошибках

2-3 типа ошибок. Тип ошибок - это один sum type на крейт.

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

Поясните в чём смысл прыгать в этот ржавый бэндвагон

Каждый решит для себя. Ты, например, решил, что смысла нет.

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

И то и другое - наколеночная поделка.

И что предпочтёшь ты?

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

стандартными фичами языка, без всякого синтаксического мусора типа try-catch.

Ага, только вместо try/catch-мусора есть всякие try! и .?.

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

Большинство современных, популярных языков (rust, swift, go) не поддерживают исключения

Про «большинство» и «популярных» - спорно. Кстати, swift «не поддерживает» достаточно оригинально.

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

Большинство современных, популярных языков (rust, swift, go) не поддерживают исключения

Swift 2.0

enum AwfulError: ErrorType {
    case Bad
    case Worse
    case Terrible
}
func doDangerousStuff() throws -> SomeObject {
    // If something bad happens throw the error:
    throw AwfulError.Bad

    // If something worse happens, throw another error: 
    throw AwfulError.Worse

    // If something terrible happens, you know what to do: 
    throw AwfulError.Terrible

    // If you made it here, you can return:
    return SomeObject()
}
do {
    let theResult = try obj.doDangerousStuff()
}
catch AwfulError.Bad {
    // Deal with badness.
}
catch AwfulError.Worse {
    // Deal with worseness.
}
catch AwfulError.Terrible {
    // Deal with terribleness.
}
catch ErrorType {
    // Unexpected error!
}
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.