cplus-plus.ru logo
Мы переехали на cplus-plus.ru
Главная страница В закладкиО сайтеКарта сайта
Хостинг от uCoz
Добавить в закладки

Меню сайта

Полезные ссылки

Наша рассылка
Подписаться на рассылку
"C++ : cplus-plus.ru :
Рассылка статей C++"


Друзья сайта
alsproject.ru Выбор выходного разделительного конденсатора

Приветствую Вас, Гость · rss 24-Апр-2024, 00:23
Главная » 2011 » Январь » 19 » Еще 5++ причин ненавидеть С++
14:52
Еще 5++ причин ненавидеть С++

Еще 5++ причин ненавидеть С++
Признаюсь Вам — я ненавижу язык С++. Он просто выводит меня из себя.

Когда я встречаю эти три символа в заголовках статей на любимых ресурсах — еще терпимо, когда вижу в подопытном проекте файлы с расширением .cc и .cpp, .hh и .hpp (и еще .hxx и .cxx, у-ух, тысяча чертей!) — уже злюсь, а уж когда приходится читать, или, еще хуже, писать на нем — да я почти что истекаю ядом!

Что ж, попробую заронить и в Вас искру священной ненависти.

0. С — это Вам не С с плюсами!

  Ненавижу, когда код на чистом С, который сами Патриархи Керниган и Ритчи признали бы созвучным их Светлому Языку, кощунственно обзывают «С++» и бездумно заключают в файлы с одним из вышеуказанных нечестивых расширений, и, что самое страшное, и компилируют тоже как С++. Зачем?

1. С++ — это Вам не С с плюсами!

Это более чем весомая причина для ненависти. Многие авторы пособий, те самые отступники, кто продвигал язык в 90-е, утверждали, мол, что С++ — это «улучшенный» С, что можно, якобы, почти безболезненно перейти от С к С++!

Какой удивительный бред! Куда можно улучшить язык, который можно вручную транслировать в ассемблер и обратно (да, да, каюсь, ну приукрасил слегка)? Но им, похоже, удалось убедить в этом программирующие массы. В результате — не надо далеко ходить за примерами кода, который никоим образом не использует ни ООП, не нуждается в киллер-фичах С++, но от скудоумия ответственных лиц пишется на нем — а в сухом остатке мегатонны кода, которые замечательно бы смотрелись на суровом своей чистотой ANSI C.

Не стоит и говорить, что в таком же стиле любят воспитывать будущих программистов высшие учебные заведения. Форумы переполнены вопросами от нерадивых студентов, которые используют С++ для сугубо процедурного кода только из-за того, что в нем можно объявлять переменные в любом месте блока, а не в начале. Как это Вы собираетесь высекать свои мысли в граните кода, если не знаете на блок вперед, какие переменные Вам потребуются?

«Новые» возможности С++ разлагают неокрепшие умы юных программистов.
По тлетворному влиянию С++ может поспорить с Delphi/VB в 90-х и PHP в 2000-х.

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

Лично я вижу три пути обучения программированию:
1) академический — от основ Computer Science — к функциональному, логическому и метапрограммированию;
2) инженерный — от аппаратных основ и Ассемблера к С и высокоуровневым языкам, параллельно изучаются мат. основы;
3) ремесленный (т.н. «быдлокодинг») — no comment;

Даже профессионал в силу мифологичности человеческого мышления обычно идет по списку снизу вверх, потрогав Бейсик/Паскаль/(Лого) в детстве, в отрочестве дойдя до понимания алгоритмов, работы с памятью, железом и средствами ОС, а в институте изучив, скажем, Лисп и Пролог, уже получает все средства, чтобы проникнуться, наконец, малым Дао на своем пути.

Но вот прожить весь путь с одним языком?

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

2. Вы все еще знаете, что под капотом у Вашего компилятора С++? Тогда мы идем к Вам!

Язык С обязан был своей всемирной популярностью двум основным факторам:
1) идеологическая и синтаксическая целостность;
2) прямая связь с низкоуровневым программированием;

Если Вы видели или даже трогали формальное описание грамматики языка С, то Вы понимаете, о чем я. Если Вы видели ассемблерные листинги своих и чужих программ на С, хоть при трансляции, хоть в дизассемблере и отладчике, то Вы понимаете, о чем я. Если Вы, черт побери, прочитали документацию к Вашему компилятору и компоновщику и способны хоть иногда угадывать, какие оптимизации применяются к Вашему коду и как он лежит внутри исполняемых модулей — Вы на коне! А не, извините, под ним.

Шаблоны(!), позднее связывание, RTTI… Все это потребовало новый уровень абстракции, еще больше отдалило код «на бумаге» от кода «в железе». Да на счету одного только безобидного name mangling миллиарды сожженных нейронов и тонны сточенного о клавиатуру эпителия!

Отладка, реверсинг и ручная оптимизация «приплюснутого» кода требуют стойкости в истинной вере и прямых рук, но где, где их найти, когда юных «плюсовиков» развращают с малолетства?

В результате готовы «постигать» С++ люди, которые не знают, в какую сторону растет стек на их машине. В стародавние времена, когда правоверные программисты на С были в почете, мне рассказывали, таких казнили еще во младенчестве при помощи шнура от клавиатуры, а те, кто выжил, либо укреплялись в вере, либо с позором изгонялись к быдлокодерам, но и в изгнании сияли они отраженной искрой истинного света.

А С++-то быдлокодинга совсем не терпит, но как манит, манит его адептов!

3. Парадигма повержена? Да здравствует парадигма!

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

