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)

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

хм... действительно имеется минорная бага, спасибо за ваш багрепорт... а кресты я и сам местами не недолюбливаю, особенно после знакомства с языками, в которых при проектировании учли некоторые недостатки C++, правда наплодив множество других косяков которые возможно будут исправлены в более совершенных языках, когда нибудь. Но при этом не могу не отдать дань уважения такому поистине прорывному для своего времени языку, который до сих пор позволяет делать революционные вещи. И вообще идеальный язык для меня это ассемблер потому что всё в итоге сводится к нему.

mm3 ★★★
()

Какова его ниша? Desktop - Delphi и Python + GTK, веб - PHP, энтерпрайз - Java и C#, ОС - C.. Места для C++ не остаётся.

Joker
()
Ответ на: комментарий от mm3

поистине прорывному для своего времени языку

Ты С++ ни с чем не перепутал, лол?

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

Ты до сих пор согласен с тем глупым взглядом на С++?

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

Я в курсе, в изначальном посте речь о сахаре и шла.

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

Total Commander и QIP мертвы?

Да, но насиловать их продолжают.

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

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

Из-за типодрочерства CS последние десятилетия не развивается вообще никак - вместо поиска и развития альтернативных подходов легче написать диссер про никому не нужное расширение лямбда-хуямбда-омега-стрелки зигохистоморфическими препроморфизмами. Вообще, сложилось мнение, будто CS = исследования в области систем типов и больше исследовать нечего. Тупик, как есть. То есть, понятно, системы типов исследовать тупо удобно, но хотя бы в некоторой мере наука должна идти и от требований практики в том числе, потому что, блять, оно так всегда - полезные для практики задачи обычно неудобны.

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

но IDE плохо разбирают синтаксис чего угодно.

почему лишь IDE?

ANTLR (ANother Tool for Language Recognition) is a powerful parser generator for reading, processing, executing, or translating structured text or binary files. It's widely used to build languages, tools, and frameworks. From a grammar, ANTLR generates a parser that can build and walk parse trees.

Емнип, ANTLR начался когда работодатель заставил автора написать комментарии к его коду на Си. Код для каких-то роботов. Комментарии должны были быть элементарными: сколько переменных использовано, сколько строчек внутри функции, сколько операторов присваивания, итп. Вместо того, чтобы писать их руками, он написал то, что потом стало ANTLRом, оно пробежалось по коду и сгенерило всё чо надо.

Можно ли повторить этот успех простым способом для С++, с помощью того же ANTLR? (ANTLR — это LL(*)).

Второе (про генерацию) — ну и хорошо.

А между тем, в соседнем треде:

Вопрос мучает: во что транслировать AST (abstract syntax tree)? В си, кресты, obj c? [...] Мне изначально предлагали использовать llvm, но для меня это ад.

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

браузеры там всякие

известно на чем, на html5+js

Karapuz ★★★★★
()

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

а кто-нибудь может мне объяснить, почему это 4.2 и срач после 4.2 не в лолксах?

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

почему лишь IDE?

Потому что в посте написано про IDE.

А между тем, в соседнем треде:

А это тут при чём?

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

Практика показывает, что на C++ как писали performance critical приложения, так и пишут

Это твиттер и брокерский софт performance critical? А почему их пишут на жабе а не C++?

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

(int*)( &three );
«А ещё можно яйца дверью прищемить и жаловаться на неправильные двери» (с),

код же не только ты пишешь, а еще люди. Ты отдаешь свои объекты в чужие функции/либы, от которых, может быть, вообще никаких исходников нет.

что сделать, чтобы чужой код не сломал твой объект? Констант-то нет, private не работает, итп? Правильно, надо сделать defensive copy, и отправлять уже эту копию, а не оригинальный объект

таким нехитрым макаром мы потратили в 2 раза больше оперативки, верно? А тот «недоверенный» код, он же тоже юзает какие-то либы, и тоже сделает defensive copy, и так повторится 100500 раз. Плюс время на копирование, особенно если это deep copy. Всё тормозит и жрет память.

а в других, более хороших языках, где есть специальные immutable values, компилятор/рантайм может оптимизировать это, и память, может быть, вообще не потеряется

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

Мне этот тред напоминает попытку объяснить приведению, что приведений не бывает. В С/С++ нет возможности не дать сломать объект. В нем можно делать ВСЕ что ты захочшь.

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

а в других, более хороших языках

Это в языках без C FFI?

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

нет возможности не дать сломать объект

есть способ, конвенция на предварительно копирование, но это жрет оперативку просто жесть.

иллюстрация конвенции: http://pastebin.com/9b7NdZFZ

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

а в других, более хороших языках, где есть специальные immutable values, компилятор/рантайм может оптимизировать это, и память, может быть, вообще не потеряется

А потом всё это передаётся в функцию, реализованную на Си, и...

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

