LINUX.ORG.RU
ФорумTalks

[размышления]Так ли убог C++ как его малюют?

 


0

4

Стандартный набор аргументов хаяльщиков C++ следующий:

небезопасный, нет сборщика мусора; можно попортить память и сидеть много лет под дебаггером.

В любых более-менее серьезном проекте, не важно какой язык Java/C++/Lisp/whatever, пишут документацию и тесты (лисперы ведь пишут тесты, правда?). Так что у ошибок вида delete NULL и пр. нет шансов. А если какой-то тест падает - то тем проще найти и исправить: какая-нибудь JAVA просто многозначительно промолчит и в релиз войдет бага.

шаблоны == синтаксический сахар, ООП сложен и для гиков.

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

Мое ИМХО: ругают C++ исключительно ниасиляторы, продвигая вперед тем самым маркетинговые машины всяких Java c .NET-ами. А создание действительно качественного софта, будь то C++/Java/.NET, соизмеримы как по деньгам, так и по срокам. Другое дело что ынтерпрайз порой клал на качество... среднее и низкое качество на Java/.NET наверное выходит дешевле.

Ы?


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

Они хоть и делают абсолютнейшее дерьмо, но не дураки, чтобы втыкать себе палки в колеса...

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

> GCC такое скомпилирует, в некоторых версиях даже warning не выведя, но на вызове упадёт. Пара седых волос гарантирована.

Гонишь - обязательно ругнётся на отсутствие return в non-void function

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

> 1. Сложная отладка.

GDB, ведение лога. Различные IDE (я подозреваю, что если релизную версию .NET приложения запустить и она скрэшится, то информации тоже будет не густо).

2. Много шансов напортачить по глупости, и да, сидеть в дебаггере. Пример:

Когда на каждый такой пример пишется 2-3 теста, то все это мгновенно обнаруживается, безо всяких усилий.

3. Убогая стандартная библиотека... сотен мегабайт сторонних библиотек

Шутить изволите? Вся собранная Qt занимает порядка 20и мегабайт (без вебкита). А стандартная библиотека python-а, если сравнивать с Qt, - так вообще проигрывает.

4. Очень плохая стандартизация. Дважды переносил код под оффтопиком: MinGW -> VS, Borland C++ -> VS. Оба раза чуть не поседел.

Тесты, тесты, тесты... сразу видно что проект был без тестов ;)

Питон тоже не панацея. С ходу две критичные претензии: - переход к 3000: половина сторонних либ просто перестала работать; - GIL и все вытекающее.

LORd
() автор топика
Ответ на: комментарий от mono

> Мда, значит .NET пропагандируем, но основные продукты без всякого

.NET. Я разочарован в MS.


Мало того, они для офиса ещё очень давно собственную оконную систему написали и стандартные виндовый оконный API практически не используют. Я когда ещё коду в 2002 в него Spy++ потыкал так просто культурный шок испытал. У MS так давно: продают и рекламируют одно, а сами для реальной разработки используют другое...

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

> Мой выбор - Python, но, увы, не всегда переход возможен(

Да, а еще его GC не умеет циклические ссылки разруливать. Несерьезно в общем

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

> Несерьезно в общем

Так и приличного софта на нём нет. На жабе Vuze хотя бы, а на этом уг...

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

1. Сложная отладка.

Использование valgrind-а решает почти на 100% все проблемы с памятью. Если нет возможности его применять, есть разные библиотеки, которые тоже помогают, не так хорошо, конечно.

GCC такое скомпилирует, в некоторых версиях даже warning не выведя, но на вызове упадёт. Пара седых волос гарантирована.

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

4. Очень плохая стандартизация

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

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

Использование valgrind-а решает почти на 100% все проблемы с памятью.

Только недавно писало про проблему, которую Valgrind не смог отловить. Банальный index out of bounds.

Код должен компилироваться без warning-ов

Так он и компилировался.

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

Это такая утопия?

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

ведение лога

Не помогает

GDB

не помогает

А стандартная библиотека python-а, если сравнивать с Qt, - так вообще проигрывает.

Разве что в отсутствии GUI. Работа с сетью в Qt архиубога.

Тесты, тесты, тесты... сразу видно что проект был без тестов ;)

