LINUX.ORG.RU

10 причин почему программист на С++ может выбить много денег


24

10

Список в конце поста написан Лавсаном 2 года назад. (2011-03-23 19:56:00) (источник)
Надеюсь, автор не подаст жалобу в Роспатент за перепечатку :-)
Кстати, sudo cast lovesan.

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

Временное резюме: С++ всё еще актуален по историческим причинам. Еще есть мобилки (sudo cast mono), гиперкластеры для шиндовс 3.11 (sudo cast vromanov) и базы данных. Т.к. он актуален, но не предназначен ни для чего (см. выводы в конце списка) новых специалистов по нему должно быть мало. Маленькая конкуренция на огромной области применения — огромное лавэ $$$. Вот это и есть истинная причина использовать кресты — возможность срубить €€€.

Честно говоря, «хитрый план» мне уже очень надоел, поэтому пора открыть карты.

Заодним, крестопоклонники смогут выйти на последний и решительный бой, т.к. сегодня пятница и вечером будет время пообщаться. Поклонникам мамкиного борща тоже наверняка есть что добавить, конструктивно и аргументированно.

Вот этот список:

  1. Вырвиглазный синтаксис и контекстно-зависимая грамматика
    • медленная компиляция
    • частые «internal error» в компиляторах
    • код плохо читается и его сложно поддерживать
    • разбор кода различными инструментами, вроде IDE, и его генерация - сильно затруднены
  2. ручное управление памятью
    • неудобства при работе с динамической памятью
    • утечки памяти
    • висячие ссылки
    • сегфолты
    • стандартные средства, как то malloc/new, работают медленно
    • фрагментация кучи
    • велосипедные аллокаторы на каждом шагу
      • которые далеко не факт что эффективнее malloc/new

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

    • отладка затруднена
    • написание GC, по факту, невозможно, отчасти из-за (5), (7) и (8)
  3. Никакого ABI
  4. Нестандартизированный и непредсказумый name mangling
  5. Дублирование функционала Си
    • сами фичи из Си никуда не деваются при этом
      • отчасти из-за того, что по функционалу превосходят аналоги из C++

    • запутывает новичков
    • malloc - new/new[], free - delete/delete[]
    • препроцессор - шаблоны
    • указатели - ссылки
      • ссылка не может быть NULL, что способствует появлению висячих ссылок и сегфолтов

    • структуры - классы
    • stdio - iostream
  6. Стандартная библиотека убога
    • Отсутствует даже такой функционал, как вменяемая работа со строками и многомерные массивы
      • Юникод?

  7. Слабая типизация
    • способствует ошибкам
    • затрудняет отладку
    • const не дает абсолютно никаких гарантий
    • при этом система типов невероятно переусложенена
      • в основном из-за пунктов (2), (5) и (9)
      • медленная компиляция
      • частые внутренние ошибки в компиляторах

  8. объектая система убога
    • практически никакой интроспекции
      • отладка затруднена
    • передача объектов по значению
      • понятие идентичности объекта теряет смысл
      • добавляет сложностей в управлении памятью
      • добавляет сложностей при отладке
      • используется часто, по причине (2)
        • перерасход по памяти
        • медленная работа

    • множественное наследование неудобно в использовании
      • проблема ромба по дефолту не разрешается никак

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

    • деструктор можно вызывать до выхода из блока кода, или до delete
      • гарантированная утечка ресурсов/сегфлот
      • это не предотвратить никак, деструктор обязан быть public

    • одиночная диспетчеризация
      • виртуальные методы в конструкторах не работают
      • реализована убого
        • pure virtual function call
        • сложности в случае с множественным наследованием
        • деструкторы обязаны быть виртуальными
          • по дефолту - не виртуальные

        • никаких интерфейсов, только классы

    • порядок инициализации статических членов классов не определен
    • private, public и protected не дают никаких гарантий сокрытия данных
      • к инкапсуляции же не относятся совершенно никак

    • отсутствие «свойств»
      • вынуждает городить getter'ы и setter'ы
        • раздувание кода
        • размывание интерфейса класса

    • неявно генерирумые конструкторы, деструкторы и операторы присваивания
    • «friend» нарушают инкапсуляцию
  9. шаблоны
    • очень сильно замедляют компиляцию
    • раздувание кода
    • обфускация кода
    • результат раскрытия плохо предсказуем
    • сложности в отладке
      • километровые и плохо читаемые сообщения об ошибках при компиляции

    • нарушают инкапсуляцию
      • обязаны содержать реализацию в заголовочных файлах

    • позволяют генерировать некорректный код
  10. исключения
    • отсутствие finally/unwind-protect
      • заставляет городить классы ради одних деструкторов
        • раздувание кода
        • медленная компиляция
        • медленная работа

    • конфликтуют с другими возможностями языка
      • конструкторы/деструкторы
      • ручное управление памятью

    • работают медленно
    • малофункциональны (ср. CL condition system)

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

У C++ нет области применения.

★★★★☆

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

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

мне интересно вы когда учили это говно, вам в голову не приходило что занимаетесь извращениями?
не заметили ничего странного когда синтаксис стал задалбливать? или там, опять забыли память очистить?

system-root ★★★★★
()
Ответ на: комментарий от unfo

Гуй удобнее всего делать на языке разметки и скриптовать на чем-нибудь js/ruby/python-образном. Но поскольку средства разработки гуя десктопных приложений до сих пор пребывают в каменном веке...

А вот логику приложения таки да, порою лучше всего писать на крестах.

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

модификация одного из ведущих haskell-ных серверов (warp), на которой тестится и улучшается работа ghc-RTS. А вообще мы про скорость или про популярность?

qnikst ★★★★★
()

Топик-стартер - неосилятор и в первом посте перечислено (в основном), что он понять не смог.

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

Дело в том, что я, например, начинал программировать на C++ долгое время вообще не использовал STL. В основном по причине того, что дело было под виндой и в середине-конце 90-x. Там был MFC и WTL. В них как раз все было по ООП, но без STL. В MFC не было шаблонов, WTL был весь на шаблонах.

vromanov ★★
()

Какие-то натянутые претензии. Особенно позабавили пункты 2 и 8. С++ же компилируется в бинарный формат, а не в какой-нибудь байт-код.

Moncruist
()

Хватит уже этого инвалида-неосилятора цитировать.

Особенно умиляет про «медленно» и «перерасход памяти». А где быстрее?! И где экономнее память можно использовать?

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

Вот уж где проблемы с компиляторами

Какие ещё проблемы? На этих наших линуксах практически все пользуются GDC.

стандартом

Вы про D1 и D2? Забудьте, D1 уже мёртв.

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

nginx и lighthttp они не стали вставлять от скромности?

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

это достаточно старое, я сейчас постараюсь последнюю статью найти.

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

Пусть вместо STL будет любая другая «объектная» библиотека, это, все же, не сделает из C++ С. WinAPI для того и воротился, чтобы собирать приложение из доступных компонент, хотя я с трудом представляю онное, в ктором не используется контейнер или смарт поинтер.

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

Хватит уже этого инвалида-неосилятора цитировать.

lovesan не автор, ОП-пост это выжимка этого FAQ.

encyrtid ★★★★★
()

Большая часть откровенная глупость, остальное автор видимо где-то слышал (судя по его детским вопросам на форуме видно, какой «богатый» у него опыт). Плюс одни и те же «недостатки» по многу раз повторяются.

Всё-таки не могу удержаться от комментариев по отдельным пунктам:

частые «internal error» в компиляторах

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

Дублирование функционала Си

Тут в подпунктах просто невероятный бред.

const не дает абсолютно никаких гарантий
понятие идентичности объекта теряет смысл
исключения в конструкторах гарантированно влекут утечку памяти
исключения в деструкторах тоже
поэтому ими стараются не пользоваться
это не предотвратить никак, деструктор обязан быть public
никаких интерфейсов, только классы
порядок инициализации статических членов классов не определен
шаблоны нарушают инкапсуляцию
исключения конфликтуют с другими возможностями языка

Откровенное враньё.

