LINUX.ORG.RU
ФорумTalks

В чем смысл Rust?

 , , , ,


0

4

Зачем нужен Rust, если на Си с условным valgrind можно писать код без утечек и битья памяти переполняющимися буферами?

Перемещено dataman из general



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

Чтобы через закладки удаленно контролировать софт

masa ★★★
()

На Си и безо всяких валгриндов можно писать софт без битья памяти. Я например даже не знаю как этот валгринд запускать.

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

Но при этом все языки, кроме функциональщины для нетакусей, так или иначе ориентируются на Си.

rcldev
() автор топика

Получается куча разработчиков до сих пор не пользуется valgrind’ом и пишет с утечками?

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

Ну, Rust тогда тоже не является гарантией. Странно доверять на все 100% компилятору Rust’а, но не доверять valgrind’у, хотя, насколько я понимаю, он заменяет через динамическую библиотеку функции malloc и т. д. в программе на свои для определения утечек после конца работы программы и битья памяти, а Rust действует на уровне исходного кода, что менее надежно.

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

Ну, valgrind гарантирует на 99% отсутствие проблем с памятью. Без него тоже можно, но valgrind дает возможность все знать.

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

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

(Если чо, я не настаиваю, что ошибки обращения к памяти единственный или главный класс ошибок в ПО)

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

В том-то и дело, что боров даёт 100%.

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

Camel ★★★★★
()

...В чем смысл Rust?

«В чём сила, брат?» ©

«Извините, товарищи, переволновался.» © 😁

sparkie ★★★★★
()

Ну раст на голову лучше сишки - один cargo уже серьёзная заявка. Null вынесли в unsafe (это правильно, Null вообще зло о котором забывают и если тыкать проверку на Null везде, то производительности плохо, а если не тыкать, то можно краши получить на ровном месте, языки без него лучше, хоть и платят производительностью, а там где преждевременные оптимизации не нужны, то и Null не нужен). Строки лучше, абстракции лучше, параллельный и асинхронный код писать проще. Другое дело что на сишке пока больше всего написано и сишка проще, а значит и для микроконтроллеров её проще делать, ну и на рынке пока проще найти сишного разработчика, чем растомана. Со временем (лет 20) растишка вытеснит сишку отовсюду, кроме микроконтроллеров, если сишка конечно не начнёт развиваться, делая какое-то safe подмножество языка.

peregrine ★★★★★
()

Тут прям мем напрашивается: «Можно, а зачем?». Если это удобно будут пользоваться, нет - умрет. Вон тут фанат PureBasic бегает. Его любимый язык - то еще чудо.

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

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

peregrine ★★★★★
()

В его евангелистах

mittorn ★★★★★
()

За тем же, зачем и Java.

Чтобы писать более-менее нормальный софт в прод, условному джуну на Rust/Java нужно 6 месяцев обучения, а на С/С++ - минимум год.

Правда чтобы стать синьором на Rust/Java нужно ещё лет 5-7, а на С/С++ - плюс пару лет. Потому как о безопасности кода программист на С думает каждый день, а на Rust/Java - раз в год, когда словит утечки памяти там, где обещали что их нет, и пару неделек побъется головой о стенку.

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

Я знаю как обмануть borrow_checker, но это не его вина, а вина программиста, так как borrow checker такие проверки не делает.

///Если это конечно не исправили
let mut a = vec![1,2,3,5];
let n: usize=100; // тут условность n должна вычислятся в рантайме
a[n]=1000;

вариант классика описан в документации

let a =Rc::new(RefCell::new(10));
let b = a.borrow_mut();
b=100;
let c = a.borrow();// здесь захватить не получится будет ошибка, так как предыдущий захват не отпущен 

Но все это рантайм

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

насколько я понимаю, он заменяет через динамическую библиотеку функции malloc и т. д.

Точнее, так делает Memcheck, но Valgrind это не только этот инструмент.

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

Ну нет конечно. Давай вот о чём подумаем: пусть у нас есть БД с которой мы как-то работаем и какой-то коннектор к ней. ЯП пусть ООП с кучей защит от утечек памяти. Соединение с БД программист не закрывает, а когда ему надо к БД подключиться создаёт коннекторы и коннекты к базе. Внимание вопрос - будет ли течь память (ответ - да, а ещё и СУБД будет держать коннекты и там тоже будет всё пухнуть, правда СУБД по таймауту будет отваливать их, но если создавать их быстрее чем таймаут, то и СУБД прилечь сможет в теории, может и удалённый компьютер ляжет на котором СУБД работает, но на практике у взрослых СУБД как правило есть параметр на максимальное количество подключений, но может у каких-то маленьких и малоизвестных СУБД его и нет, например у встраиваемых субд вроде H2 я не припомню о таком.)

Хорошо, фиг с ними с СУБД. Программист читает файлы с диска и не закрывает их за собой (тут ОС начинает течь, у неё ресурсы на это неризиновые, в какой-то момент она не даст открывать новые файлы, или оперативка кончится, будет развесёлый краш, потому что скорее всего безалаберный программист не закрывающий файлы даже не мог подумать что ОС ему фигу на открытие файла может показать). Потому всякие with open придумали в современных ЯП, чтоб люди не понимающие и не слышавшие даже про ulimit не творили дичь.

