Что Вам мешает в С++?
От: remark Россия http://www.1024cores.net/
Дата: 21.06.08 15:34
Оценка: +1 -3
Регулярно можно слышать критику в адрес С++, что дескать язык морально устаревший, что время разработки на С++ неприлично большое, что в С++ постоянно приходится сражаться с ветряными мельницами. Посему хочется провести следующий опрос среди коллег С++ программистов.

Что Вам мешает в С++?

Моменты можно приводить любые от ядра языка и до инструментальных средств, но при этом накладываются следующие ограничения:
1. Мешать это должно регулярно. Т.к. если это мешает эпизодически, например, раз в год, то это не интересно, т.к. раз в год можно и потерпеть, и на общей эффективности разработки это не сказывается.
2. Это должно быть решено в других промышленных языках. Т.к. если это не решено хотя бы в одном другом промышленном языке, то это не интересно, т.к. это не проблема С++, а просто общая проблема. Если не очевидно, то желательно указывать языки, в которых это решено.

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


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: Что Вам мешает в С++?
От: Аноним  
Дата: 21.06.08 15:42
Оценка: 19 (4) +2
R>Что Вам мешает в С++?
Как ни парадоксално — свобода в выборе стиля. Можно писать в стиле старого доброго С, можно использовать шаблоны и прочие прелести ФП, можно ООП, можно даже автоматическое управление памятью, которое по мне так даже удобнее GC. Проблема в том что когда проект пишет сотня человек у каждого из который свое понятие "правильности" — вот это то и мешает в С++.
Re: Что Вам мешает в С++?
От: den123 Израиль http://den123.smugmug.com
Дата: 21.06.08 15:42
Оценка: 16 (1) +2
Здравствуйте, remark, Вы писали:

...
R>Что Вам мешает в С++?
...

Ничего.

Есть большой опыт работы на Java, C#, Fotran, Algol, PL/1 и еще много чего было.

Язык программирование выбираю по обстоятельствам (задача, среда, ОС, условия, время написания, доп. требования заказчика и т.д и т.п). Или мне его уже выбрали.
WBR — Yuriy
Re: Что Вам мешает в С++?
От: Roman Odaisky Украина  
Дата: 21.06.08 15:51
Оценка: +3
Здравствуйте, remark, Вы писали:

R>Что Вам мешает в С++?


1. Библиотеки. Нужны комментарии?
2. IDE. Нужны комментарии?

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

(Например, можно было бы из кода
DECLARE_MEMBERS((int, x)(std::string, y)(whatever, z))
получать код
typedef std::tr1::tuple<int, std::string, whatever> types;
types m_members;
types& get_all_members();

int x();
void set_x(int);

std::string const& y();
void set_y(std::string const &);
void set_y(std::string &&);

whatever& z();
void set_z(boost::call_traits<whatever>::param_type);
void set_z(whatever &&);
и т. д.)
До последнего не верил в пирамиду Лебедева.
Re: Что Вам мешает в С++?
От: Аноним  
Дата: 21.06.08 15:51
Оценка: +1
Здравствуйте, remark, Вы писали:

Ничего не мешает из того что есть, даже наоборот много чего не хватает
Re: Что Вам мешает в С++?
От: merk Россия  
Дата: 21.06.08 16:40
Оценка: 16 (4) +3 -3 :)))
Здравствуйте, remark, Вы писали:

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


R>Что Вам мешает в С++?


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

R>1. Мешать это должно регулярно. Т.к. если это мешает эпизодически, например, раз в год, то это не интересно, т.к. раз в год можно и потерпеть, и на общей эффективности разработки это не сказывается.
R>2. Это должно быть решено в других промышленных языках. Т.к. если это не решено хотя бы в одном другом промышленном языке, то это не интересно, т.к. это не проблема С++, а просто общая проблема. Если не очевидно, то желательно указывать языки, в которых это решено.

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


R>


проблема в том, что других "промышленных" особо и нет. хотя есть языки просто красивые. например Mоdula-2.