Ну не позорился так сильно хотя бы. Особенно весело про деструкторы, которые обязаны быть public.

коды ошибок деструкторы и конструкторы возвращать не могут

А много где это есть?

позволяют генерировать некорректный код

Лол. «Нагенировать» кривой код и руками можно. И макросами, причем как хардкорными сишными, так и «правильными».

В общем, по всем этим пунктам скорее топик стартер не пригоден к программированию.

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

У меня как раз было без смарт поинтеров. Без них вполне можно обойтись. Еще раз - C фактически (за небольшими исключениями) подмножество С++. Вполне можно пользоваться С++ не используя классы, а, например, наслаждаясь более строгой типизацией и/или перегрузкой. Можно вполне обходится без виртуальных функций как это было в WTL, можно без шаблонов как в ранних версиях MFC. Можно даже не пользоваться динамической памятью и все это будет С++

vromanov ★★
()

У C++ нет области применения.

С++ вас всех переживёт.

archimag ★★★
()

Мои мысли по сабжу.

С++ уже пару лет как перестал быть священной коровой. Раньше, по сути, С++ было эквивалентно «нативная компиляция»/«близко к железу» в глазах обывателя, в противоставление всяким интерпретаторам и VM-языкам. Остальные инструменты с нативной компиляцией были слишком ускоспециализированными/маргинальными. Сам С++ как язык довольно паршив, но принятие его как стандарта индустрии для десктопного софта считаю хорошим историческим событием (потому, что был хотя бы какой-то стандарт).

С того времени прошло две вещи:

1. Разработчики начали придумывать альтернативные нативно-компилируемые языки с расчетом на широкое применение (D, C#, Go, Rust).

2. С++ стал все более удаляться от «железа» (модель вычислений PDP-9 является не очень хорошой апроксимацией современных процессоров). Потеть из-за этого приходится компиляторам, которые пытаются преобразовать ваш далекий от железа код в что-нибудь эффективное. Получается не всегда.

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

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

наслаждаясь более строгой типизацией и/или перегрузкой

Перегрузкой чего? Функции и в С перегружаются. Зачем ради мелочей, вроде более строгой типизации, использовать целый С++ (не затрагивая corner-case с MFC/WTL, тут никуда не деться, но я бы такое программирование назвал скорее программированием на MFC/WTL сродни программированию на Qt)?

x0r ★★★★★
()

И тем не менее, на него перевели GCC, к примеру, причём совсем недавно. Не нравится? Пишите на Objective-C. :-)

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

Где они в С перегружаются? Более строгая типизация - очень полезная фича. Если для того чтобы ее получить надо всего-то добавить две буквы к расширению файла - то почему нет?

vromanov ★★
()

Когда хоть уже учебный год начнется.

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

const не дает абсолютно никаких гарантий

   
const int three = 3; // капитан очевидность
printf( "three=%d\n", three );

int *ptr;
ptr = (int*)( &three );
*ptr = 5; // have a nice debug

printf( "three=%d\n", three );

Откровенное враньё.

боюсь, остальные пункты в твоем «опровержении» — такая же ложь

а если нет, давай пруфы

stevejobs ★★★★☆
() автор топика

10 причин почему программист на С++ может выбить много денег

