LINUX.ORG.RU

Rust и типобезопасность

 ,


3

7

Решил я тут немного изучить Rust, чтобы не состариться, так и не вкусив плодов современной цивилизации.

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

Почитав документацию:

The as keyword does safe casting

Набросал такой примерчик:

fn main() {
        let a: f64 = std::f64::MAX;  // данное значение просто пример "большого числа"
        let b = a as i64;
        println!("{}", b);
}

Вопросы:

1) С какой стати это вообще компилируется?

2) Да, f64 и i64 нужно одно и то же количество битов для хранения значения, ну и что?

3) Почему результат меняет знак?

Представьте, что какой-то тех. процесс идет, и определенный параметр нельзя изменять скачкообразно, иначе физически система (по крайней мере, один из компонентов) выйдет из строя (встанет в раскоряку, взорвется, выпустит токсичный газ, убивающий 100тыс. населения; нужное подчеркнуть). И вот значение в f64 положительное и увеличивается постепенно, с i64 все вроде в порядке (и тестирование проходит на тестовых значениях), и вдруг хренак! и уже -9223372036854775808

Как так?

★★★★★

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

плебея от царя я как-нибудь переживу, чай не обидчивый.

+1

Кстати, если кому интересно, ликбез царя на тему концептов и С++ и переписанный код примера:

https://godbolt.org/z/HTU2RX

И немного ответов:

https://pastebin.com/raw/XbNh10p3

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

Нифига сколько тут говноедов поклонников шизоЦаря

https://godbolt.org/z/HTU2RX

Почему он не используется в остальных языках? Всё очень просто - не осилили.

Ну т.е. Гугль со своим Go или Apple с Swift имея охрененные ресурсы и «ниасилили»? Отдаёт шизой.

никакого обобщённого программирования нигде и нет, кроме С++

скритпухи типа хаскеля

получается такая система, которой ненужны никакие аннотации, никакие интерфейсы. Если код собирается - он весь удовлетворяет друг другу. Адепты всякого мусора будут пытаться вас убедить, что какие-то концепты нужны в С++ для каких-то ограничений. Что какие-то ограничения нужны для чего-то. Нет. Они нужны скриптухи - С++ же может без них. И может максимально хорошо. Добиться подобного используя мусорные подходы в принципе невозможно. Почему я уже говорил.

У кого-то ещё есть сомнения в невменяемости поцЫэнта?

Именно поэтому решение одно … Этот подход используется в С++

И эти люди ещё что-то говорят про сектантов :)

элементры

интерфесы

Попытатки

урощения

фундементальное

нелпое

Бл*, кто-нибудь, подарите ему глаза или спелл-чекер.

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

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

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

Мне интересно, кто-нибудь смог осилить поток сознания из комментариев в примере кода с godbolt-а? Я сломался на втором или третьем абзаце.

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

все конечно круто, но разве в std::function под капотом не тот же самый type erasure с вызовом виртуальных методов?

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

все конечно круто, но разве в std::function под капотом не тот же самый type erasure с вызовом виртуальных методов?

Ну и царь говорит, что static dispatch лучше:

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

а вот его ответ: https://pastebin.com/raw/UvRvt563

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

Ну пипец тебе нечем заняться, как работать ретранслятором :)

потуги балабола

Царь обещал запили блог на C++-движе и обосрался. И кто тут балабол? :)

Для тех, кто не в курсе, Царь - шизоид из Красноярска, работает в СФУ:

http://ikit.sfu-kras.ru/e/166

Ромка работает в зарсра*ом вузе быдло-доцентом, читает «лекции» и пишет статьи во всяком г*вне уровня Scopus (кто знает, тот поймёт). Вне СФУ он никто и звать его никак.

Помимо этого товарищ всезнайка ведёт «курсы» по то, «как опубликовать говно, чтобы пролезло» в типа рецензризуемых «журналах»:

https://rtsarev.ru

Серьёзно воспринимать этого спецЫализда - себя не уважать. За всё время г*номентания на ЛОРе он так и не дал ссылку ни на один свой проект, чтобы местное население смогло, наконец, приобщиться к «высокому искусству» программирования на «настоящем C++».

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

На самом деле, это все не важно. Потому что продираться через поток истерик и говнометания, чтобы выудить крупицы вменяемой речи, нет никакого желания. Это как если бы (в остальном) умственно полноценный человек заикался, и мог бы выговаривать по одному слову в час. Нет, с т.з. морали никакого осуждения он не заслуживает, но от этого восприятие его мыслей продуктивнее не становится. Ему следует обратиться к врачам, если его недуг еще можно исправить.

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

Насколько это точно?

На 100% не уверен, но на ЛОРе уже проскакивали посты про «царя из Красноярска». Я лично с ним (Царёвым) не общался, а вот у коллег был опыт. Список публикаций вполне «погромистский», так что думайте/решайте сами :)

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

std должна быть клеем между либами. В этом плане стд раста даже немного жирновата, ибо содержит std::net.

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

Этот факт придает больше смысла тому бреду, который он тут пишет?

Нет, конечно :)

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

Текст же, даже скипая часть слов получается быстрее чем смотреть видео. А вроде тут многим нравится смотреть доклады по С++/другим языкам.

Да и не дело в царе. Дело просто в каких-нибудь тезисах. Вот например у Александреску есть похожие мысли относительно концептов: что все возможности концептов уже есть в С++, и что этому уделяется слишком много внимания и потратили много ресурсов на это, а нужно было развивать интроспекцию/рефлексию.

Ну пипец тебе нечем заняться, как работать ретранслятором :)

@htower_, да, нечем. Смотрю КВН: https://www.youtube.com/watch?v=TcBBghFIt2A

Да и ответы на pastebin проще скипнуть чем целые посты от анонимуса, если они вам совсем неинтересны.

А я и @stasolog и может ещё кто почитаем…

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

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

Расту же хуже от этого :)

Я посмотрел вот этот курс по расту: https://www.youtube.com/watch?v=Oy_VYovfWyo&list=PLlb7e2G7aSpTfhiECYNI2EZ1uAluUqE_e

почитал растбук и растомикон. И немного пописал хелло вордов на https://github.com/hecrj/iced

Не претендую на гуру раста, просто могу читать закорючки и они имеют какой-то смысл для меня :)

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

могу читать закорючки и они имеют какой-то смысл для меня :)

Срочно пишите резюме в Apple, они как раз сейчас набирают rust-программистов в новый проект :)

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

Текст же, даже скипая часть слов получается быстрее чем смотреть видео. А вроде тут многим нравится смотреть доклады по С++/другим языкам.

Ты серьезно сравниваешь доклады на больших конференциях типа CppCon с постами «говно-говно» на LOR?

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

Да и не дело в царе. Дело просто в каких-нибудь тезисах. Вот например у Александреску есть похожие мысли относительно концептов: что все возможности концептов уже есть в С++, и что этому уделяется слишком много внимания и потратили много ресурсов на это, а нужно было развивать интроспекцию/рефлексию.

зачем плюсам интроспекция/рефлексия? хоть одну толковую причину приведите.

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

Я посмотрел вот этот курс по расту: https://www.youtube.com

facepalm.bmp

Не удивительно, что ваши попытки сравнивать C++ и Rust выглядят нелепо. Как в прочим и 95% критики раста.

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

Я понимаю, как относиться к его словам про C++.

Я C++ только за деньги пишу =)

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

Если уж нравится ютуб, то был нормальный ролик со сравнением концептов C++ и Rust: https://www.youtube.com/watch?v=olM7o_oYML0

PS: сам не смотрел, ибо не перевариваю видосы, но хвалили

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

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

UPD: Еще логгер, от которого ссут кипятком в конфе по D, можно отличный написать

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

Спасибо, но я не интересуюсь мнением сумасшедших.

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

Сейчас в плюсах, чтобы отобразить содержимое какого-то объекта в лог (на консоль) нужно вручную написать для него operator<<. В том же D это делается посредством рефлексии.

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

зачем плюсам интроспекция/рефлексия? хоть одну толковую причину приведите.

Сама по себе рефлексия в C++ не так уж и полезна. Даже к самой часто упоминаемой сериализации/десериализации на базе рефлексии есть ряд вопросов.

Но вот предложения от Саттера по этой теме содержат не только рефлексию, но и возможности по генерации нового плюсового кода прямо в комплайт-тайм. И вот это открывает широкие возможности для построения различных DSL-ей.

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

Может там и еще чего. Но вот я от D-шников именно такой пример касательно логирования слышал.

Еще вроде в D сериализацию/десериализацию в JSON через рефлексию в vibe.d делают (если мне склероз не изменяет).

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

зачем плюсам интроспекция/рефлексия? хоть одну толковую причину приведите.

«Экспорт» классов и функций в скриптовые языки, да и просто байндинги к сиплюсным библиотекам.

Serral
()

Максимальное i64 ~ 2^64. Максимальное f64 ~ 2^1000, любое i64 настолько далеко от максимального f64, что вобще без разницы что там тебе преобразование выдаст.

f64 положительное и увеличивается постепенно

на числах близких к максимальным f64 нет никакого «постепенно», там шаг между соседними чилами = миллиарды.

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

Кстати, если кому интересно, ликбез царя на тему концептов и С++ и переписанный код примера:

https://godbolt.org/z/HTU2RX

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

Если кратко то:

  • Трейты не нужны, так как работает только утиная типипизация, а недоязычки её не умеют. Пусть компилятор думает, у него башка большая.
  • Утиная типизация могла бы работать, но ломается о перегрузку. Но перегрузка хорошая, недоязыки перегрузку неосилили. Нормальную утиную типизацию в плюсы можно, но ещё дольше компилять будет.
  • Поэтому для решения проблемы с перегрузкой приходится выносить утиную информацию в сигнатуру функции.
  • Слишком много выносить - будем пилить трейты концепты
  • Концепты != трейты, это фактически алиасы для нескольких проверок утиной типизации
  • А так, конечно, концепты не нужны

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

Далее идёт разнос кода, общий смысл которого, что писали на плюсах излишне длинно. Докопался до того, что поганый сектант выводил данные через иострим в плюсах, а в расте через красивый форматированный вывод. Надо было в плюсах не через printf, хотя вроде это авторы плюсов рекомендуют о принтфе забыть. Ну и ещё раст виноват, что форматирование в нём не как в принтфе, а «тормознутый макрос» во время компиляции. Ну и фирменное то, что авторы Раста - воры, украли некоторые фичи из других языков.

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

В общем, нельзя сказать что вообще 100% бред, 5% текста осмысленны. Действительно, трейт != концепт. Критика трейтов вполне вменяема, однако поверхностна и до Царя эти проблемы разбирали люди и поумнее и более внятно. Ну и, как бы, если у трейтов есть проблемы, это ещё не значит, что вариант «забить, скомпилялось и ладно» лучше. У ручного назначения трейтов как бы тоже есть достоинства, тем более когда можно назначить трейт чужому типу. Ну и несколько сомнительна идея Царя о том, что в Расте, где, как сам Царь заметил, нет перегрузки и, соответственно, проблем с поиском нужного дженерика, нельзя было запилить instantiation-time утиную типизацию. В конце концов рядом лежат макросы, которые тупо генерят код, вырезать тело дженерика и обернуть в макрос - вот и получишь примерно ту же instantiation-time утиную типизацию. Как бы даже если Царь это в полемическом угаре написал, ну, блин, хоть немного-то надо о правдоподобии думать, если не совсем дурачок.

khrundel ★★★★
()

Ну молодец, затралел.

Как уже говорили, это баг, фикс трекать тут. Вкратце, каст f64 в i64 сейчас работает через жопу.

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

Или, другими словами, каст f64 в i64 сейчас работает так же как и в C и C++.

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

любое i64 настолько далеко от максимального f64, что вобще без разницы что там тебе преобразование выдаст. шаг между соседними чилами = миллиарды.

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

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

Т.е. вы сначала пишете

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

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

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

Но в какой int вмещающий 2^64 ты хотел превратить число 2^1000. То что 2^1000 + 10^6 = 2^1000, т.е. число не поменяется, прибавь ты к нему миллион, тебя тоже будет смущать? так может просто надо понимать что это за числа перед тем как проводить какие-то операции над ними?

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

С чего ты решил, что я хочу число в результате получить? Ты ветку читал? Хотя с saturation arithmetic тоже вариант.

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

Ты ветку читал?

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

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

Ошибку хотел получить?

Вообще да, если преобразование может быть с ошибкой, то и возвращать надо Result. Как это сделано в FromStr.

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

man TryFrom

Именно. А теперь смотрим, когда он был добавлен. Т.е. в языке была дырка, ее хоть и поздно, но прикрыли. Но в итоге и дырка осталась, и одно и тоже теперь можно сделать несколькими путями.

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

Какая ещё дырка? Это баг, который в итоге поправят.

Преобразование в любом случае может быть некорректным и возвращать неправильное значение.

Это не особенность языка, как в случае с сишкой.

Ну сишечка ж опасная и вообще макроассемблер. А тут типа безопасный язык.

П.С. Почитал про переполнение в расте, это цирк, В дебаге по дефолту падаем, в релизе не падаем. Какой гений проектирования это придумал.

Serral
()
Последнее исправление: Serral (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.