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

Как так?

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

Модули, концепты (считай трейты), ranges, fmt. Это всё уже 5 лет как есть в расте. Почему бы и не из него.

Тогда уже из D, а не из раста, раст сам тут догоняющий.

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

Блин, какая незамутненность…

Модули,

Появились в Modula-2 и Ada еще в начале 1980-х.

концепты (считай трейты),

Которые до этого выпилили из C++11 из-за сырости. Т.е. работа над концептами полным ходом шла еще до того, как появился первый прототип Rust-а.

ranges,

Да, да. Седой Boost.Ranges из начала 2000-х как предтечу Ranges.v3 игнорируем. Зато Rust да, прям первоисточник.

fmt.

С корнями из Python-а.

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

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

Использование функциональных объектов (ака функторов) в С++ было во многом обусловлено отсутствием замыканий, в Rust же лямбды были с самого начала, покрывая большую часть юзкейсов.

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

Вы говорили:

Ну в C++20 добавили пару фич из раста, есть такое.

И на прямой вопрос что именно добавили дали вот такой перечень: «Модули, концепты (считай трейты), ranges, fmt.»

А я вам показал откуда ноги растут у этих фич. И это вовсе не Rust.

Вы же как тот студент, который выучил только вопрос про блох: раз есть в Rust-е, значит и в C++ они попали из Rust-а.

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

Использование функциональных объектов (ака функторов) в С++ было во многом обусловлено отсутствием замыканий, в Rust же лямбды были с самого начала, покрывая большую часть юзкейсов.

Вот так всегда, если его нет, значит оно не особо надо, а как выползет из unstable в stable, так наш Rust основа всех основ и у него все копируют.

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

Вы бы вместо того, чтобы свое скудоумие в очередной раз демонстрировать, лучше бы ответили за свои слова о том, что в C++20 какие-то фичи из Rust-а включили.

Но ведь конкретика и способность ответить за слова – это же не про RazrFalcon, как показывает история LOR-а.

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

Вы мне сами что-то приписали

раз: «Ну в C++20 добавили пару фич из раста, есть такое.»

два: «Модули, концепты (считай трейты), ranges, fmt. Это всё уже 5 лет как есть в расте. Почему бы и не из него.»

Надо полагать, что это не вы из-под своего аккаунта на LOR-е написали, а я вам приписал. Угу.

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

Да оно и сейчас не нужно.

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

Serral
()

Сорян что врываюсь, но не хочется ещё одну тему-паровоз создавать.

Как я понял, изначально язык затевался с настроем «постараться сделать всё, наконец, более-менее правильно». Среди прочего, это значит: поменьше ad-hoc[ синтаксиса], по возможности поменьше UB…

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

Грамматика эсперанто, по замыслу создателей, должна была быть без исключений. Но даже в эсперанто есть некоторые (минорные, по вроде-бы-общему мнению) исключения. Только в эсперанто они и правда довольно локальные и их очень мало. А в расте их уже многовато.

Может кто-то из разработчиков раста комментировал ситуацию, что в нём стало много особых случаев?

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

А можно подробнее? Какой юзкейс функциональных объектов вы не могли бы заменить лямбдами?

У меня функция - полноценный объект с информацией о себе, который можно передавать в сиплюсный код, в питон или JS и использовать там как родную. С поддержкой именованных параметров, переменного числа аргументов, дефолтных значений и т.д. Все это умеет в статическую типизацию (на С++) с кастом связанных типов параметров/результата. Реализация может быть тоже на любом языке. На С++ это реализовано относительно просто и очень удобно. На Rust же даже выдергивание функции из скриптового языка это треш и угар (если подразумевается представить ее как родную).

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

лучше бы ответили за свои слова о том, что в C++20 какие-то фичи из Rust-а включили.

Вам нравится включать дурачка?

С практической точки зрения эти фичи появились в Расте раньше и этого достаточно.

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

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

Хоть один? См. заглавный пост. Чем не особый случай?

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

Вы либо разделяете утверждение «стало многовато особых случаев», либо нет.

Если нет, я ни на чём не настаиваю, может, кто-нибудь другой ответит.

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

и тут вдруг неожиданно именно те из них, которые есть в Расте