недостатки с++
1. совместимость с С. в С просто видна история развития и затыкание синтаксических дыр.
например значок -> как сокращение косорукой(из-за лексики С) необходимой записи (*p).name.
авторы С явно сначала и не думали использовать структурные типы, и видимо клепали точное подобие какого-нить ассемблера PDP-11. по крайней мере чтобы при не особосложном компиляторе получить прямое отображение С в ассемблер. хвосты автоинкрементов и автодекрементов просто торчат оттуда. там была такая мода адресации — автодекремент и автоинеркемент.
2. аццки подозрительная форма записи типов. когда я переходил с модулы на с, долго не мог понять — какая вообще в С схема записи сложного типа. каша какая-то. оказалось проще. в сущности принята идиотская форма записи —
базовый тип, использование переменной с именем name.
int *name просто следует читать как — если взять переменную name и ее значение считать как указатель, то он будет указывать на нечто типа int. массив например int name[10] нужно читать как — если взять name c неким индексом в виде name[x] получишь int. вы чувствуете косорукость подхoда? тип в данном определении раскидан по декларации и понять что он массив, можно только после прочтения что там стоит за именем переменной?
сравните нормальную декларацию, она должна быть локальной.
var: ARRAY OF INT. скажите длинно? но это лишь символы. перелицуйте в такое []int.
получится вроде
var:[]int
обьявление шиворот навыворот приводят к необходимости просмотра компилятором на несколько символов вперед, чтобы понять что делать ему в данном месте.
это явно какая-то дырозатыкательная эволюция еще внутри C.

форма преобразования типа — (typename) var. че за конструкция? преобразование типа можно считать как вызов функции с именем типа, возвращающей значение нужного вам типа. то есть должна быть форма typename(var).

3. нет четкого понятия модуля с импортом и экспортом. хидеры — чисто инклудные файлы для обработки препроцессором. препроцессирование вещь иногда необходимая, но нельзя на нее перекладывать например обьявления обычных констант. ну наконец "модули" ввели в java и c# через uses и пакеты. в C++ ввели namespace. но это не модули в нормальном понимании. В С и C++ силу излишней свободы фактически нет средства вытоматически собирать программу, поскольку вообще неясно из каких файлов она состоит! появились даже профессии писателей make файлов — ненужная профессия для нормального языка. автоматизация сборки привела к рождению аж внеязыковых специальных тулов.
вообще по С++ проходится сам страуструп. с его советами, что не стоит делать в С++.
ну и выкиньте это на помойку. и сделайте нормальный синтаксис. и получите нормальный язык.
только это невыгодно промышленности.
обрушатся мегатонны вымученных текстов на этом сверх-типо языке. а это огромные затраты.
Re[2]: Что Вам мешает в С++?
От: Аноним  
Дата: 21.06.08 16:48
Оценка:
Здравствуйте, merk, Вы писали:

M>форма преобразования типа — (typename) var. че за конструкция? преобразование типа можно считать как вызов функции с именем типа, возвращающей значение нужного вам типа. то есть должна быть форма typename(var).


Так ведь есть такая форма.
int i = int(1.2);
Re[3]: Что Вам мешает в С++?
От: merk Россия  
Дата: 21.06.08 17:17
Оценка: +1 -1
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, merk, Вы писали:


M>>форма преобразования типа — (typename) var. че за конструкция? преобразование типа можно считать как вызов функции с именем типа, возвращающей значение нужного вам типа. то есть должна быть форма typename(var).


А>Так ведь есть такая форма.

А>
А>int i = int(1.2);
А>


и что? для любой фичи должно быть четкое обоснование. поскольку любая возможность в языке ложится в стандарт и код компилятора. ну написшите еще 8 способов записи преобразования и обьявите это свободой. потом ищите компилятор соответсвующий стандарту.
Re: продолжение банкета
От: merk Россия  
Дата: 21.06.08 17:42
Оценка: -4 :))) :))
арзхаичная форма оператора if
if (condition) operator
else operator;

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

тогда как очевидно, что if — просто форма short sircuit evaluation в булевских выражениях.
и форма должна быть такой
if (condition) operator
elsif (condition) operator
...
else (condition) operator

далее. язык то не строго типизированный! иначе в нем бы не было стольких символов разнообразных операций
вроде логическое OR, битовое OR и так далее.
оказывается в логическом выражении можно писать и так и так, нормальный новый компилятор даст варнинг, что мол битовая операция вместо логической — вы уверены? тогда как для логического типа применимы только логические операции. хотите битовую? преобразуйте к множеству.
короче число операций вздуто в силу корявой типизации. унаследованной от нетипизированного всерьез С.
Re: Что Вам мешает в С++?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 21.06.08 17:44
Оценка: 17 (2)
Здравствуйте, remark, Вы писали:

