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)
Ответ на: комментарий от anonymous

Феноменальный успех Scala!!! По популярности на 37-м месте. на 6 мест хуже чем Фортран, на 12 хуже чем Лого, и на 20 мест хуже чем совершенно нишевый язык матлаба :)

А вот умирающий С++ на третьем. И уж совсем пародоксально, что что простейший С, в котором нет почти НИЧЕГО, оказался на втором.

vromanov ★★★
()

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

Тем не менее, топ-вакансия среди программистов всех сортов. Уж что-что, а со знанием крестов работу можно найти в любой точке цивилизованного мира.

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

Scala появилась в 2003 году, и конкурирует с тысячами других новых языков, которые сейчас только ленивый не пишет. Си и Си++ царствовали в два рыла целую вечность. Твоя предъява выглядит как вывод что типа если линукс на десктопе используют 2% людей, то линукс - говно.

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

Они и сейчас царствуют. Только в дектопиках их подвинули Java и С#. На Scala фактически только с Java уходят.

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

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

ErasimHolmogorin
()

Почему в треде до сих не процитировали классическое произведение?

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

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

охренеть, я - легенда

Велика честь. Ты — экспонат кунсткамеры. На одной полке с Золотцем, Наггумом и Луговским.

Хотя да, фейл твоего стартапа действительно легендарен.

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

Скажу крамольную вещь, но линукс действительно говно как десктоп система. Если бесплатная система смогла привлечь к себе всего 2% - это эпик фэйл. Это значит, что она ЗНАЧИТЕЛЬНО хуже платных систем.

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

Хотя да, фейл твоего стартапа действительно легендарен.

С каких это пор домашние школопроекты называются «стартапами»?

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

Виноват, надо было заключить в кавычки и написать «ололостартап», так было бы точнее.

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

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

причинам 10 системного и никоуровневого программирования

Диванный аналитик такой диванный. Исключения не имеют никакого отношения к низкоуровнему программированию

/Нить

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

Десктоп — это фантастика. Что такое десктоп, в самом деле?

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

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

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

По моей логике нет никакого первого места) Первое место надо считать относительно какой-то конкретной задачи. Может, в рейтинг какой-то конкретной задачи не войдет вообще ни один язык из того списка. (Ну и отсчет времен неплохо бы делать года с 2010 года только для нового кода, и обнулять счетчик каждые 10 лет)

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

D - убожество, в нём, вроде даже шаблонов нет.

Советую Вам, прежде чем вступать в дискуссию, ознакомиться с предметом обсуждения. Это, возможно, обезопасит Вас от шумной посадки в лужу, как это только что произошло с Вами.

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

Десктоп вообще не нужен. И никогда не был нужен.

...а также профессиональная работа с аудио, видео, графикой, 3D, физическое моделирование?

То, что лично тебе «не нужен десктоп», лишь описывает, насколько узок круг твоих интересов. Его можно на 100% удовлетворить планшетом (вконтактик, фейсбучек, хабрахабрик) и ноутбуком (игры). Но в среде профессионалов десктоп был, есть и будет востребованным.

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

D - убожество, в нём, вроде даже шаблонов нет. Современный язык без шаблонов - это ппц.

http://dlang.org/template-comparison.html

Александреску обедает шаблонами

Шок фото Александреску съел шаблон факториала: http://commons.wikimedia.org/wiki/File:AndreiAlexandrescu.jpg

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

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

У него в резюме написано: «хочу 120К».

Это не деньги.

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

нет ну на самом деле: вы рассказали компилятору, что переменная не должна изменяться внутри программы непосредственно, но _должна_ изменяться из внешнего источника. так что же вы желали увидеть на выходе? что он не позволит изменить её по ссылке? ЭТО ППЦ.

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

а ссылки в нём есть? ЕМНИП там какое-то убожество с out параметрами

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

серьёзно? в лужу? ну ок, шаблоны есть - есть. сборки мусора нет? нет. бла-бла-бла, ещё несколько итераций, теперь перечитываем сообщение топикстартера и видим, что к D те же претензии, что и к С++

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

А теперь внимательно перечитывайте своё же сообщение в топике.

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

как замена плюсов, оговорюсь, ибо не все платформы позволяют сборку мусора, ну ой, да?

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

Я же говорю, только на фоне остальных поциентов он выглядит четким пацаном. Естественно, даже сравнения со средним похапешником лавсанчег не выдержит. Но для него не все потеряно!

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

...а также профессиональная работа с аудио, видео, графикой, 3D, физическое моделирование?

А где тут десктоп-то? Ничего общего домашне-офисный «десктоп» с профессиональными рабочими станциями вообще не имеет. И, исторически, именно разнообразные юниксы эту нишу и занимали.

Но в среде профессионалов десктоп был, есть и будет востребованным.

В среде профессионалов десктоп (SOHO-говнецо) вообще никакого интереса не вызывает.

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

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

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

И зачем это? Чтобы довести скорость приложения до скорости приложений на Ява?

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

например, раз уж тут вспомнили D, там можно так:

typedef void* Handle = cast(void*)-1; 
void bar(Handle); 

Handle h; 
bar(h); 
h = func(); 
if (h != Handle.init) ...

но кресты не могут различить typedef и его реализацию, пример косяка:

#define HANDLE_INIT	((Handle)(-1)) 
typedef void* Handle; 
void foo(void*); 
void bar(Handle); 

Handle h = HANDLE_INIT; 
foo(h);	 // это косяк, но никто его не поймает
bar(h);	 // ок

поэтому C++ для того же самого нужно сделать структуру «чтобы была»:

#define HANDLE_INIT	((void *)(-1)) 

struct Handle { 
    void* ptr; 

    // default initializer 
    Handle() { ptr = HANDLE_INIT; } 

    Handle(int i) { ptr = (void*)i; } 

    // conversion to underlying type 
    operator void*()  { return ptr; } 
}; 
void bar(Handle); 

Handle h; 
bar(h); 
h = func(); 
if (h != HANDLE_INIT) ...
stevejobs ★★★★☆
() автор топика
Ответ на: комментарий от stevejobs

Прости, но я СОВСЕМ не вижу тут проблемы. typedef это вообще наследие С.

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

это косяк, но никто его не поймает

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

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

Если вы ещё не поняли, именно D показывает в данном примере УГ, т.к. с какой стати простое переименование должно приводить к возникновению нового типа? Зачем вообще нужен новый _фактический_ тип, если он ведёт себя абсолютно точно также как и старый?

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

Современный язык без шаблонов - это ппц.

скорее, современный язык без дженериков — это ппц

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

Начиная с неоднозначности a<b,c>d; — это что такое? a<b<c>>d; — а это что? Какой наркоман придумал заюзать угловую скоробочку, которая и так уже в 2 разных значениях использовалась раньше? Наверное, если повыкидать этот сраный уголок, тормозной разбор шаблонов уже ускорится в 9000 раз (ускорится и компилятор, и человек читающий). Зачем это сделано? Да просто так! Во имя Сатаны!

или, например, три формы: template declaration, template definition, exported template (пророчество Комитета 14882, глава 14 целиком). «Герб Саттер, секретарь комитета по стандартизации C++, рекомендовал убрать export из будущих версий стандарта по причине серьёзных сложностей в полноценной реализации, однако впоследствии его решили оставить.». А всё от отсутствия вменяемой системы каких-нибудь пакетов/модулей/etc и использования #include.

этот расстрельный список наверняка можно долго продолжать. А всё от чего? От безблагодатности!

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

на самом деле это наследие кривых интерфейсов. Вот возьмем ODBC. там есть хендлы для конектов, стейтментов итд. Все они представляют из себя void*. На самом деле, эти указатели на конкретные структуры, но они скрыты в реализации. Было бы хорошо, чтобы попытка передать туда где ожидается один тип хендла другой, приводила бы к ошибке компиляции. В NPTL сделаны как раз фейковые структуры.

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

Жутко извиняюсь, херню сморозил. Как раз в пророчестве 14882 рассказывается, что была великая битва, и злой export победил пророка нашего Коммитета.

Глава 14, стих 1 (ченжлог):

Change: Remove export
Rationale: No implementation consensus.
Effect on original feature: A valid C++ 2003 declaration containing export is ill-formed in this International Standard.

Вот былинный сказ 2003 года о том, как святые из EDG неравно боролись со злобным экспортом: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1426.pdf

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

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

А еще можно лбом гвозди забивать

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

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

Там где на C# или там Питоне можно написать не очень сложное LINQ выражение или там list comprehension в С++ нужно заводить какие-то дополнительные локальные типы и писать трехэтажные циклы.

http://habrahabr.ru/post/142632/

http://habrahabr.ru/post/180859/

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

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

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

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

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