Так может думать только тот, кто дальше Rust ничего не видел. Во-первых все это было в D (откуда уже в С++ действительно попадали наработки), во-вторых «неожиданно» список изменений на этом не заканчивается, и там есть то, что Rust не умеет.

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

С практической точки зрения эти фичи появились в Расте раньше и этого достаточно.

Во-первых, бремя доказательств лежит на том, кто сделал утверждение. Кивок на то, что похожие вещи появились в Rust-е раньше таковым служить не может, ибо

Во-вторых, после не значит вследствие.

И, в-третьих, для концептов, ranges и fmt прекрасно известно их происхождение и прототипы, на которых они базируются. И это далеко не Rust. Происхождение модели модулей в C++ мне доподлинно неизвестно, но схожесть модулей из C++20 и модулей Rust-а нуждается в доказательстве. Которого пока ни RazrFalcon, ни вы привести не удосужились.

А в-четвертых, я не хочу, чтобы мне докучал настолько дремучий демагог, как вы, который даже не дружит с элементарной логикой. Поэтому вы идете в игнор.

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

Так может думать только тот, кто дальше Rust ничего не видел.

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

Во-первых все это было в D

А вот плевать всем на этот Д. О нём что-то слышали полторы калеки. Если уж сравнивать, то сравнивать с Java, на худой конец с C#, это языки достаточно популярные. Но и из них не особо-то спешили заимствовать, это вроде как другой мир, у них там сборка мусора и байткоды всякие, а у нас тут серьёзные люди серьёзный хайперформанс софт на плюсах пишут. Другое дело Раст, язык вроде как в ту же нишу метящий и с хайпом. И вот программисты посмотрели на него и спросили: «а что, так можно было?» И комитет, который до этого кормил завтраками и обещал подумать когда-нибудь потом начал довольно быстро наверстывать, причём именно в тех местах, где позорно отставать от выскочки. Разве не логично?

Ну а то, что именно в Расте модули, равно как и ограничение дженериков трейтами изобрели никто и не утверждал.

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

А вот плевать всем на этот Д.

«Все» не имеют никакого отношения к разработке языков.

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

Комитет активизировался начиная с С++11, тогда про Rust никто не слышал ничего. И эти возможности в С++ не с наскока добавили, их обсуждали, к примеру спецификация на концепты была утверждена уже в 2015-м.

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

Вы либо разделяете утверждение «стало многовато особых случаев», либо нет.

Меня это иногда тоже беспокоит, но, справедливости ради, предусмотреть всё сразу непросто, если вообще реально. Опять же, в расте к этому стараются аккуратно подходить: новые фичи обкатываются в найтли (временами весьма долго). Минималистичная стандартная библиотека тоже на руку в данном случае.

Ну и в целом всё не так страшно: этот процесс можно держать под контролем. Всё-таки, как правило, добавляются не просто «особые случаи», а скорее «более удачные». Да, старый вариант нельзя выкинуть без поломки совместимости, но можно выдавать предупреждение. Вроде как с dyn Trait случилось - сейчас только такой код и попадается, в основном. Плюс редакции должны помочь с этим справляться.

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

Во-первых, бремя доказательств лежит на том, кто сделал утверждение. Кивок на то, что похожие вещи появились в Rust-е раньше таковым служить не может, ибо

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

Во-вторых, после не значит вследствие.

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

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

И, в-третьих, для концептов, ranges и fmt прекрасно известно их происхождение и прототипы, на которых они базируются. И это далеко не Rust.

А вот это чистой воды strawman argument, никто не утверждал, то эти штуки изобрели в Расте. Так что рано вы начали обзываться «демагогами», как бы самому таким не оказаться.

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

«Все» не имеют никакого отношения к разработке языков.

Извините, это так не работает.

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

Те, кто разрабатывает языки, они много что знают, они и в начале 80х слышали, например, про лямбды и всякую функциональщину, однако добавлять во все языки начинают не тогда, когда узнают разработчики языков, а когда это появляется в популярном языке, люди узнают и появляется спрос. Поэтому D вообще не канает. Если кто-то скажет, что авторы крестов реализовали некую не сильно сложную фичу 1в1 как в D, реализовали после D, но реализовали независимо и это просто совпало, я сочту это более правдоподобным чем то, что они не догоняли Раст в 20м стандарте.

