Почему Линус не любит C++?

В виду недавнего топика про "Ц с классами", в комментариях была ссылка на письмо Линукса, где он отвечал на вопрос «Git на C++» и грубо критиковал C++.


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


Что по кроссплатформенности — точно не скажу, программы на С++ требуют дополнительную libstdc++. Но, кажется, это не проблема.


Так почему ярые фанаты С так не любят С++?
  • Вопрос задан
  • 21000 просмотров
Пригласить эксперта
Ответы на вопрос 6
@lesha_penguin
<Мысль_вслух>Если существует специальный «ад для говнокодеров», то наверняка, одним из самых жестких наказаний в нем была бы отладка того говнокода, который, который в С++ получается по принципу «делается более просто и изящно».</Мысль_вслух>

Если начинать «от сотворения мира»:

1) Как известно C++ был был придуман Страуструпом, мы не будем умалять его «ученные регалии» (ученных-то наград куча, но они по сути единственное чего «добился человек», кстати, 90% прямо или косвенно за c++). Однако, заметим, что Страуструп — как раз есть пример «чистого теоретика» (в отличии от «практика»-Торвальдса), т.е. является человеком за свою жизнь не принимавшим участия в разработке ни одного серьезного реального программного проекта. По сути компилятор c++ — единственное более-менее практическое дело в его жизни. Соотвественно о том с какими проблемами приходится сталкиваться в реальном «software development-е» с «высоты его ООП-теорий» он имеет весьма посредственное представление.

2) Как верно заметили, в упомянутой статье, изначально это был как раз «Це с классами», т.е. изначально НЕ БОЛЕЕ ЧЕМ «академическая» попытка навернуть на C отдельные элементы «обьектности» (типа, Smalltalk обьектный, а давайте попробуем сделать такое на более низком уровне). Кстати, могу Вам сказать, что с C++ я впервые познакомился в 80-90е годы, когда языком «ученной среды» был Фортран, языком «системщиков» Си, а для обучения «всех непрофильных специальностей» основам программирования использовались Basic и Pascal. Да, но правда «тогдашний C++ 80» отличался от нынешнего — он реально производил впечатление «просто прикольной поделки» (на память помню, что например, тогда не было и половины привычного функционала например таких вещей как всяких «reinterpret_cast-ов» или namespac-ов.). Кстати, да… барабанная дробь… НЕ БЫЛО STL!!!

3) Наверное Страуструповский «Це с классами», наверное так бы и остался в списке «прикольных поделок» в аналах истории, если бы не одно обстоятельство: «ВНЕЗАПНО» произошел «софтверный бум», соотвественно: a) «элитных» «олдскульных» программистов стало резко не хватать b) «требования к качеству софта» резко упали c) понадобилось средство для генерации достаточно низкоуровневого «говнокода в промышленных масштабах». И как ни странно, (ага, угадали, именно с появлением в C++ STL-я) C++ так и не избавившись от своих «академических болячек» был брошен в пучину «мейнстрима».

4) Вам говорят истинную правду, когда говорят, что «C++» это маркетинговое название для «Це с классами». Да, это так. И можно сказать, к великому сожалению, он нашел свою рыночную нишу. (Сейчас любой дурак может легко «освоить C++ за 21 день (с бустом и стлем)», при этом не умея даже внятно ответить на простой вопрос «Если ты такой умный, обьясни тогда почему, c$k@, у тебя программа течет по памяти и падает», (про такие «неполиткорректные вопросы», как «зачем писать 100 строк на то, что пишется в две-три», мы вообще тактично молчим, а то, мало ли, может у человека «сдельная зарплата» за количество строк ;) ), зато с видом крутого Беара Грилса можно обсуждать такие «высокие материи» как «Паттерны» и «чистый ООП»).

5) И к самому большему сожалению, в некоторых случаях альтернативы нет. Да, Я еще не встречал ни одного программиста, который в действительно реальной разработке софта активно использовал бы C++ и при этом от него бы не плевался. У C++ есть «Огромный ПЛЮС» — Его Мультипарадигменность! По-сути это его единственный плюс, позволяющий «не уйти в дебри» (типа попыток запихнуть «main()» в обьект только ради «идеи чистого ООП»)!

6) А теперь, после такого «исторического» вступления еще раз перечистайте внимательно письмо Торвальдса, высказывание человека который лучше многих «теоретиков чистого ООП» знает как это оно «на собственной шкуре» разрабатывать сложные системы, и комментарии от хабраюзеров, которые «на живой практике» знают «почем фунт лиха» в топике. Под большинством утверждений я лично бы поставил свою подпись золотыми буквами.
Ответ написан
mejedi
@mejedi
Проблема не в качестве языка, а в качестве программистов.

Не любят вот почему:
1) Сферический C++ программист не знает структур данных — за него все делает STL.
2) Сферический C++ программист беззаботно выделяет память.
3) Программа сферического C++ программиста не работает без буста.
4) Сферический C++ программист делает простые вещи сложно.
Ответ написан
@kaladhara
Проводим аналогию: почему фанаты «зенита» не любят фанатов «реала»?
Ведь все футболисты делают одно и то же: быстро перебирают ногами и пинают мячик.

Ответ: потому что такова обезьянья природа человека.
Ответ написан
Stdit
@Stdit
Там же в письме Линус даёт свои ответы. Он пишет системный софт, а С++, по его мнению, провоцирует использовать библиотеки (включая STL), в результате чего получается неэффективный код (и исправить который можно только переписав заново). Кроме того, код на С более портируемый, и среди сишников гораздо порще найти программистов, разбирающихся в низкоуровневых нюансах.
Ответ написан
AGvin
@AGvin
Свою «любовь» к Git он в man-е, неплохо, описал )
Выполнив:
[wtf@localhost etc]#man git

Видим:
Name
  git - the stupid content tracker
Ответ написан
@Kukunin Автор вопроса
Не для холивара ради, а для осознания истинны, я хочу с вами продолжить дискуссию.
Вот я пишу небольшой проект github.com/Kukunin/lightum-ng.
Это форк с уже существующего github.com/poliva/lightum.

Возможно, оригинальный проект не образец самого лучшего кода на Си, но мне моя ООП архитектура куда больше нравится на С++.
Нужно добавить поддержку, например Mate — просто добавь и реализуй класс.
Нужно добавить поддержку Windows — реализуй backend'ы для использования GDI или WinAPI ( я незнаю, что там используется ).
Это преимущества полиморфизма. Как такое сделать на С?

if ( get_backlight_method_1() ) { } else if ( get_backlight_method_2() ){ } else if ( get_baclight_method_3() ) { }

так?

Или эмулировать полиморфизм через указатели на функции? Тогда чем это лучше нативной реализации в С++?

Из недостатков моей архитектуры вижу только возможный оверхед на уровне ниже (всякие таблицы виртуальных методов и т.п.).

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

P.S. Не рассматривайте мой комментарий как агрессию. Я никак не хочу переубедить Вас или что-то еще, просто на основе моего мнения будет проще написать контраргументы. И тогда я узнаю что-то новое.

Спасибо!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы