Сегодня про C++, Rust и вообще почему я продолжаю кушать кактус
Тред первый.
Как все четкие пацаны, я начинал с паскаля. Но не с турбо или фри, а с @PascalABCNET. Тогда еще без .NET (потом я узнал, что эта инкарнация паскаля уже пару лет как была мертва).
Но потом ушлый десятиклассник смекнул, что на паскале писать олимпиадки не удобно (ибо sort нет)
Тогда я решил "выучить" что-то серьезное. На выбор были Java или C++.
В Java с порога было множество непонятных ключевых слов, и вообще stdin парсить не удобно... А C++ — зашибись. Изи. Выбор очевиден!
Параллельно какой-то диванный стартапер предложил освоить php и html и пилить с ним сайтики и зашибать миллионы: он бы осваивал css, а я бы пыхал.
Мне не понравилось. Но много разных html тегов я выписал в тетрадку...
На первый курс уже поступал со "знанием" плюсов. Они мне так нравились, так классно.
Так бы с одними плюсами и остался, если бы умный человек не шепнул: на олимпиадках важно быстро решить задачу, чтоб не тратить время на простые штуки, полезно иметь в арсенале Python или Ruby.
В универе было много курсов "связанных" с C++. Правда, сути они не раскрывали и подвоха я не видел.
Так что к четвертому курсу был уверен, что буду работать на плюсах и вообще умею и практикую. Смартпоинтеры знаю, мьютекс лочить умею, чего еще надо?
Любимый язык!
А потом я пошел работать... И че-то все падает, все через жо, память течет, треды крашаться. Падение на выходе — вообще любимая тема.
Кажется, это немного не тот C++, которому меня учили...
Сломанные абстракции. Неявно умирающие объекты. Безумие инициализации...
Нас учили слишком радужному C++. Которого достаточно, чтобы сделать что-то игрушечное, ну или в олимпиадки поиграть.
Но обратного пути нет. Надо было работать работу, ничего другого я все равно не знал
Ну ладно, давайте откроем неиссякаемый источник безумия: (Я в процессе такие восхитительные вещи понаходил) Один лайк — один пример UB на C++!
Стал изучать, как со всем этим бороться:
isocpp.github.io/CppCoreGuideli…
Начал ковырять различные виды UB и как их опознавать.
Тут даже старенький тред в твитторе есть:
twitter.com/Nekrolm/status…
Чем больше ковырял, тем больше ужасался и восхищался. Победить это невозможно, только возглавить.
Из удобного языка для меня C++ превратился в неповоротливое чудовище, при использовании которого нужно просто угорать, чтобы не сойти с ума.
Я люблю C++, потому что искать и расковыривать весь этот треш — забавно. По крайней мере для меня
Буквально час назад обнаружил лютый static finalization order fiasco, пофиксил и еще минут 15 писал развернутый комментарий, почему этот код нельзя трогать.
Я люблю C++, за то что среди огромной кучи известной массы и в нем есть что-то хорошее: метапрограммирование шаблонов и constexpr. Там просто UB нет. Почти нет...
Но я ненавижу C++, потому что я вынужден думать об огромной куче деталей, решая простейшую задачу.
А также писать лютое количество велосипедов (обязательно с ошибками), вновь и вновь решая задачу, которая решена везде. Кроме C++.
Я ненавижу его, потому что не могу просто взять чужое готовое решение. У нам совершенно отвратительная модульность и изоляция. Если я втащу что-то — обязательно произойдет какая-нибудь трешнина при линковке.
Ненавижу, потому что у нас никогда не будет фич, которые нам обещают. В нормальном виде.
Неделю назад я видел, как прекрасный стектрейс будущего C++23 внезапно из opencv ведет в сетевую библиотеку Poco, от которой он не зависит... Безумие. А почему? А потому что линковка...
Возникает вопрос
Во-первых, мне за это платят.
Во-вторых, расследование UB — это всегда детектив с погонями и приключениями. Моя работа не рутинная.
В-третьих, множество историй, которые можно рассказать. А рассказывать всякую дичь я люблю.
В-четвертых, я не упорствую 🤡🤡🤡
Поскольку победить C++ невозможно, я решил придерживаться стратегии спикеров с плюсовых конференций: рассказывай всем, как тут круто и здорово, а сам пиши на чем-то другом
Пока получается не очень — писать приходится, но не новый код. Последний год я на плюсах в основном правил старый код.