Комитет активизировался начиная с С++11, тогда про Rust никто не слышал ничего. И эти возможности в С++ не с наскока добавили, их обсуждали, к примеру спецификация на концепты была утверждена уже в 2015-м.

Тут другой вопрос: когда бы это было? Обсуждать можно долго, и спецификация, готовая в 2015м может, например, не войти в C++17, почему бы ей войти в C++20, а не быть отложенной до C++23?

khrundel ★★★★
()

Почему любой тред с растом, где-бы то ни было, превращается в холивар? Вопрос, скорее, риторический.

Кстати, все-таки раст задумывался как замена плюсам или сишке? Сравнивать с плюсами довольно странная идея, ведь плюсы это огромная стандартная библиотека, в то время как у раста, как и у сишки, стандартна библиотека небольшая.

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

Опять же, в расте к этому стараются аккуратно подходить: новые фичи обкатываются в найтли (временами весьма долго)

Тут другой вопрос: когда бы это было? Обсуждать можно долго, и спецификация, готовая в 2015м может, например, не войти в C++17, почему бы ей войти в C++20, а не быть отложенной до C++23?

в расте долго обкатывают новые фичи - хорошо. В плюсах долго обкатывают новые фичи - плохо. Понимаю.

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

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

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

в расте долго обкатывают новые фичи - хорошо. В плюсах долго обкатывают новые фичи - плохо. Понимаю.

Ну передёргивание же.

А вообще это от конкретной фичи зависит. Если это что-то, что можно в библиотеке реализовать, то и в С++ оно будет реализовано (в бусте, например). Если это что-то более глобальное, то, как правило, в расте это будет проще пощупать.

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

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

Чем не особый случай?

Это баг, а не нюанс языка.

Вы либо разделяете утверждение «стало многовато особых случаев», либо нет.

Я без понятия что вы под этим подразумеваете, поэтому и попросил привести пример.

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

в расте долго обкатывают новые фичи - хорошо. В плюсах долго обкатывают новые фичи - плохо. Понимаю.

Речь не о хорошо или плохо, а о том как оно есть. Практика показывает, что комитет C++ может сиськи мять десятилетиями.

Меня лично во всей этой фигне смущает даже не факт отставания, а то, что делают чисто для галочки. Понятно, что обратная совместимость, все дела, но не оставляет чувство, что все понимают, что реально пользоваться не будут, типа «а у нас тоже есть фича X! А теперь го выделять память маллоком».

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

плюсы - это огромная стандартная библиотека

Шта? Там фс только-только добавили. Вы о чём вообще? У раста поболее будет.

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

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

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

То есть, пошел переход на личности, а по существу вопроса ответить нечего. И не мните себя в роли экзаменующего - это не Ваше.

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

Ну, с чем я столкнулся, так это с тем, что в стд нет рандома и комплексных чисел. Пичаль(

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

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

расте, долго - это годик, а не 5-10 лет как в плюсах.

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

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

ведь плюсы это огромная стандартная библиотека,

Ю мэйд май дэй. Стандартная библиотека в плюсах это жалкий обрубок. Недаром boost так взлетел. Причём многие его фичи спустя годы таки начали добавлять в стандартную библиотеку.

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

В расте, долго - это годик, а не 5-10 лет как в плюсах

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

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

Ю мэйд май дэй

Рад стараться. Ну, а если честно, то я в основном пишу матан (раньше еще линейная алгебра) уровня первого курса и стд плюсов покрывает мои кейсы, в то время как с растом пришлось добавить доп. крейты

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

Ну и хотелось бы услышать

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

Может у вас есть какая-то подсознательная неуверенность? Хех. Таким психоанализом можно заниматься разве что для развлечения.

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

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

Просто, из интереса. Тут, кмк, другая ситуация, если сравнивать холивар и интерес, к тому как люди используют инструмент.

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

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

На это способны лишь истинно достойные мужи со стальной выдержкой. Кроме того «главный растовик» взаимно недолюбливает Евгения Охотникова. Тут как в частушке про «мимо тёщиного дома я без шутки не хожу…»

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

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

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