R>Что Вам мешает в С++?


Позволю себе дать ссылку на самого себя:
Что не так с C++
Почему я ищу новый язык?

Но нужно обязательно оговорится, что пока лучше, чем C++ для себя я пока не нашел. Хотя ближе всего к тому, что хотелось бы -- Eiffel. Еще бы найти время на Ada2005 посмотреть


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[2]: Что Вам мешает в С++?
От: Аноним  
Дата: 21.06.08 18:13
Оценка:
Здравствуйте, eao197, Вы писали:

E>Но нужно обязательно оговорится, что пока лучше, чем C++ для себя я пока не нашел. Хотя ближе всего к тому, что хотелось бы -- Eiffel. Еще бы найти время на Ada2005 посмотреть


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


Что-то действительно не верится
Re: Что Вам мешает в С++?
От: Alexander G Украина  
Дата: 21.06.08 18:19
Оценка: 16 (1) -1
Здравствуйте, remark, Вы писали:

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


R>Что Вам мешает в С++?


Я начинал с Delphi, поэтому что мешает:

1. Отуствие finally. Да, я в курсе про RAII, смарт-поинтеры в т.ч. с кастомными деаллокаторами и скоп гарды. Но меня не устраивает навязывание ООП здесь. Выходит, что С++ не поддершивает стиль старого дорбого С (хотя вроде как пытается поддерживать и С и ООП и даже ФП). Сюда же то, что деструктор не вызовется для недоделаных объектов (в Delphi — вызовется), что требует не только помещать ресурсы в классы, но и помещать кажды ресурс в свой класс. If I hear the phrase``everything is an object'' once more, I think I will scream.

2. Наследие С. Выражается в недостаточной типизации. Пример: '\0' NULL и 0 — совместимы, причём последние 2 вообще одно и то же. В паскале nil 0 и #0 компилятор не даст попутать if (p) p = 0 /* я пропустил * перед p но компилятор не проглотил, т.к. nil и 0 одно и то же */. Также в С путают указатель с массивом. И выражение с операцией. Возможностью написать короче пользоваться не приходится, т.к. требуется написать понятнее, но ошибки типа if (a = b) сделать всё равно можно.

3. Я не могу клепать формы на WTL так быстро, как это получалось в Delphi
Русский военный корабль идёт ко дну!
Re[2]: Что Вам мешает в С++?
От: remark Россия http://www.1024cores.net/
Дата: 21.06.08 18:48
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

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


Тут не очень понятно. Можешь это явно связать с вопросом.

RO>(Например, можно было бы из кода
DECLARE_MEMBERS((int, x)(std::string, y)(whatever, z))


Ну так а что мешает его получать?

Из него можно вообще много чего получить
https://sourceforge.net/forum/message.php?msg_id=4180732


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: Что Вам мешает в С++?
От: OCTAGRAM Россия http://octagram.name/
Дата: 21.06.08 18:52
Оценка:
merk пишет:

> 2. аццки подозрительная форма записи типов. когда я переходил с модулы

> на с, долго не мог понять — какая вообще в С схема записи сложного типа.
> каша какая-то. оказалось проще. в сущности принята идиотская форма записи —
> базовый тип, использование переменной с именем name.
> int *name просто следует читать как — если взять переменную name и ее
> значение считать как указатель, то он будет указывать на нечто типа int.
> массив например int name[10] нужно читать как — если взять name c неким
> индексом в виде name[x] получишь int. вы чувствуете косорукость подхoда?

BiDi, но не Юникод Говорят, дизайнеры этих языков не только писали в
разные стороны, но и думали таким же образом.

> тип в данном определении раскидан по декларации и понять что он массив,

> можно только после прочтения что там стоит за именем переменной?
> сравните нормальную декларацию, она должна быть локальной.
> var: ARRAY OF INT. скажите длинно? но это лишь символы. перелицуйте в
> такое []int.
> получится вроде
> var:[]int

> обьявление шиворот навыворот приводят к необходимости просмотра

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

Парсер там в том числе на семантику идентификаторов завязан. Самое
обидное, что хедеры в–основном, для этих языков. Вот любой другой язык
какой ни возьми, биндиться к нему 90 против 10 будет одно удовольствие.
Ан нет, по закону подлости нужно нырять именно в это болото.

--
ISO/IEC 8652:1995/Amd 1:2007
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Что Вам мешает в С++?
От: remark Россия http://www.1024cores.net/
Дата: 21.06.08 19:12
Оценка: +1
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, remark, Вы писали:


R>>Что Вам мешает в С++?


RO>1. Библиотеки. Нужны комментарии?


Нужны. Желательно с учётом 2 указанных пунктов.

RO>2. IDE. Нужны комментарии?


Нужны. Желательно с учётом 2 указанных пунктов.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: Что Вам мешает в С++?
От: remark Россия http://www.1024cores.net/
Дата: 21.06.08 19:14
Оценка: :)
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, remark, Вы писали:


