@PrayHero

Хайп вокруг ЯП Rust и C?

Добрый вечер!
Насколько критичной проблемой для программиста является ручное управление памятью, которое называют недостатком языка Си? Новый язык программирования Раст, как заявляют, лишен этого недостатка, но разве число ошибок в программе зависит именно от наличия или отсутствия ручного управления памятью, разве общее число ошибок не перераспределяется на другие недостатки программы или программиста после принудительного автоматического искоренения ошибок с границами, и не являются ли ошибки с памятью ошибками программиста, а не компилятора и языка программирования, допущенными в связи с неточностями в формулировке алгоритма с использованием языка, которые вылились бы в другое русло, не будь этой возможности ошибочного использования памяти?
  • Вопрос задан
  • 620 просмотров
Пригласить эксперта
Ответы на вопрос 5
vabka
@vabka
Токсичный шарпист
По порядку:
Насколько критичной проблемой для программиста является ручное управление памятью, которое называют недостатком языка Си?

С неправильным управлением памятью связано очень много ошибок. Например в хроме вроде около половины CVE с этим связано. Ещё можно вспомнить HeartBleed в OpenSSL, который тоже связан с неправильным управлением памятью.

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

Да
разве общее число ошибок не перераспределяется на другие недостатки

1. Самые сложные в исправлении ошибки - кривое управление памятью и многопоточность, обе их Rust Решает
2. Нет, ошибки не перераспределяются, это же не тараканы.
являются ли ошибки с памятью ошибками программиста

Если управление памятью ручное, то это ошибки, которые допустил разработчик.
Если управление памятью автоматическое (хоть через GC, хоть через Borrow checker), то это ошибка компилятора/рантайма/языка.

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

Не обязательно.

В целом вопрос очень абстрактный и является скорее поводом для дискуссий. Попробуйте дать более конкретный пример, где ошибка управления памятью превращается в какую-то другую ошибку.
Ответ написан
Комментировать
bingo347
@bingo347
Crazy on performance...
Насколько критичной проблемой для программиста является ручное управление памятью, которое называют недостатком языка Си?
Неосвобожденная память (утечка памяти) - это самое безобидное, что может произойти.
- Сделать free дважды - это UB
- Забыли проверить результат malloc/calloc/realloc на не NULL, разыменовали - UB
- Почитали память, в которую ни разу не писали - UB
- Разыменовали указатель после free - UB
- Гонка данных - UB
- ...и еще дофига всего, от чего в лучшем случае программа просто будет работать неправильно, например спалит Ваш пароль, или переведет Ваши деньги на другой счет 10 раз.

Новый язык программирования Раст, как заявляют, лишен этого недостатка

Система типов Rust гарантирует лишь одно - в safe коде не будет UB. Утечка памяти, кстати, не является UB, поэтому память вполне себе можно утечь в safe коде, помимо циклических счетчиков ссылок std дает немало возможностей сделать это напрямую:
https://doc.rust-lang.org/beta/std/mem/fn.forget.html
https://doc.rust-lang.org/beta/std/mem/struct.Manu...
https://doc.rust-lang.org/beta/std/boxed/struct.Bo...
https://doc.rust-lang.org/beta/std/vec/struct.Vec....

но разве число ошибок в программе зависит именно от наличия или отсутствия ручного управления памятью
В Rust ручное управление памятью, как и в C и в C++, просто есть культура, что если некая структура аллоцировала память, то она ее освободит. Всякие Vec, Box и т.д. делают это в Drop. В C++ многие повседневные типы так же освобождают в деструкторе память, которую они выделили. Однако в Rust есть разделение на safe и unsafe код и для прикладного программирования safe возможностей более чем достаточно. В C++ же весь код unsafe.

разве общее число ошибок не перераспределяется на другие недостатки программы
Нет, не перераспределяется. Хорошая система типов действительно может избавить от многих ошибок, что в целом сделает ПО более надежным. Но надо понимать, что от всех ошибок не избавит ни что. Банальная дискоммуникация с заказчиком порождает огромное число багов.
Но в Rust очень быстро привыкаешь к такому замечательному подходу в разработке, как Type Driven Development, который позволяет предупредить многие ошибки еще до написания кода. После Rust я стал применять этот подход и в других ЯП, и он работает очень хорошо, даже там, где типизация не такая строгая.

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

P.S. Вот интересная статья про Rust к прочтению: https://steveklabnik.com/writing/a-sad-day-for-rust
И к чему она привела: https://github.com/fafhrd91/actix-web-postmortem
Ответ написан
CityCat4
@CityCat4
Внимание! Изменился адрес почты!
Хайп вокруг ЯП Rust и C?

Нет никакого хайпа. Кто писал на С - тот пишет и дальше. Кто хочет модно-стильно-молодежно - пишет на Rust
ручное управление памятью, которое называют недостатком языка Си?

Это не баг. Это фича (C)
Это не недостаток языка. Это его достоинство. (Я сейчас конечно же про чистый С, а не про плюса). Языков с автоуправлением памятью - хоть #опой жуй. "Убивцев" С - тоже не меньше - появляются и исчезают, как пузыри, оставляя после себя неприятный запах...
и не являются ли ошибки с памятью ошибками программиста,

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

Броском кухонного ножа можно спасти жизнь человека. А можно ее забрать. Является ли возможность ножа убить насмерть ошибкой его разработчика? Нет, потому что нож предназначен для тех, кто умеет его применять. Не умеешь - используй столовый.
разве общее число ошибок не перераспределяется на другие недостатки программы или программиста

Нет конечно же, это же не тараканы :) их потравили в одной квартире - они "перераспределились" в другие
Ответ написан
Комментировать
uvelichitel
@uvelichitel
habrahabr.ru/users/uvelichitel
не являются ли ошибки с памятью ошибками программиста, а не компилятора и языка программирования

Вы попробуйте на Rust что нибудь написать. Там не то что ошибочный, там безошибочный код непросто скомпилировать))
Ответ написан
Комментировать
zagayevskiy
@zagayevskiy
Android developer at Yandex
Уменьшение количества ошибок одного вида никак не влияет на количество ошибок других видов. Так что в целом количество ошибок уменьшается. Наверное.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы