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)

Свойства

отсутствие «свойств»

Оффтопик, но очень хочется спросить, в чём профит от свойств. Сравнить например яву и с#. Они почти одинаковые, но свойства есть только в с#.

Если я в яве вижу, что у класса есть «public int getValue()», я знаю, что могу получить value. Если я вижу «public int setValue()», я знаю, что могу изменить value. Если я в с# вижу «public int Value», я не знаю, прописал ли там аффтар get и/или set и выставил ли он их в public, надо либо лезть в документацию, либо ждать привета от компилятора.

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

Давай лучше начнём с деструктора, который обязан быть public. Что ж ты скромно промолчал?

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

И что тебе в приведённом коде не нравится? При нормальном присваивании компилятор тебе скажет, что ты делаешь ерунду. Не говоря уже о том, что ты используешь вообще сишный (не плюсовый) каст.

А возможность сказать компилятору «я знаю, что я делаю» - фича. Полезная.

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

На что пруфы? На то, что деструктор может быть хоть protected хоть private?

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

DarkEld3r ★★★★★
()
Ответ на: Свойства от anonymous

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

anonymous
()

По причинам 3, 4, 5, 9 и 10 C++ совершенно неприменим для системного и низкоуровневого программирования.

А в макоси часть ядра на плюсах. Странно что сам джобс этого не знает!

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

Анамнез проясняется. У пациента тяжелая травма от венды и убогого микрософтовского взгляда на C++.

anonymous
()

отсутствие «свойств»

#define делается все просто, для ленивых есть наверное во всех айди генерация их автоматом

Boy_from_Jungle ★★★★
()

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

я сделал умно, проскролив эти буквы и прочитав, к какому выводу пришел тс.

comp00 ★★★★
()
Ответ на: Свойства от anonymous

либо ждать привета от компилятора.

не жди милости от компилятора, лезь в рантайме с вертушки открыто и смело сразу в интроспективные щи :)

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

Ты еще про атрибуты спроси... В С# исторически наворачивали сахар почем зря... Порождая компании по суматошному переписыванию 2.0 на 3.0+ (с делегатов на лямбды, LINQ и дальше), хотя яйца все те же, только хитро расквашенныераскрашенные.

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

не жди милости от компилятора, лезь в рантайме с вертушки открыто и смело сразу в интроспективные щи :)

Чорт, даже не додумался бы. Месье знает толк.

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

Давай лучше начнём с деструктора, который обязан быть public. Что ж ты скромно промолчал?

давай нескромно покажи правильное использование приватного виртуального деструктора

то сам и должен их доказывать.

боюсь, на этот раз утверждения выдвинул ты, и теперь твоя очередь доказывать, что не дурак

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

Что, даже больше чем пограммист на 1С?

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

Порождая компании по суматошному переписыванию 2.0 на 3.0+ (с делегатов на лямбды, LINQ и дальше)

Там лямбды и есть делегаты, или я что-то пропустил?

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

Месье знает толк.

Я насмотрелся Ъ-реализаций от всякого рода гурей - мсьи точно знают толк :) Помнится надо было простой клиент для сервака по UDP раздающего биржевые данные написать... Для примера дали чего гуру наваял... MVC на MVC MVC погоняет... С ходу не поймешь, кто на ком стоялчто кого вызывает, а структура таблиц и гуя генерится через рефлексию (методом невозбранной энумерации свойств типа) по дата-классам... В общем... Как «простой пример референсной реализации клиента» (ключевое слово простой) не канает :)

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

написанного на С++
написанном на С++
написанный на С++
ядро на чистом С
вся ОС и приложения написаны на С++

А ЛОР то на йаве!

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

В «божественном C#» .Net можно в IL патчить типы :) Чуваки, которым экспортов чего-нито из C# сборок не хватало (по типу плюсовых, для связи с нативным кодом) - невозбранно это проделывали.

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

людям, пишушим на плюсах и в глаза не видевшим ваш stl.

Им осталось только посочувствовать.

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

давай нескромно покажи правильное использование приватного виртуального деструктора

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

Во вторых, запросто. Навскидку в голову приходит сразу два случая:

1. Счётчик ссылок у нас в самом обьекте и удалит себя он тоже сам. Для таких классов boost::intrusive_ptr придуман, например. Или если брать винду, то в коме все интерфейсы так реализованы (аддреф/релиз и делейт внутри релиза если счётчик достиг нуля). Публичный деструктор, в данном случае, нафиг не нужен и даже вреден.

боюсь, на этот раз утверждения выдвинул ты, и теперь твоя очередь доказывать, что не дурак

Чего? Я про первый пост вообще-то. Где как раз куча неаргументированной ерунды.

Если ко мне какие-то вопросы есть - не стесняйся, спрашивай. Но судя по тому, как ты цитаты дёргаешь, то тебе совсем не конструктив нужен.

2. Часто встречается что-то такое:

mega_class* make_mega_class();
void destroy_mega_class(mega_class*);
Этот вариант можно чуть красивее сделать если отдавать наружу шаред_птр со сводим делейтером.

боюсь, на этот раз утверждения выдвинул ты, и теперь твоя очередь доказывать, что не дурак

Чего? Я про первый пост вообще-то. Где как раз куча неаргументированной ерунды. А с константностью, по моему, всё и так очевидно.

Если ко мне какие-то вопросы есть - не стесняйся, спрашивай. Но судя по тому, как ты цитаты дёргаешь, то тебе совсем не конструктив нужен.

DarkEld3r ★★★★★
()
Ответ на: Свойства от anonymous

Если ты видишь

Если ты видишь - public int Value - это открытое поле. Компилятора ждать не нужно, IntelliSense тебе об этом скажет раньше компилятора. За Mono- и Sharp- Develop не скажу.

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

Вообще-то, не совсем так. Версии 3.x использовали тот же рантайм, что и 2.0, и те же либы, только патченные. Другое дело, что было больше синтаксического сахара, которого в C# в избытке. Вот, в четвертой версии они поменяли уже рантайм.

dave ★★★★★
()

Тред переполнен завистью, ненавистью и БУГУРТОМ борщевиков — хейтеров С++.

А давайте я напомню, кто такой lovesan, автор сей простыни?

Дима Игнатьев, учился в Самарском аэрокосмическом. Не доучился, был выпизжен, кажется, с 3-4 курса. Наркоман, лиспер, виндузнятник, Linux-хейтер. Пытался основать ололо-лисп-стартап — и зафейлил его. Очень быстро выяснилось, что лисп непригоден для промышленной разработки (это понятно любому вменяемому специалисту, но Дима, напомню, — дилетант и наркоман). Поэтому сперва пришлось слезть с лиспа на C#, это был первый фейл. Потом стартап накрылся сам по себе, так что в сумме получился фейл в квадрате. После фейла стартапа Ловсан пришел к тому, к чему приходят остальные лисперы: он ведет лисп-блог и организует встречи лисперов, на которых они обсуждают лисп и обсирают мейнстрим. Перебрался в Питер, кое-как зарабатывает на жизнь ненавидимым мейнстримом (С# под венду, если не ошибаюсь). Нищебродствует, бугуртит.

Так что ОП-пост — закономерный результат деятельности лиспера-неудачника, и должен быть воспринят соответственно.

anonymous
()
Ответ на: Если ты видишь от Patrick13

Если ты видишь - public int Value - это открытое поле. Компилятора ждать не нужно, IntelliSense тебе об этом скажет раньше компилятора. За Mono- и Sharp- Develop не скажу.

Всё это прекрассно, только это не ответ на поставленный вопрос. В чём профит-то от свойств? В том, что без навороченной ide писать стало геморрно?

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

лучший компромат на крестопоклонников — цитаты крестопоклонников

void destroy_mega_class(mega_class*);

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

И откуда виртуальность взялась?

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

boost::intrusive_ptr придуман

«велосипеды на каждом шагу»

ох как же ты крутишься, как уж на сковородочке, подрумяниваешься :3

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

Property в C# - это синтаксический сахар, как и event, foreach, yield, лямбды/замыкания, а теперь и await. Так что, забей, не переживай :)

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

Property в C# - это синтаксический сахар, как и event, foreach, yield, лямбды/замыкания, а теперь и await. Так что, забей, не переживай :)

Меня джобс в когнитивный диссонанс ввёл. Я не могу понять почему отсутствие геморройной конструкции с плюсах - это минус.

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

невиртуальный деструктор в C++ не имеет практического смысла.

доо, особенно он не имеет смысла в стандартных строках, контейнерах, «умных» указателях и т.д.

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

C++-программист: (пишет системный и прикладной софт, ОС, СУБД, сетевые сервисы, игры, multimedia-софт, etc., etc., etc...)
C++-хейтер: ох как же ты крутишься, как уж на сковородочке, подрумяниваешься :3
C++-программист: (пожимает плечами и продолжает писать)

anonymous
()

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

Объясните кто-нибудь, зачем C++ нужна область применения, если ему и без неё неплохо живётся?

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

В чём профит-то от свойств?

можно подменить реализацию поля в базовом классе, не сломав клиентский код

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

Выше обсудили уже, что геттерами/сеттерами геморроя меньше.

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

потому что невиртуальный деструктор в C++ не имеет практического смысла

Муа-ха-ха-ха-ха!!! Зажег!

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

Объясните кто-нибудь, зачем C++ нужна область применения, если ему и без неё неплохо живётся?

Неверный вывод. У С++ есть области применения. Их много, и они огромны. А исходный посыл «у C++ нет области применения» — это отчаянный бугуртный высер борщевика-наркомана, см. выше о нём.

«Зачем область применения, если и без неё неплохо живётся» — а вот это как раз про LISP/Haskell/Smalltalk/Brainfuck и прочую академически-яйцеголовую маргинальщину. Областей применения нет, практический софт писать невозможно, но ведь цель не в этом! Цель — обсуждать с собутыльниками коллегами зигохистоморфные препроморфизмы, анафорические лямбды, coKleisli-категории и смотреть на окружающих, как на говно.

С этой целью LISP/Haskell/etc. справляются просто блестяще.

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

Да неважно, верный это вывод или не верный.

Даже если автор сделал правильный вывод, что у С++ нет области применения, то непонятно почему этот вывод должен кого-то волновать. Будто C++ без области применения как-то страдает.

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

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

всё RAII на них держится.

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

Ты бы что ли кастанул сюда борщевиков. Тут такие есть? Я не помню ников

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

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

unlog1c ★★★
()

фрагментация кучи

В физической памяти? Это забота ядра. malloc вызывает либо sbrk(2), либо mmap(2)

Нестандартизированный и непредсказумый name mangling

Кому это мешает жить?

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

лол

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

и хорошо

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

Да неважно, верный это вывод или не верный.

Протестую! :) У меня просто аллергия на всякого рода наркоманство. А утверждать «отсутствие областей применения» для языка, на котором написаны Firefox, Chrome, Opera, Libre/OpenOffice, KDE, весь Windows, вся продукция Adobe, весь Blackberry, различные ОС, куча научного софта, CAD, CAM, SCADA, игры, multimedia и так далее — наркомания чистой воды.

А если это утверждается теми, кто ничего не написал, кроме вычисления факториала через рекурсивные схемы на комонадах, — то это наркомания в квадрате.

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

Ты опять выдаёшь своё полное непонимание. И опять передёргиваешь с цитатами. Самому не смешно?

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

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

Тут ты опять в лужу сел. Деструктор ведь вызовется, просто мы не разрешаем кому попало и как попало delete вызывать.

потому что невиртуальный деструктор в C++ не имеет практического смысла.

Очень даже имеет. У меня немалая часть классов без виртуальных деструктов обходятся. Зачем их всюду лепить просто потому что ты боишься на грабли наступить (там где их нет)?

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

К чему это вообще? Это удобно в куче случаев. И бустовский класс придуман как раз, потому что идиома это распространённая. Ну и вообще, ты хотел примеры - я их привёл. Так что крутишься как раз ты.

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

Объясните кто нибудь что за фишка с мамкиным борщом.

Это нульчановский мем, если не ошибаюсь. Суть такова: типичный лиспер/хаскелист/маргинальщик — это школьник/студент, который нигде не работает (ведь лисперы никому не нужны); вероятно, не имеет высшего (Love5an) или даже начального (Золотце) образования. Поэтому он живёт с родителями, сидит дома и питается борщом, который ему варит мамка. Всё вполне логично.

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

Ты — исключение, которое лишь подтверждает правило.

anonymous
()

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

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

ведь лисперы никому не нужны

Киевскому Grammarly месяц назад сильно был нужен коммон-лиспер. Не знаю или уже нашли.

Ты — исключение, которое лишь подтверждает правило.

Ну, формально, исключение правило подтвердить не может. Подчеркнуть разве что.

То, что позиций для «маргиналов» мало не значит, что они не нужны. Эмбеддщиков вон тоже миллионы не надо, а на деле очень полезные и важные ребята.

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