А>Ничего не мешает из того что есть, даже наоборот много чего не хватает


Отсутствие тоже вполне может мешать. Так что прошу высказываться по существу, отсутствие чего мешает, как часто, в каких языках это есть?


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: Что Вам мешает в С++?
От: StevenIvanov США  
Дата: 21.06.08 20:05
Оценка: +1
Здравствуйте, remark, Вы писали:

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


R>Что Вам мешает в С++?


отсутствие мощности и выразительности лиспа. Насколько это красивый язык — и не описать.

Если сравнивать с другими императивными языками —

1) Очень высокая сложность языка.
следствия:
— сложность обучения => сложность подготовки специалистов (контрпример — тот же Lisp, который описывается несколькими предложениями и вообще прост как 3 рубля. Либо тот же VB )
— сложность написания спец тулов (для С# и рефакторер нормальный есть и форматтер и дебаггер и еще куча всего. Для С++ тоже вроде как есть, но какое-то некрасивое все)
— сложность написания компилятора 100% соответствующего стандарту (только Comeau C++ 100% ISO compliant). Из за этого еще одно "под-следствие" — internal compiler error'ы Я лично сталкивался несколько раз
— сложность в разработке coding standards/coding practices

2) Устаревшая система сборки сложного проекта (#include/подключение сторонних библиотек/build проекта) — уже упоминалось. Решено в C#.

3) Непродуманная стандартизация.
— Включены малополезные вещи типа экспорта шаблонов и теневой системы типов, исключено такое, как например стандарт на манглер, что не позволяет по-человечески экспортировать класс в библиотеке, который можно использовать в проекте, собираемом другим компилятором (этой частной проблемы нет, например в C#).
— Можно еще много чего вспомнить, надо только вот полазить по этому форуму, но лень что-то.

4) Невозможность быстро экспортировать в С++ крупный проект на С — возникает куча утомительных ошибок с преобразованием типов и проч. Не совсем недостаток, просто drawback из-за того, что в С++ введены такие вещи, как строгая типизация

5) Макросы, живущие отдельно от языка. Причина многих бед и катаклизмов Контрпример — в LISP макросы не являются злом, напротив придают языку колоссальную мощь.


А так язык — во
Re: Что Вам мешает в С++?
От: StevenIvanov США  
Дата: 21.06.08 20:08
Оценка: 39 (4)
Здравствуйте, remark, Вы писали:

R>Что Вам мешает в С++?


если вкратце — отсутствие мощности и выразительности лиспа. Насколько это красивый язык — и не описать.

подробнее —

1) Очень высокая сложность языка.
следствия:
— сложность обучения => сложность подготовки специалистов (контрпример — тот же Lisp, который описывается несколькими предложениями и вообще прост как 3 рубля. Либо тот же VB )
— сложность написания спец тулов (для С# и рефакторер нормальный есть и форматтер и дебаггер и код-эксплорер в одной IDE и еще куча всего. Для С++ тоже вроде как есть, но какое-то некрасивое все)
— сложность написания компилятора 100% соответствующего стандарту (только Comeau C++ 100% ISO compliant). Из за этого еще одно "под-следствие" — internal compiler error'ы Я лично сталкивался несколько раз
— сложность в разработке coding standards/coding practices

2) Устаревшая система сборки сложного проекта (#include/подключение сторонних библиотек/build проекта) — уже упоминалось. Решено в C#.

3) Непродуманная стандартизация.
— Включены малополезные вещи типа экспорта шаблонов и теневой системы типов, исключено такое, как например стандарт на манглер, что не позволяет по-человечески экспортировать класс в библиотеке, который можно использовать в проекте, собираемом другим компилятором (этой частной проблемы нет, например в C#).
— Можно еще много чего вспомнить, надо только вот полазить по этому форуму, но лень что-то.

4) Невозможность быстро экспортировать в С++ крупный проект на С — возникает куча утомительных ошибок с преобразованием типов и проч. Не совсем недостаток, просто drawback из-за того, что в С++ введены такие вещи, как строгая типизация