Предсказатель из тебя никакой. Были тесты. А толку?

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

>Только недавно писало про проблему, которую Valgrind не смог отловить. Банальный index out of bounds.

Отлично, но при чем здесь С++?

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

Гонишь - обязательно ругнётся на отсутствие return в non-void function

С -Wall - да. Без - не факт. Ну не думал я, что без -Wall такие серьёзные вещи могут не вывестись.

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

При том, что отладка очень сложна. Читать надо, на что отвечаешь.

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

> Разве что в отсутствии GUI. Работа с сетью в Qt архиубога.

И в чем же заключается убогость работы сетью в Qt, просветите пожалуйста?

Предсказатель из тебя никакой. Были тесты. А толку?

А в чем были проблемы? не тролинга ради

LORd
() автор топика
Ответ на: комментарий от Divius

Только недавно писало про проблему, которую Valgrind не смог отловить. Банальный index out of bounds.

Ссылку можно? Не видел.

Это такая утопия?

Почему утопия?

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

> В моем понимании «качественный софт» - это по сути хорошо документированный код с тестами.

Это хороший код, а не софт.

А хороший софт, это тот который решает задачи человека.

Опять же: все зависит от подхода к разработке и ожидаемому качеству. Неужели XP+TDD+DDD на C++ намного сложнее чем на Java/.NET?

Ощутимо сложней. Это то и ощутила вся отрасль. И выбор этой отрасли потому таков каков есть.

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

То есть адепты С++ пытаются рассуждать не от факта, а от какой-то надуманной идеи.

А факт таков: область применения С++ точно НЕ расширяется, и даже не смог вытеснить plain С. Не стал и массовым языком прикладного и заказного программирования (не говоря о веб, а Java и туда кроме php влезла). Что говорит о том что есть в нем, ЯП какие то свойства, препятствующие «победе».

Вот и нужно искать их, эти свойства. От фактов нужно исходить, от фактов, а не придумок.

Но понятно и другое. Большинство так называемых «программистов на С++» студенческая молодежь, ищущая место в жизни. И как у всякого молодого человека, который пока никто и звать его никак - способ №1 - выпендрится.

Я на plain C писал в начале 90ых. Потом на С++, потому что тогда не было ничего другого. Последние 5 лет... зачем, если за то же время я более функциональное ПО напишу на Java? Я не пишу ни игр, ни серверов БД, ни драйверов. И крупносерийных продуктов не пишу.

Что пишут на С++ великие программисты с форумов? Или, может они уже руководители проектов, а потому весомо их мнение «все дело в подходе»? Они так наладили свои проекты что стоимость конечного ПО уже сравнялась с ПО на Java/.NET той же функциональности?

Вот, LORd, ответьте себе (на публике понятно понты не позволят) - сколько лет вы профессионально программируете? Что написали, и какая у вас должность в реале?

ВЫ - наладили тот подход о котором говорите? Сколько человек у вас в команде, компании? И т.д.

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

-Wall (+ -Wextra) должно быть, это тоже само собой разумеется!

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

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

Влезу в ваш разговор, но вы за все отрасли не говорите. Кроме Ытерпрайза с их гибернейтами есть ещё мноооого чего... И много где Java не очень-то уместна.

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

И в чем же заключается убогость работы сетью в Qt, просветите пожалуйста?

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

А в чем были проблемы? не тролинга ради

А как тесты помогают переносить код? Студия меня заставила, например, дописать у некоторых классов операторы (operator= или ==, не помню), которые я лично не использую. Что-то там внутри Qt потребовало.

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

С чего мне на себя жаловаться? Может GCC ещё по-умолчанию об ошибках сообщать не должен?

Вы сами писали:

-Wall (+ -Wextra) должно быть, это тоже само собой разумеется!

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

Divius
()

Как вы достали уже со своим C++. Давайте лучше Сашеньку Грей обсудим.

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

Банальный index out of bounds.

Ссылку можно?

Ссылку я тоже не знаю, но разве valgrind уже умеет ловить такие ошибки для массивов, размещенных на стеке:

#include <iostream>

int main()
{
  int a[2];
  int b = 0;
  a[2] = 1;
  std::cout << "b = " << b;
  return 0;
}

?

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

> Может GCC ещё по-умолчанию об ошибках сообщать не должен?

Почему вообще инструмент должен делать хоть что-то по умолчанию кроме основной функции (компиляции)?

Главное (ИМХО) - не надо полагаться на умолчания - читайте инструкцию.

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

> Тесты, тесты, тесты... сразу видно что проект был без тестов

И не надо молится на тесты. Каждые 3-5 лет появляется новомодная штучка. А TDD - уже не новомодная, вы отстали. Критики на веру в TDD уже немало есть. TDD, как уже выяснилось после нескольких лет повсеместного применения не спасает от очень многого.

Ни от кривой архитектуры, ни от проблем в многопотоковых программах, и даже от утечек памяти и наведенных ошибок - вечного бича С/С++ не спасает.

И вот от такого - http://eao197.blogspot.com/2010/10/progflame_25.html - тоже не спасает.

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

Почему вообще инструмент должен делать хоть что-то по умолчанию кроме основной функции (компиляции)?

То есть создавать _рабочие_ программы - уже не его основная функция

Главное (ИМХО) - не надо полагаться на умолчания - читайте инструкцию.

Не unix-style, ибо нарушает принцип наименьшей неожиданности.

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

Должен, но идеальных инструментов нет, вот и Valgrind тоже пропускает кое-какие вещи.

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

QTreeView падает на мой модели в drawRow()

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

Утопия, потому что стандарт никем фактически не поддерживается.

gcc и msvc достаточно хорошо поддерживают, обычно этого вполне хватает.

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

> И вот от такого - http://eao197.blogspot.com/2010/10/progflame_25.html - тоже не спасает.

«Несколько раз за мою бытность C++ником происходили случаи, когда мои C++ные программы падали, а я не мог объяснить причины этого. Причем всегда это было связано с Visual C++ компиляторами.» - как хорошо, что я пользуюсь gcc only ;-)

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

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

Ну, вот и всё.

gcc и msvc достаточно хорошо поддерживают, обычно этого вполне хватает.

Вот только не очень-то они совместимы, как я уже писал

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

Да, прошивки станков с ЧПУ - на плайн Си. Сервера БД - на С с классами. Ядра ОСей, и сами виртуальные машины - тоже на С и/или С++

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

А вот Android - будет. Симбу уже уел, остался MeeGo не взлетевший.

Но я и не переживаю что Java, php, 1C, ..., - не везде уместны. А вот почему переживают С++нисники, лисперы с хаскелистами, да, интересно.

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

> Вот, LORd, ответьте себе (на публике понятно понты не позволят) - сколько лет вы профессионально программируете? Что написали, и какая у вас должность в реале?

ВЫ - наладили тот подход о котором говорите? Сколько человек у вас в команде, компании? И т.д.

Скажем так: я являюсь свидетелем того, как мои коллеги наладили этот процесс, и как это все замечательно работает. Коллектив порядка 10-и человек, уже года полтора идет. С++ и Qt.

А c java-ой близко мне не приходилось сталкиваться, напротив: единственный джавовский продукт в нашей конторе считается самым ущербным и проблемным. Потому я и удивляюсь, и вопросы такие задаю

LORd
() автор топика
Ответ на: комментарий от Skynin

> Каждые 3-5 лет появляется новомодная штучка

И как мне мешает для каждой штучки написать по тесту?

А TDD - уже не новомодная, вы отстали

Я за модой не гонюсь.

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

А если бы это была Java? Кривая архитектура - пожалуйста. Проблемы в многопотоковых - не знаю как там с синхронизацией, но в .NET-е точно нужно синхронизировать - такие же проблемы; наведенные ошибки -... это все упущения менеджеров, которые допустили до тела быдлокодера. Тут уж язык не спасет: каким бы язык не был замечательным - через год работы быдлокодера ЭТО поддерживать уже будет невозможно.

