LINUX.ORG.RU
ФорумTalks

Rust vs С++

 


1

7

Расскажите, пожалуйста, про Rust.

Если я правильно понял, то разработчики взяли C++ насмотревшись на его слово const, и всё сделали наоборот. Т.е. const теперь по-умолчанию, а то что раньше было без ключевого слова, теперь стало mut.

Вся крутизна синтаксиса rust в том, что mut на две буквы короче чем const.

Однако, в силу недостатка мыслительной мощности, разработчики rust не реализовали многие другие механизмы C++ (и поэтому решили, что будут свой язык сравнивать не с C++, а с C).

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

кто-нибудь впихнет return между

Вот таким людям надо тоже пихать потом ретурн между (но только уже не new и delete).

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

после этого попадаем в ногу с большей вероятностью чем в C - в unsafe коде нужно гарантировать больше условий.

Это чушь. Во-первых, unsafe предоставляет больше гарантий чем сишка - система типов и лайфтаймов продолжает там работать. Во-вторых, unsafe позволяет изолировать небезопасный код и обернуть его в безопасные обертки, которые будут обеспечивать правильные значения входных параметров (в C такое даже и близко невозможно). В третьих, количество инвариантов входных значений, которые необходимо обеспечивать, будет таким же как для аналогичного кода на C.

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

Вот здесь еще хорошо написано https://habr.com/ru/post/492410/#para_6

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

А потом кто-нибудь впихнет return между new и delete, ага, знаем.

Компилятор должен будет как минимум выдать ворнинг о мертвом коде.

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

А это не мёртвый код будет. Return будет располагаться внутри if, который будет срабатывать один раз из двух. 50/50 или сработает, или нет.

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

Я уже 4 года пишу на Расте. И сегодня вот написал код, который выглядит нормально, но на него ругается MIRI: https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=366116fc046c3e031268ddc40579dcd0 . Смотреть: tools -> miri.

Больше там приходиться учитывать: всё что в С + zero-sized types, stacked borrows, доступ к памяти за пределами того на что указывала ссылка из которой получен указатель - UB. То есть let a = vec![1,2]; let ptr = &a[0]; ptr.offset(1).read() - UB. let ptr = a.as_ptr(); ptr.offset(1).read() - OK. Конвертация из ссылки в &mut, если ещё один такой &mut есть - UB. Возможно что-то ещё.

Но, да - то, что unsafe код можно изолировать - перевешивает.

red75prim ★★★
()
Последнее исправление: red75prim (всего исправлений: 1)

Мысли великих людей.

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

никаких ГТК для сих целей не надо. руки и голова :)

Jetty ★★★★★
()

Если я правильно понял, то разработчики взяли C++ насмотревшись на его слово const, и всё сделали наоборот. Т.е. const теперь по-умолчанию, а то что раньше было без ключевого слова, теперь стало mut.

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

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

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

1.04E+17 as u8 - UB, хотя никакого unsafe нет.

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

Во-первых к толкованию «что такое ООП» есть несколько разных подходов и C++ всего лишь один из них. Так есть люди которые вообще считают что ООП в C++ не труЪ и таковым называться не может.

Во вторых, в Rust тоже можно в ООП. Несколько специфичный и местами натянутый на глобус, но тем не менее.

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

Я имею ввиду ситуацию, когда есть простая функция, в начале new, через несколько строчек delete. Потом функция становится со временем сложнее и занимает уже экран или два. Потом кто-то решает выйти из нее в середине через if(bad_condition) return false; и забывает про delete в конце. Вполне рабочая ситуация

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

Осталось вмержить фикс для i64->u8 и т. д.

Также можно получить UB на обычном сложении и умножении двух чисел. И Rust ничего не скажет.

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

Преобразование в более узкий тип определено как truncation. В более широкий как zero- или sign-extend в зависимости от знаковости типа. Сложение и умножение знаковых чисел в релизной сборке определено как two’s complement, беззнаковых как аримфметика по модулю.

Никаких UB там нет.

Если нужно UB, то придётся использовать nightly и std::intrinsics::unchecked_add().

red75prim ★★★
()
Последнее исправление: red75prim (всего исправлений: 2)
20 декабря 2021 г.
Ответ на: комментарий от Pacmu3ka

Да чего с ним бороться? Не удивлюсь, если stackoverflow и Mozilla как-то друг с другом повязаны, и соответственно, Mozilla искусственно пририсовывает рейтинг своей поделке. Я давно так не матерился, как тогда, когда попытался пописать на Rust. До задач, где нужно столкнуться с borrow-checker, дело не дошло, этот чудовищный язык убил меня уже вводом-выводом и обработкой ошибок.

Так что если прикрыть Mozilla, эту нелепую поделку перестанут форсить, и про неё все забудут. Глядя на Rust, понимаешь, как гениален был Деннис Ритчи, что придумал язык, который, по сути, сильно не меняясь, остаётся актуальным и удобным уже лет 50.

Правда, тут ещё встаёт вопрос, для каких целей использовать язык программирования. Для преподавания алгоритмов ничего лучше, чем C/C++, не найти, для более реальных задач C#.

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