LINUX.ORG.RU
ФорумTalks

Тяжёлые рациональные препятствия использования Rust вместо C++

 


0

5
  1. Язык, ограничивающий работу с сырой памятью, сырыми аллокациями, сырым владением - уже есть внутри C++: это такое его подмножество, где аллокации заменены на make_shared-подобное, сырая память/ресурсы - на всякие там контейнеры/инкапсуляции/RAII, владение - на смартпоинтеры и подобное. Если я как-то «нормально» знаю C++, включая и «сырое» и «хорошее», то получается мне не надо осваивать никакой другой язык, чтобы начать пейсать не-говно. Зачем вводить в инструментарий что-то ещё, если такое уже есть? Отказаться от C++ в пользу Rust - это какой-то сложный манёвр, совершаемый гораздо проще не уходя от C++ и не ДОБАВЛЯЯ ничего нового, а только УБИРАЯ что-то: достаточно отказаться от ЧАСТИ C++, не изучая ничего нового вообще. Не пиши на C++ и пиши на Rust - это строго сложнее и страннее, чем «пиши на С++, но без сырых указателей и сырых аллокаций». Rust уже есть внутри C++, что моментально заненужнивает какой-то отдельный Rust. Более того, для начала можно даже не ходить так далеко как отказ от куска C++, а взять свежайший C++ компилятор, врубить последний стандарт, врубить все параноидальные warning по максимуму, приравнять их к ошибкам компиляции (-Werror) и компилятор подробно расскажет тебе, какая ты дура, пока не перепишешь нормально.

  2. Ясно, что Rust нужен, чтобы набрать много макак с рынка, которые ПРИ ЖЕЛАНИИ не смогут сломать память. Теоретически, вредное подмножество Rust (unsafe) в разы меньше, чем вредное подмножество C++. По задумке, ревьюить Rust - проще, ведь надо просто отследить наличие unsafe, а ревьюить C++ макака не может. Ну ХЗ - в статический анализатор кода запихнул правила забраковки кода с сырыми указателями в С++ и готово. Ну и последний совет из пункта (1) даст 100 лет строгача с конфискацией за малейшую попытку побега - всё как в Rust: небезопасненько: не соберётся.

  3. Но Rust не простой, под него макака не подходит изначально. Rust варится в такой же задротской атмосфере, как и C++. Для макак инструмент надо ещё более тупой - что-то типа JS, где «что ни написал - всё работает», а к памяти доступа ВООБЩЕ нет ни через какое волшебное слово (unsafe). Если надо, чтобы быстро исполнялось, то в бинарный код мы уж как-нибудь скомпилируем/оттранслируем любой кал - в пределе (в прекрасной России будущего) волшебные оптимизаторы LLVM разрулят всё неоптимальное, что макака написала. Транслируем любой макачий кал в строго корректный машинногенерируемый С++ и его скомпиляем.

  4. Даже из принципа нужности управления битиками в крайне узкоспециальной части проекта мне не нужно много гениев. А это «мало гениев» я наберу с рынка вообще без проблем - и по зарплате там не сильно важно в чём он там гений - C++, Rust. Rust-задроты даже больше просят из-за модности.

  5. Супер железное правило, которое не перебивается вообще ничем логически: если вы затеяли лабать что-то уровня собственной СУБД с транзакциями и запутались в циклических ссылках, то вы уже давно перешли порог гениальности, после которого вам уже вообще насрать на чём это пишется. Эпичный баг, который вы будете искать дольше суток, с утечками/циклическими ссылками/порчей памяти вы в этом большом проекте поймаете за жизнь 2 раза от силы, остальное проблемное какой угодно сложности вы в дебаггере отловите за пару часов и это будет случаться раз в полгода - вообще экономически не повод менять инструмент. Да и то, затрачиваемое время на поиск багов растянется только потому, что на вашем уровне развития вы не могли пройти мимо очередного срача «C++ vs Rust» и отвлеклись на 4 часа от дебаггера.

UPDATE

Мне накидали в панаму разумных куёв, поэтому давайте выведем топик на новый уровень. Напишите не суперсложный кусок кода на C++, который потенциально вызывает проблемы и тот же кусок кода на расте, который никак не бомбанёт.



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

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

Очередное С++/Rust. Не надоело уже?

Это не энергозатратно. Высрал и забыл.

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

