← All posts tagged C++

lovesan

habrahabr.ru
Есть пара вменяемых мыслей, но в основном — просто оправдания "чсв" плюсоздрота.

Вот это вот особенный пиздец:
-----------------
Язык C++ очень многолик и вариативен, что дает огромный простор для творчества. «Искусство программирования» — фраза, которая часто встречается в статьях и литературе по C++. Но насколько это хорошо? Разработка программного продукта отдельными разработчиками начинает походить на соревнование в мастерстве между самими разработчиками… Создаются конструкции и взаимосвязи, которые становятся понятными только редкому числу «опытных» программистов, знакомых с передовыми тенденциями развития языка.
--------------------

Бля, да 99% "конструкций и взаимосвязей" это костыли, которые окостыливают и оборачивают плюсцы до чего-либо вменяемого.

Я, вот, например, как-то давно, помнится, сел писать на плюсцах какие-то мелочи на тему толи 2д, толи 3д графики. Сидел вечера два, потом посмотрел, что я написал, и оказалось что до графики нихрена то и не дошло еще, зато я успел нагородил кучу классов для управления памятью, для менеджмента ресурсов, и до кучи еще оберток над MFC(!!! ладно бы еще над голым winapi, было бы простительно, но так обернул половину плюсового же фреймворка). Меня потом долго мучила совесть, какой же я долбоеб, и какой херней страдал. Мучила до того самого момента, как я впервые увидел "продакшн-квалити" код на плюсцах — это был такой же адский пиздец, того же рода, какой я в те два вечера написал, но только еще пиздецовее и навороченнее. Что еще интереснее, позже я понял, что такое — далеко не редкость, а совершенно стандартная ситуация в проектах, где разработка идет на С++. Автор статьи тоже об этом упоминает, кстати.


C++ — совсем не язык для "опытных" и "продвинутых" программистов, каким его любят выставлять задроты. Это язык для ограниченных задротов. Любовь к C++ это уже маркер.

Кстати, на закуску, поржать:
habrahabr.ru

lovesan

На самом деле, этот миф имеет примерно те же корни, что и миф о том, что "C++ — язык для продвинутых программистов". Ну то есть, корни растут где-то в районе первых двух курсов провинциальных вузов.

lovesan

Сразу видно, никогда дизассембла лиспового не смотрел: #1286774/6

Вообще, я об этом, кстати, как-то уже писал.
Ну типа, у всех, кто C++ хоть сколько-нибудь симпатизирует, присутствует какая-то долбоебическая, практически святая, уверенность в том, что "C++ это же быстро!". Типа, хоть какой говнокод не пиши, хоть какие костыли не навешивай, все равно будет быстро — "это же C++, C++ конпелирует в такой-то машкод".

Эту долбоебическую уверенность не отбить ничем вообще.

Даже фактами, типа того того, что я недавно привел — с аллокатором+shared_ptr vs gc.
Будут протестовать, кричать, скакать ебанашками в комментах "да это все херня, надо было просто вот тут поддрочить, вот там, а ваши тесты говно"(они почему-то не берут во внимание, что тот же SBCL тоже можно надрочить таким же образом — вплоть до использования inline assembly).

Не знаю, может это как-то связано с какими-то повреждениями мозга, которые C++ наносит.


Erik Naggum об этом тоже, кстати, писал:
loper-os.org
См. там "On how C 'feels fast'"

lovesan

Существует два вида сложности.
Я сейчас про программное обеспечение, но вообще это, естественно, можно перенести и на другие области.

Первый вид сложности — сложность обоснованная, а второй — сложность дутая.

Отличить их, в принципе, легко, но не все на это способны, и почему — мне лично непонятно.

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

Пример технологий, которые сложны обоснованно — WinAPI, Common Lisp, современные РСУБД.
Если мы от этой сложности отказываемся, мы получаем такие кривые куски говна, как Linux, Python и NoSQL.
Если же нам нужен тот функционал, который первая тройка технологий имеет, например:
1) унифицированный доступ к ресурсам, интероперабельность между компонентами, обратная совместимость
2) неотделимые от языка макросы, компиляция в рантайме, производительность, продвинутые объектная система и протокол обработки исключений
3) производительность, надежность, масштабируемость
то мы вынуждены эту самую сложность, которую эти технологии вносят, терпеть, и обойти это никак не удастся, никакого лайфхака в этом плане нет — все аналоги с подобной функциональностью будут как минимум не проще в использовании(а скорее всего и сложнее, потому что приведенные технологии отточены многими годами).

Самый яркий пример дутой сложности, который я знаю — язык C++. Все неудобства, которые он вносит, можно убрать и не потерять совершенно ничего, и примеров тому — от Obj-C до того же Common Lisp.

Так я вообще к чему?
Make everything as simple as possible, but not simpler.

lovesan

Сравнил производительность сборщика мусора из SBCL и boost::shared_ptr

Подробное описание теста, с полным кодом программ, дизассемблами и "нотариально заверенными скриншотами":
love5an.livejournal.com

Результаты для "умных указателей" вышли печальные — они тормозят. Причем тормозят просто пиздец.

lovesan

Вот что еще удивило, так это реплики типа "да, C++ говно но автор ругает и полезные его фичи".
Или "ручное управление памятью это не баг а фича".

Так это самое, я как раз рассмотрел проблему комплексно — ручное управление памятью это нормально в контексте Си.
Но извините, когда у нас и объектная система, и исключения — от ручного управления памятью один только вред.