LORd
() автор топика
Ответ на: комментарий от Legioner
$ cat stack_alloc_array.cpp 
#include <iostream>

int main()
{
  int a[2];
  int b = 0;
  a[2] = 1;
  std::cout << "b = " << b;
  return 0;
}

$ valgrind --version
valgrind-3.6.0.SVN-Debian

$ valgrind ./stack_alloc_array
==4528== Memcheck, a memory error detector
==4528== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==4528== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==4528== Command: ./stack_alloc_array
==4528== 
b = 1==4528== 
==4528== HEAP SUMMARY:
==4528==     in use at exit: 0 bytes in 0 blocks
==4528==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==4528== 
==4528== All heap blocks were freed -- no leaks are possible
==4528== 
==4528== For counts of detected and suppressed errors, rerun with: -v
==4528== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 19 from 8)
kamre
()
Ответ на: комментарий от kamre

Понятно. Ну хотя бы программа не упадет без стектрейса через 2 секунды :)

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

> Коллектив порядка 10-и человек, уже года полтора идет. С++ и Qt.

И что пишите? Мне вот как раз интересно что же пишут на С++ + Qt, потому что я этого софта не вижу нигде. Не то что написано другими, а вот что пишут эти 10 человек?

А если бы это была Java? Кривая архитектура - пожалуйста. Проблемы в многопотоковых - не знаю как там с синхронизацией, но в .NET-е точно нужно синхронизировать - такие же проблемы;

Не такие же. Утверждать что такие же, это как говорить что везде убивают, и потому нет разницы между войной и мирным временем: «вона, соседа вчера у подъезда зарезали насмерть!». Или в С++ нет проблем с синхронизацией в многопотоковых приложениях? Или в С++ не бывает кривой архитектуры? А вот что кроме этого бывает - известно - постоянная маета с ручным выделением памяти и далее по списку.

Так я не понимаю вашей аргументации: С++ крут, потому что в нем бывают все проблемы Java/.NET да плюс-плюс своих кучи?

Давайте по другому: Вы пробовали писать на Java? Не хелло ворлд, а как положено программисту - каждые 2-3 года выучить новый ЯП.

И как мне мешает для каждой штучки написать по тесту?

А кому - мешает? Я же сказал что TDD от очень многих вещей - не спасает, чтобы так веровать в нее.

Тут уж язык не спасет: каким бы язык не был замечательным - через год работы быдлокодера ЭТО поддерживать уже будет невозможно.

А кто вам сказал что вы - не быдлокодер? Вы сами так решили потому что что-то пишите на С++? :D

Ваш код, уже сколько лет сопровождают другие, что вы так уверены?

И сработает ли мой аргумент - «а если наладить разработку так что быдлокодеров в ней не будет»? ;)

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

У меня и т.н. «офис 2007» на запустится (разве что если в виртуалбоксе поставить для начала пиратский мастдай) :)

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

> Популярность plain C растёт! Радуюсь!

Я по диплому схемотехник. Скукота прошивки для ЧПУ писать как по мне... Но, дело вкуса, вам нравится - пишите. Миру нужны и такие устройства. У меня сослуживец, в конце 90ых в Германию уехал, так до сих пор на plain C и пишет. Его контора как раз субподрядчиком производителей пром оборудования и выступает.

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

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

>То есть создавать _рабочие_ программы - уже не его основная функция

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

RADO
()
Ответ на: комментарий от kamre
cat stack_alloc_array.cpp 

#include <iostream>

int main()
{
  int a[2];
  int b = 0;
  a[2] = 1;
  std::cout << "b = " << b;
  return 0;
}

cppcheck stack_alloc_array.cpp

Checking stack_alloc_array.cpp...
[stack_alloc_array.cpp:7]: (error) Array 'a[2]' index 2 out of bounds

Гораздо понятнее, ИМХО ;-)

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

Тогда предлагаю убрать проверку на ошибки, компилировать, как придётся.

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

> Гораздо понятнее, ИМХО ;-)

Это ж просто чтобы показать, что valgrind не всесилен. В реальности индекс будет вычисляться в runtime и никакой cppcheck такое не отловит.

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