Но сама идея того, что можно из императивного языка сделать нестрогое подобие объектно-ориентированного, а затем сторонними библиотеками придать черты функционального, а потом использовать «это» как мультипарадигменный язык, порочна и б-гомерзка. А как реализуются эти нестройные расширения? Заглушки, и снаружи, и внутри. STL и его собратья хоть и придают языку (и среде) необходимую «мощь», но никак не целостность, и неотъемлемые теперь уже свойства языка реализованы и оформлены совершенно различными способами. Тогда уж можно и на голом С с препроцессором накрутить что угодно, что успешно и делается.

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

4. Синтаксис С++ убог

Все синтаксические изыски С++, по сравнению с С, меня лично всегда заставляли мучительно подозревать за ними наличие маниакального набора директив препроцессора. Хотя, времена, когда так и было (но очень недолго, когда код С++ перед компиляцей преобразовывался в С), безвозвратно прошли еще до распада СССР.

Посмотрим правде в глаза — то, как синтаксис С++ выражает его идеологию, сегодня вызывает ужас. Чтобы сделать код С++ читаемым, уже недостаточно прямых рук автора, нужна подсветка синтаксиса! А чтобы прочитать код, использующий STL или boost — буйство угловых скобок (про стандарт C++0x лучше умолчим), удвоенных двоеточий и преисполненных смысла слов — придется пожертвовать частью мозга, которая, при использовании более разборчивых в друзьях языков, могла бы заняться и более полезным делом.

Если бы С++ с самого начала родился бы без буквы С в своем названии, возможно, претензий к синтаксису ни у кого бы и не было.

5. Хотите ООП — так возьмите его живым!

А не довольствуйтесь метафизическим сношением с подобным Франкенштейном.

No, srsly. Вы вчера-сегодня выбрали С++, именно чтобы снимать сливки с использования ООП в своем проекте? ООП — это круто, Вы хотите найти идеальный баланс между проектированием, кодированием и (о, б-же!) сопровождением, начитались статей про модные в 90-х концепции? Передумайте, пока не поздно. На дворе не 95-й год, когда это еще прокатывало.

Есть, есть ниша, где С++ идеален и замены ему пока нет — это функционально богатые, монолитные проекты, требующие наивысшей производительности (и в которых ну совершенно нет места быдлокодингу).

Это топовые игры, браузеры, офисные и графические пакеты, некоторые IDE. Там, где нельзя обойтись простыми интерфейсами между модулями системы, где приходится постоянно работать не с сырыми данными, а относительно сложными, нафаршированными логикой, структурированными объектами, там, где можно выделить ядро, требующее максимума производительности, но нельзя без потерь отделить его от остальной системы.

Но С++ уже не место в мэйнстриме!

  Есть, к примеру, замечательный язык Java, который обладает и ясным синтаксисом, и всеми необходимыми возможностями, да еще и транслируется в байткод удобоваримого формата. Есть не менее замечательный язык C#, который не отвечает за грехи своего предка, да и намного толерантнее, чем С++, к небрежному коду. А для промышленного языка это более чем критично. 

С++ же обладает воистину удивительной особенностью — программист может обходиться процедурным по сути кодом, но он вынужден выбирать С++ вместо С или любого другого языка, только чтобы использовать элементы существующих industry-standard ООП-решений — например, обращаться через С++ — интерфейсы к стороннему коду и библиотекам.

За примерами далеко ходить не надо — в стеке технологий из Редмонда — DirectX и ATL/MFC. Доколе? Зачем? OpenGL и голое WinAPI отлично обходятся без плюсовых «наворотов» (Я умолчу об именах серьезных проектов, которые используют С, включая ядра всех популярных ОС и драйвера для них, популярные СУБД, полные тулчейны для множества языков, графические оболочки и даже, Вы не поверите, прикладное ПО!).

Нет, действительно достойные ООП-библиотеки и фреймворки существуют, взять тот же Qt, но в целом приятного мало — «ООП ради ООП» торжествует среди библиотек и превращается в «С++ ради С++» при выборе технологии для проекта, а хотелось бы думать, что мы — не те школьники, которых насильно обучили Delphi, потому что на нем окошки рисовать проще, или потому, что окошки можно рисовать только на нем.

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

Вместо заключения

Я встречал мнение, что сила С++ — в сочетании его гибкости и нестрогого его соответствия канонам ООП, по сравнению с той же Java. Мол, не хотите — пишите вроде бы как бы и на С, а где надо — «раззудись плечо» и т.д.

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

То, что создатели С++ уже 20 с лишним лет пытаются отвечать желанию трудящихся усидеть на трех стульях сразу и накрыв одним языком всю  предметную область, может быть поводом для уважения, но никак не должно влиять на выбор идеального инструмента для решения конкретной задачи.

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

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

Если в наших с Вами силах своим выбором направлять движение всей отрасли, то пусть нами руководит разум, а не привычки и эмоции.
Источник: http://habrahabr.ru
Категория: Новости | Просмотров: 1236 | Добавил: FazaNaka | Рейтинг: 1.0/2
Всего комментариев: 3
3 Antony  
1
К каждому языку программирования можно писать о сотнях причин ненависти и посвящать оды о том, какой же он ужасный и мерзкий.
Если кому-то не нравится С++ - значит переходите на другой язык или вообще сваливайте из программистов.
И воздух будет чистый, а небо - ясное. Аминь.

1 Надежда  
1
Лучше бы не хаял, а написал бы о своем любимом языке программирования.

2 FazaNaka  
0
Есть 2 группы людей, те которые выбрали этот язык, и те кому сказали - НАДО biggrin

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]