Ладно, все эти файлы, БД, это внешние ресурсы, там задействованны чужеродные средства к которым ни у компилятора ни у Valgrind-а доступа нет - ОС, СУБД, чужие программы, удалённые компьютеры и иже с ними. Путь наш горе погромист пишет YAGF. Он знает и про лимиты и про то как с файлами работать, а далее принимает гениальное решение - складывать файлы в оперативку. А дальше юзер хочет целую книгу обработать из 100500 больших и тяжёлых сканов. Формально память нигде не течёт, код её почистит когда всё загрузится и обработается. А по факту чтоб оно загрузилось требуется неизвестно большой объём оперативки, больший, чем объём обрабатываемых файлов. Никакой ленивой загрузки там нет, ленивое это у шарпистов, джавистов и прочих высокоуровневых языков, сишники так не пишут. Итог софт весело выжирает всю оперативку, затем приходит OOM killer и убивает зажравшуюся программу? Нет, не тут то было. Из коробки без специальных настроек OOM killer приходит и убивает те программы, которые не работают активно (т.е. софт который активно пытается выжрать всю оперативку читая диск занят с его точки зрения важным делом, вон как странички памяти выделяются и читаются, а какой-то dbus который стартанул 3 часа назад и вяло что-то делает раз в 5 минут неважен). Потом конечно когда OOM killer убъёт всё важное и останется только самое критичное то YAGF будет повержен (возможно, если зависание позволит ему отработать, почему-то на практике это не всегда так), то он убьёт и YAGF, правда юзер может оказаться уже без графики, половины драйверов и в голой консольке с ядром в обнимку. Но формально память не текла, алгоритм выполнял свою работу, просто памяти не хватило. Бывает.

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

на Си с условным valgrind можно писать код без утечек и битья памяти переполняющимися буферами?

Можно, но почему-то не пишут.

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

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

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

Ну, valgrind гарантирует на 99% отсутствие проблем с памятью. Без него тоже можно, но valgrind дает возможность все знать.

Нет. Valgrind работает только в рантайме, и проверяет запущенный код. Если какая-то функция не была вызвана в данной сессии запуска, она и не будет проверена.

Кроме того, под Valgrind вы можете запускаться на одних данных, и, к примеру, выхода за границы массива не будет. А в работе кто-то запустит на других данных, и тогда на, казалось бы, проверенном Valgring коде можно словить сегфолт.

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

один cargo уже серьезная заявка

Из-за него Rust без Интернета не работает, поэтому это моя главная претензия к Rust. Про unsafe я уже говорил, Си и так в прямых руках safe. Строки в Си вполне подходят под его концепцию языка без лишних типов. Абстракции идут лесом, параллельный код в Си спокойно и легко пишется в fork(). Вытесненить Си Rust не способен из-за своей ущербности. К тому же, в России писать на Rust легально только потому, что на него всем пофиг, а crates.io вполне может быть заблокирован РКН.

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

Проверку логической работоспособности программы ты все равно делаешь, вот и пускай программу под valgrind, увидишь все. А Rust принуждает писать тормозной safe код.

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

На другом языке тебе valgrind во время проверки работоспособности программы все расскажет.

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

Это не аккаунт-однодневка, а серьезный аккаунт, созданный не для вбросов.

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

Rust гораздо сложнее C (именно C, а не C++). К тому же, Rust нормальному программисту на нормальных языках Rust еще мозг ломает.

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

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

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

Просто пояснил. Потому что ваш комментарий можно понимать двояко.

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

Можно трактовать как 100% защита от любых утечек памяти, но не защищает от ошибок вида 2+2=5. Что тоже верно, но речь то не об этом.

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

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

peregrine ★★★★★
()

Зачем нужен Rust

Чтобы был язык с явно выраженной концепцией владения.

если на Си

А зачем нужен Си++, «если на Си можно»? Зачем нужен питон, «если на Си можно»?

на Си с условным valgrind

На ЛОРе в какого сишника ни ткни, о валграйнде не слышал. Большая часть сишного кода никогда не проверялась валграйндом.

можно

Можно - не значит, что так и будет.

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

Можно, но почему-то не пишут

Потому что нельзя.

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

на Rust не пишу и не собираюсь.

Откуда у тебя такое твёрдое мнение о расте? Хорошо его изучил в деле и забросил? Или просто так, протест ради протеста?

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

Чем на расте.

средства борьбы с ним есть

Валграйнд, как мы выше выяснили, тоже есть. Вам «средства есть» или писать программы так, чтобы автоматом всё пучком было?

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

На Си и безо всяких валгриндов можно писать софт без битья памяти.

Нельзя. Это принципиально неразрешимая для Homo Sapiens задача. Человек обречён совершать ошибки на определённом объёме кода. Даже отцы UNIX и авторы Си совершили множество грубых ошибок в коде UNIX.

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

Ну что вы, firkax никогда не совершает ошибок в своём коде.

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

Valgrind позволяет в этом удостовериться.

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

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

Ну, Rust тогда тоже не является гарантией.

Rust даёт 100% гарантию отсутствия порчи память в коде без unsafe на корректно работающем компьютере.

X512 ★★★★★
()
Последнее исправление: X512 (всего исправлений: 1)
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)