5) Макросы, живущие отдельно от языка. Причина многих бед и катаклизмов Контрпример — в LISP макросы не являются злом, напротив придают языку колоссальную мощь.

6) По сравнению с С# нет вкусностей типа делегатов и потрясающе мощного рефлекшна.

А так язык — во
Re[2]: Что Вам мешает в С++?
От: remark Россия http://www.1024cores.net/
Дата: 21.06.08 20:10
Оценка: +1
Здравствуйте, eao197, Вы писали:

E>Здравствуйте, remark, Вы писали:


R>>Что Вам мешает в С++?


E>Позволю себе дать ссылку на самого себя:

E>Что не так с C++
E>Почему я ищу новый язык?


[Оффтоп]

То, что в Ruby пишется так:
a = [ ... ]
b = []
c = []
a.each do |item|
  if item > 0
    b << item
  else
    c << item
  end
end


в С++ не обязательно писать так:
typedef std::vector< SOME_TYPE > vector_t;

class selector_t
  : public std::unary_function< const SOME_TYPE &, void >
  {
    vector_t & b_;
    vector_t & c_;
  public :
    selector_t( vector_t & b, vector_t & c )
      : b_( b ), c_( c )
      {}
    result_type operator()( argument_type item )
      {
        if( item > 0 )
          b_.push_back( item );
        else
          c_.push_back( item );
      }
  };

vector_t a; ...
vector_t b;
vector_t c;
std::for_each( a.begin(), a.end(), selector_t( b, c ) );


Можно и так:
vector_t a, b, c;
BOOST_FOREACH(SOME_TYPE item, a)
  (item > 0 ? b : c).push_back(item);




1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: Что Вам мешает в С++?
От: remark Россия http://www.1024cores.net/
Дата: 21.06.08 20:19
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Здравствуйте, remark, Вы писали:


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


R>>Что Вам мешает в С++?


AG>Я начинал с Delphi, поэтому что мешает:


AG>1. Отуствие finally. Да, я в курсе про RAII, смарт-поинтеры в т.ч. с кастомными деаллокаторами и скоп гарды. Но меня не устраивает навязывание ООП здесь. Выходит, что С++ не поддершивает стиль старого дорбого С (хотя вроде как пытается поддерживать и С и ООП и даже ФП). Сюда же то, что деструктор не вызовется для недоделаных объектов (в Delphi — вызовется), что требует не только помещать ресурсы в классы, но и помещать кажды ресурс в свой класс. If I hear the phrase``everything is an object'' once more, I think I will scream.


Ок. Принимается.

AG>2. Наследие С. Выражается в недостаточной типизации. Пример: '\0' NULL и 0 — совместимы, причём последние 2 вообще одно и то же. В паскале nil 0 и #0 компилятор не даст попутать if (p) p = 0 /* я пропустил * перед p но компилятор не проглотил, т.к. nil и 0 одно и то же */. Также в С путают указатель с массивом. И выражение с операцией. Возможностью написать короче пользоваться не приходится, т.к. требуется написать понятнее, но ошибки типа if (a = b) сделать всё равно можно.


А как часто это вызывает ошибки?
'if (a = b)' ловится msvc как 'assignment inside if, don't you mean ==?'. Поэтому лично на такое давно не натыкался, хотя по привычке пишу нелепое '2 > x'
А вот 'p = 0' вместо '*p = 0' наверное в С++ действительно невозможно отловить...

AG>3. Я не могу клепать формы на WTL так быстро, как это получалось в Delphi


А в чём причина?


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.