Ну и в расте я тоже могу достичь ахтунга и че.

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

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

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

Если логика приводит к победе в сраче, то она норм. Иначе нужны контр-аргументы. Но пока срачовность сводится именно к такому: «в вашем C++ есть смартпоинтеры, но их надо ещё УМЕТЬ использоваться». Ну так а Раст вообще надо учить. Не проще зауметь использовать один uniq_ptr/shared_ptr в крестах, чем весь раст осваивать-то?

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

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

ну то-ли ты дурак непуганый, которому ни разу не приходилось УБ искать, то-ли очередной админ детсада, который программирование только на хабре видел. Но если ты до сих пор не понял, что килл-фича раста на которой все строится, это язык без GC и без UB, в отличии от С++ в котором описание UB занимает двадцать страниц стандарта, то ты совершенно точно дурак. А если ты понимаешь, но не ценишь усилий раста по избавлению от UB, то ты сказочный идиот.

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

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

Ну по дефолту считается, что ничем кроме чего-то типа Debian последней версии ты не пользуешься со всеми топовыми компиляторами gcc, clang, иначе зачем так несовременно жить. Если несовременно жить, то у нас и Rust ещё не изобретён.

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

ну то-ли ты дурак непуганый, которому ни разу не приходилось УБ искать,

Давно уже не приходится, когда я пишу на нормальном подмножестве C++. Я конечно могу взять ссылку на последний элемент контейнера, потом почистить контейнер и сходить по ссылке - да, это будет UB, но ловить его не сложно - санитайзеров и статических анализаторов всяких до жопы в наше время.

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

Но если ты до сих пор не понял, что килл-фича раста на которой все строится, это язык без GC и без UB,

Вот надо подумать об этом!

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

Макаки это все что не с оратором.

Я, к примеру, писал и на ассемблере и на С и на С++, но запикался и перешел на Java, C#, Scala, Javascript, Typescript, golang…

Соответственно я вэб-макака, жабо-макака, С#-макака и так далее.

Как правило, так пишут от зависти, так что это дожно тешить ЧСВ и того кто называет других макакми и тех кого называю, так как понимаешь, что тебе завидуют ;)

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

это язык без GC

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

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

лучше бы

Как же они так то, забыли спросить совета главного в мире специалиста по инвестициям в технологии во что им инвестировать! Вот главная ошибка раста - не посовещались с @ox55ff

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

Тем, что работа с памятью — это побочный процесс написания бизнес-логики. Чем меньше тратишь на это времени, тем лучше. Во всяком дне вроде сишки ты не просто тратишь время на работу с памятью, она тебе ещё и в штаны серит багами и уязвимостями. ЦПП в этом контексте — огромный шаг вперёд, хоть и недостаточный.

ox55ff ★★★★★
()

There are more youtube videos then lines of code in rust in production. ©

beastie ★★★★★
()

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

Вот потому бизнес вместо крестов возьмёт пистон - лучше быстро слепить и зарабатывать чем пару лет пороться с указателями и получить на выходе сегфолт

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

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

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

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

Да. Ну так у тебя в обоих этих случаях нет траты времени на «вопросы с памятью»:

  1. Есть garbage collector. Жрём и срём во всех углах, GC приберётся.
  2. Нет GC, всё уничтожается при выходе за scope. Сри сколько влезет, покинешь функцию или кончатся ссылки на что-то - оно сдохнет сразу же (случай Rust, как я понял).
lesopilorama
() автор топика
Последнее исправление: lesopilorama (всего исправлений: 1)
Ответ на: комментарий от lesopilorama

Нет GC, всё уничтожается при выходе за scope.

Враньё. Это работает только для объектов на стеке. Умные указатели на основе подсчёта ссылок ломаются на циклических связях. Нужно вручную это разруливать.

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

Враньё. Это работает только для объектов на стеке. Умные указатели на основе подсчёта ссылок ломаются на циклических связях. Нужно вручную это разруливать.

Возможно я туп, но ни разу в жизни с этой проблемой не сталкивался, чего только ни пейсал. Указание на эту проблему всё время для меня выглядит каким-то надуманным, как будто из compurer science выдернули теоретическую задницу и размахивают ей.

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

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

Я так и написал

Нужно вручную это разруливать

Тебе нужно будет в нужных местах заменить shared_ptr на weak_ptr. Никакой автоматизации.

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

Сборщик мусора самый продвинутый способ управления памятью.

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

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

Дружище, ты пришёл попи"""еть на провокационно-философские темы? Давай ты напишешь письмо Торвальдсу, так мол и так, дорогой Линус, я тут почесал бороду с треском и меня осенило - а почему бы не писать ядерный код на Джаве (голанге, эйфеле и тд, на твой вкус)? И потом поделишься соображениями, что тебе ответит патриарх.

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

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

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

Материшься и прикрываешься авторитетом Торвальдса. Аргументы то будут?

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

Заметь, я ничего не говорил про языки. Это ты сам додумал, наверное прикинул где есть GC. Надмозг. Но GC это штука, которая не привязана к языкам.

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

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

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

Это вопрос к конкретному алгоритму GC, а не концептуально к идее. Если текущие алгоритмы не подходят, то нужно заниматься исследованием новых, а не трахаться на изобретения всяких боровов, которые работают только в однопоточных helloworld’ах.

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

Это вопрос к конкретному алгоритму GC

GC это штука, которая не привязана к языкам.

Чем модуль ядра принципиально отличается от прикладной программы?

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

прикрываешься авторитетом Торвальдса. Аргументы то будут?

Я ничем не прекрываюсь, я тебе прямо и откровенно говорю, что обсуждаемый в этой ветке Раст в качестве языка для ядра Линукс Торвальдсом таки одобрен. Это твоя задача почесать репу и подумать, как так получилось.

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

слыш, теоретик

Ты просто хамло. Какая тебе конкретика нужна? GC настолько хорошо справляется с управлением памятью, что даже вебмакаки умудряются не обсираться с ней. Чего не скажешь о дедах с 30 годами опыта в разработке ядра, которые регулярно дрищат под себя на очередном use-after-free. GC полностью, тотально решает проблему и при этом не заставляет превращать свой код в говно с кучей goto cleanup.

Я ничем не прекрываюсь

И буквально в соседнем предложении

Раст в качестве языка для ядра Линукс Торвальдсом таки одобрен

Ахах, опять прикрылся. Ты правда не замечаешь? Раст хороший, потому что Торвальдс одобрил? А если он скажет, что ошибся и выставит растоманей на мороз, то будешь качаться с линией партии? ;)

ox55ff ★★★★★
()

Мне накидали в панаму разумных куёв, поэтому давайте выведем топик на новый уровень. Напишите не суперсложный кусок кода на C++, который потенциально вызывает проблемы и тот же кусок кода на расте, который никак не бомбанёт. Может кто?

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

Уровень макака:

#include <iostream>
#include <string>

const std::string& getGreeting() {
    std::string greeting = "Привет";
    return greeting; // Возвращаем ссылку на локальную переменную!
}

int main() {
    const std::string& ref = getGreeting();
    std::cout << ref << std::endl; // Неопределенное поведение
    return 0;
}

fn get_greeting() -> String {
    let greeting = String::from("Привет");
    greeting // Возвращаем владение строкой
}

fn main() {
    let greeting = get_greeting();
    println!("{}", greeting); // Все работает корректно
}

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

Напишите не суперсложный кусок кода на C++, который потенциально вызывает проблемы

std::string_view foo(std::string_view s);

Остальное не сложно дописать.

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

return greeting;

И на этом моменте код падает без всякого ub.

return std::ref(greeting);

Это код просто работает без всяких уб.

=

А вот эта шняга в расте - это не копирование значения, а аналог std::move в С++.

Ygor ★★★★★
()

То что там есть split уже делает его лучше… ну по крайней мере для моих целей

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

А я где-то про копирование писал?

Ну и пример высосан был мной из пальца.

cocucka_B_TECTE
()
Ответ на: комментарий от lesopilorama
#include <memory>
#include <iostream>
#include <functional>

static std::vector<std::unique_ptr<int>> storage;

int main() {
    auto p = std::make_unique<int>(42);

    auto fn = [p = std::move(p)] () mutable {
		std::cout << *p << " " << storage.size() << std::endl;
        storage.push_back(std::move(p));
    };

    fn();
    // fn();

    return 0;
}

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

В расте такого не напишешь.

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

Зато хоть какая-то личная жизнь, сипипиры и о такой мечтать не могут.

ponchik-2
()
Последнее исправление: ponchik-2 (всего исправлений: 1)
Ответ на: комментарий от dataman

Интересные личности активировались.

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