объяснить приведению

Приведения бывают разные. Например, приведения типов. Но мне что-то неизвестны приведения, которым можно что-то объяснять.

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

а в других, более хороших языках, где есть специальные immutable values, компилятор/рантайм может оптимизировать это, и память, может быть, вообще не потеряется

Если сильно захотеть, сломать можно что угодно. А если у нас есть библиотека, исходников от которой нету и которой мы не доверяем, никакие immutables не спасут. Более того, могут сделать хуже, ибо компилятор может провести какие-то оптимизации, завязанные на эту неизменяемость, и привет дебаггеру.

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

Да ты оптимист. Ладно бы фокал обогнала такая программа на сях или плюсах.

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

Вся эта чухня перевешивается двумя жирными плюсами:
1) C++11
2) По производительности рвет всех, как Тузик тряпку

3) огромное количество существующих библиотек + прямая работа с сишными

annulen ★★★★★
()

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

Повторяй себе это почаще, детка.

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

Пишу это с KDE (написанного на С++), в Firefox (написанном на С++), открыты LibreOffice (написанный на С++) и...дальше нужно продолжать?

Они целиком и полностью написаны на C++, или только их движок? По-крайней мере, у мозиллы браузер написан на XUL и JS. А то так можно договориться до того, что все программы написаны в машинных кодах.

mv ★★★★★
()

Вот это и есть истинная причина использовать кресты — возможность срубить €€€

Большего не нужно.

anonymous
()

Очередные фантазии уеб-хипстеров.

anonymous
()

Высказывания Бьёрна Строуструпа, которые связаны с обсуждаемой темой

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

Полный список цитат

Deleted
()

Высказываниям Трупострауса не всегда нужно верить.

Он тут недавно в каком-то выступлении сказал «Никто не знает, почему функциональное программирование не взлетело.» Проблема в том, что слушали его матёрые скальщики. Которые, надо сказать, тоже не знали этого; они даже не знали, что оно не взлетело.

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

Высказываниям Трупострауса не всегда нужно верить.

Конкретно в этой приведённой цитате он таки прав.

Он тут недавно в каком-то выступлении сказал «Никто не знает, почему функциональное программирование не взлетело.»

На самом деле все давно знают. Человеческое мышление обычно идёт более другим ходом, чем который нужен для ФП.

Проблема в том, что слушали его матёрые скальщики. Которые, надо сказать, тоже не знали этого; они даже не знали, что оно не взлетело.

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

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

Человеческое Быдлокодерское мышление обычно идёт более другим ходом, чем который нужен для ФП.

fixed

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

Проблема в том, что слушали его матёрые скальщики. Которые, надо сказать, тоже не знали этого; они даже не знали, что оно не взлетело.

А что взлетело? Толпа скалкодрочеров даже не знала что их скалка нон вагина нон рубер легион.

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

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

++
по ссылке «зачет»

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

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

Ваш язык говно! (c)

geekless ★★
()

Я б еще добавил высказывание Джеффа Элджера:

Речь идёт не о строении компьютерного языка, а скорее о нашем собственном строении. Все уродства С++ — это в основном наши уродства.

(Как в оригинале не знаю. Читал в переводе, каюсь.)

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

В машинных кодах их не пишут. А пишут на С++.

Я тоже часто пишу софт с «движком» на плюсах и скриптами с логикой на чем-то другом. Так вот «движок» важнее, интереснее и сложнее. Так что я считаю, что основным языком в такого рода проектах является С++. И заменить его пока может только сишечка, на которой писать дольше и неприятнее(если осилил ++). Да, я пробовал Go и D(где-то по полгода активных попыток - не пошло - медленно и сыро). Да, Rust мне тоже кажется перспективной разработкой.

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

Так оно и не взлетело(посмотри, когда оно появилось). Только в последнее десятилетие к нему вновь обратился взор профессиональных разработчиков. Но пока еще о взлете говорить рано. И заметь, взлетать начинают гибриды, а не чистые функциональные языки.

anonymous
()

Вот беру я c++ и пишу дрово под винду7. Там есть wdf и УМВР. Потом я беру с++ и пишу дрово под макось. Там есть iokit и поэтому снова УМВР. Под линукс такого фреймворка нет, ну и ладно. Я все равно могу писать на c++ дрова под линукс.

А стив жоппс не может, ему яйца мешают.у него же «сегфолт ГАРАНТИРОВАННЫЙ»,утечки памяти повсюду, и счеткики ссылок тормозят(а они в ядре используются, как оно то тормозит).

ckotinko ☆☆☆
()
Последнее исправление: ckotinko (всего исправлений: 1)
Ответ на: комментарий от anonymous

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

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

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

Но это говорит, что чистые не взлетели. Да и scala не слишком, на самом-то деле... С С++/Java/C# и не сравнить. Хотя и там проростает функциональщина потихоньку.

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