Я специально даже разделил вывод на два пункта.
Ну т.е. например — из-за того, что в C++ вообще присутствуют исключения, он неприменим в системном ПО, а из-за того, что они такие убогие — и в прикладном.

Нельзя из C++ "вычленить какие-то фичи и только ими и пользоваться", это известное заблуждение.
Если мы пишем на C++ — мы пишем на C++ и должны все его косяки учитывать, в каждой строчке кода на нем.
Только вот выходит, что со всеми его косяками, писать на нем решительно невозможно, какую область не возьми.

lovesan

C++ это такой новый COBOL.

Им надо первокурсников пугать — типа вот будете дрочить и бухать вместо того, чтобы изучать погроминг, выпуститесь — пойдете поддерживать легаси говнокод на C++

Я удивлен еще, сколько бугурта пост вызвал — до сих пор в комменты в жж приходят, срут там. Странные люди.

lovesan

Существует замечательный сайт C++ FQA Lite, в котором подробно и обстоятельно объясняются недостатки C++.
yosefk.com

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

Поэтому я решил составить свой список, в котором четко и ясно объясняется, почему же все-таки я считаю C++ таким страшным говном, которое надо закопать. В списке всего десять пунктов, все четко, ясно и по делу:

love5an.livejournal.com

По причинам 3, 4, 5, 9 и 10 C++ совершенно неприменим для системного и низкоуровневого программирования.
А по причинами 1, 2, 5, 6, 7, 8, и, опять же, 9 и 10 — и для прикладного.

У C++ нет области применения. C++ протух и умер. Хватит насиловать труп!

lovesan

По мотивам linux.org.ru

Microsoft, чтобы решить проблемы управления памятью в C++, накатала в своем COM/OLE килотонны костылей — свой аллокатор, с возможностью отслеживания его вызовов(IMallocSpy), счетчики ссылок в интерфейсах, все эти SAFEARRAY и BSTR и пр., написала кучу гайдлайнов по их пользованию, в которых комментируется каждый мелкий момент.

И в итоге что? Забила болт на все это говно, вместе с C++ и толкает .NET
А почему? Какая у .NET отличительная черта?

Потому что C++ говно, и потому, что проблемы с управлением памятью в нем не решить никак.

Но нет же, все равно, по-прежнему, каждый 17-летний(а то и 25+летний — бывает, да) долбоеб(тысячи их, особенно в бСССР почему-то), наговнокодивший парочку хеловордов на плюсцах думает, что это все фигня, главное писать правильно, и что он-то уж точно будет так, правильно, писать, и что ему-то уж точно все эти проблемы C++ по-плечу. Даже MS не по плечу, а ему по-плечу(ну хуле, в MS то индусы одни, это все знают, там только операционные системы всякие умеют писать, куда MS с этой мелочью до него, великого безупречного спеца на C++ и до его хелловордов).

lovesan

Еще года полтора назад я думал, что самый большой пиздец в C++ это неуправляемая память(и все что с этим связано, типа велосипедные аллокаторы на каждом шагу). Но на самом деле, гораздо больший пиздец это плюсовая объектная система, вкупе с плюсовыми исключениями. Без приблуд типа COM или Qt на C++ писать решительно невозможно.

lovesan

Мысли о трехмерном гуе на лиспе, краткое описание непрямоугольных окон в Windows, а также пример того, как с помощью Direct3D 10.1 рисовать не-прямоугольное окошко(пример на C++), которое ведет себя как настоящее окошко(с учетом формы).
love5an.livejournal.com

lovesan

Кстати, в коде, описанном в предыдущем постинге, на конструктор копирования я забил хуй. Потому что библиотечка — мелкая поебень для личных нужд.

Однако, для чего-то сложнее хелловордов с этим надо обязательно что-то делать. Но, фишка в том, что ничего с этим не сделать. Конструктор копирования, и вообще, копирование объектов целиком — это абсолютный, невыразимый, пиздец, который гарантирует теоретически бесконечное количество проблем, и от которого не спасет ничего и никогда. Ни private, ни protected, ни отпиливание рук программистам на плюсах, ни кровавые жертвоприношения языческим богам.

lovesan

Все-таки, только пописав немного на плюсах начинаешь понимать, как охуительно прекрасна объектная система Common Lisp.

Накатал тут, для своих экспериментов с Direct3D и Direct2D, небольшую библиотеку-надстройку над winapi на плюсцах, которая абстрагирует Топлевел-окошко в event-driven стиле.

Планирую ее потом переписать на коммонлиспе, сделать евенты полноценными, и вообще, расширить и улучшить всячески, разными контролами и так далее, до подобия WPF.

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

Например, кто догадается — зачем там в классе Window метод Init()?
Второй вопрос — какие последствия это влечет в контексте удобства пользования классом?

SimpleWindows.hpp
pastebin.com

SimpleWindows.cpp
pastebin.com

lovesan

Вот это ебаный пиздец на 555 строчек — минимально необходимый код на C++ для отрисовки вращающегося кубика с помощью Direct3D 11. Блядь, это просто пиздец. Ну вдуматься — какой-то ебучий вращающийся кубик и какой-нибудь простенький шейдер! 555, блядь, строчек! Кто скажет, что C++ — удобный инструмент, тот пидарас. pastebin.com

lovesan
C++

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