и это правда, только что вернулся - берусь еще за один проект, еще стабильные 5 штук баксов в месяц (для нашей глуши это много) и еще меньше времени на отдых :(

П.С, а доводы большей частью нытье и чушь

wota ★★
()

Старый вброс лучше новых двух. Годно.

Текст, в общем-то правильный (сложно спорить с каждым из пунктов отдельно), но достаточно однобок, поэтому и рождает немного странный вывод.

Добавлю тезисы:

  • C++ - очень популярный язык, за счет чего специалистов достаточно много, качество их очень разное.
  • Если посмотреть живые проекты, то чаще всего, используется не С++ целиком, а определенное подмножество языка и четкие регламенты. Это позволяет нивелировать многие проблемы и обойти узкие места. Яркий пример - GCC.
  • Кроме минусы есть еще и плюсы, например, почему он используется на мобилках:
    • Большое количество уже существующего, хорошего, отлаженного кода.
    • Хорошие реализации языка для огромного количества платформ
    • Неплохая производительность
mono ★★★★★
()
Ответ на: комментарий от invy

блин, точно, g++ покажет снова 3. Сразу видно, настоящий крестопоклонник!

но даже умный компилятор не выстоит в неравном бою со здравым смыслом!

const volatile int three = 3; // капитан очевидность
printf( "three=%d\n", three );

volatile int *ptr;
ptr = (int*)( &three );
*ptr = 5; // have a nice debug

printf( "three=%d\n", three );
stevejobs ★★★★☆
() автор топика
Ответ на: комментарий от vromanov

Там был MFC и WTL. В них как раз все было по ООП, но без STL.

В MFC плохой, негодный ООП :) А был еще параллельно OWL... Недолго и не всерьез.

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

Где они в С перегружаются?

Макрос с использованием _Generic.

PolarFox ★★★★★
()

Резюмировать сей длинный список «недостатков» можно одним утверждением: С++ дает больше возможностей выстрелить себе в ногу. И что?

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

не всегда
В таких случаях ещё принято писать, с какими ключиками запускался компилятор.
gcc -O3 -msse2 -ftree-vectorize -o madd.exe

Кстати, ему там говорили и про AVX.

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

блин, точно, g++ покажет снова 3. Сразу видно, настоящий крестопоклонник!

Я другое имел в виду.
1) это критика не только С++ но и С получается, со всеми вытекающими.
2) на плюсах скорее всего так писать не будут и всё будет завёрнуто в класс и сдобрено ещё парой const'ов, дляпрофилактики.
3) const в той же java тоже в общем случае ничего не гарантирует (reflection) даже пример: http://stackoverflow.com/a/3301720

зы короче говоря, сдуру можно много чего сломать :)

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

Первое что я когда-то давно сделал впервые сев писать на Java, это утечка памяти... К чему я это? Если захотеть, сломать можно что угодно. Но какое это отношение имеет к недостаткам языка я не понимаю...

Daeloce
()
Ответ на: комментарий от system-root

вам в голову не приходило что занимаетесь извращениями?

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

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

Где они в С перегружаются?

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

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

Резюмировать можно еще так: бензопилы нельзя в руки безруким ушлепкам :) Порежутся и будут БЕЗHОГNM.

slackwarrior ★★★★★
()

Стиви напиши такую же портянку для Objective-C

ЗЫ годный вброс, поржал. Один хер С++ не брошу потому, что он хорший. =)))))

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

const в той же java тоже в общем случае ничего не гарантирует

На самом деле, const в смысле С++ там вообще нет, константных ссылок на экземпляр класса в Java нет, неизменность там указывается только для строенных типов и ссылок на экземпляры классов.

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

Если захотеть, сломать можно что угодно. Но какое это отношение имеет к недостаткам языка я не понимаю...

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

допустим, в SQL мы сразу говорим, что хотим получить. А компилятор/оптимизатор потом пытается угадать, каким из возможных способов разрулить запрос так, чтобы было подешевле. И вполне может не угадать, например наш запрос выйдет за размер оперативки, попадет в своп и случится капец котёнку. Поэтому, очевидно, вербализация оптимизаций — это добро.

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

окей, может тогда const — это нечто, помогающее компилятору заюзать мега-оптимизацию? Я не шарю. Приведи, пожалуйста. пример, чтобы const после O3 что-то изменило по перфомансу

если оно не выполняет ни того ни другого, нафиг оно тогда вообще нужно?

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

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

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

окей, может тогда const

нет, const - это const, и он делает код безопаснее, «но в нём нету защиты от дурака».

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

который бы бил nginx?

1) Если надо просто статику отдавать то легко, в nginx нет ничего магического. Только в этом нет смысла.

2) В большинстве случаев такие показатели производительности не нужны и на практике в сам nginx не уверен что упрётся на 10G линках. А вот если включить ssl или что-нить на лету с контентом делать то тут уже никакой nginx не поможет.

true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.