Хотел бы поинтересоваться у знающих людей, за что весь мир недолюбливает плюсы. Конкретно у меня данный язык вызывает симпатию (возможно потому, что это мой самый первый более менее освоенный язык программирования);
Поделитесь впечатлением и опытом программирования с использованием языка С++?
Холивары просьба не разводить, иначе уйдём не в ту степь обсуждения
Думаю, потому недолюбливает, что С++ требует предельной внимательности и аккуратности.
Большинство же людей (и, соответственно, программеров) с этим не дружат.
Мне С++ нравится. Это второй язык, красоту которого я понял (вернее, третий, поскольку второй был С)
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, bc_kaya, Вы писали:
_>Хотел бы поинтересоваться у знающих людей, за что весь мир недолюбливает плюсы. Конкретно у меня данный язык вызывает симпатию (возможно потому, что это мой самый первый более менее освоенный язык программирования); _>Поделитесь впечатлением и опытом программирования с использованием языка С++? _>Холивары просьба не разводить, иначе уйдём не в ту степь обсуждения
Как человек, которого когда-то уговорили уйти с плюсов на яву и который очень навряд ли вернется:
— библиотеки и управление зависимостями. Для C/С++ есть всё, но найти, подключить и начать использовать чужие библиотеки — нетривиально.
— бедная стандартная библиотека. Хочется нормальную юникодную строку с поддержкой кодировок, регулярок и богатого набора операций. Хочется качественные многопоточные коллекции. Хочется нормальные функции для работы со временем с поддержкой часовых поясов. и т.д. и т.п.
— феерическая сложность языка и сложность написания качественного (устойчивого к утечкам памяти и exception-safe) кода
— значительно меньшая терпимость программы к ошибкам программиста — где managed язык отделается exception-ом, программу на C++ лучше прибить. Это ограничивает применимость в серверных приложениях
— типы ошибок, которых нет в managed языках: порча памяти, утечки памяти
— менее развитый тулинг для отладки, логгирования и обнаружения проблем
— время компиляции
Претензии отсортированы по убыванию важности для меня.
Здравствуйте, scf, Вы писали:
cf>- типы ошибок, которых нет в managed языках: порча памяти, утечки памяти
Это, мягко говоря, не так.
Как минимум жаба, которая крутиться под апачей, под другой платформой, типа, дженкинса, имеет массу утечек, к примеру, в плагинах, так что сервак начинает тормозить и приходится перезапускать.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали:
V>Здравствуйте, scf, Вы писали:
cf>>- типы ошибок, которых нет в managed языках: порча памяти, утечки памяти V>Это, мягко говоря, не так. V>Как минимум жаба, которая крутиться под апачей, под другой платформой, типа, дженкинса, имеет массу утечек, к примеру, в плагинах, так что сервак начинает тормозить и приходится перезапускать.
"Утечкой памяти" в С++ и в Java называют совершенно разные вещи — как по причине возникновения, так и по сложности поиска и устранения.
Здравствуйте, scf, Вы писали:
scf>"Утечкой памяти" в С++ и в Java называют совершенно разные вещи — как по причине возникновения, так и по сложности поиска и устранения.
Снаружи это будет видно как неумеренный жор памяти и провал производительности, с той и с другой стороны. Какой это имеет значения, когда всю систему/пайплайн приходится ресетить?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Слава, Вы писали:
С>PS: Минусующим правда глаза колет
Мы все-таки в 21 веке живем. Всё уже есть — и симпатичные стектрейсы с символами, и дампы с возможностью поднять отладчик, и отправка отчетов на сервер разработчику.
Здравствуйте, bc_kaya, Вы писали:
_>Хотел бы поинтересоваться у знающих людей, за что весь мир недолюбливает плюсы. Конкретно у меня данный язык вызывает симпатию (возможно потому, что это мой самый первый более менее освоенный язык программирования); _>Поделитесь впечатлением и опытом программирования с использованием языка С++?
* Шаблоны, а точнее обработка ошибок компиляции с ними. Говорят что сейчас ситуация лучше, но прекрасно помню моё (мягко скажу) удивление, когда на забытую ";" после объявления класса в заголовочном файле, компилятор выдал больше 200 строк ошибок, показывающих что угодно, только не точку с запятой.
* Я хотел бы не называть .h(pp)+.c(cpp) идиотской, поскольку (наверно) есть случаи когда это полезно, но всё-же система идиотская, для ускорения компиляции которой придумали всякого рода костыли, вроде precompiled headers.
* CPPшники никогда не признают что в языке хреновая стандартная библиотека, но она всё-же хреновая.
* Сам язык использующий указание значимых конструкция без ключевых слов, т.е. допустим copy constructor обозначается как (const type &var), пропустил "const" или "&" и внезапно у объекта нет копирующего конструктора, и компилятор это не смущает. Почему нельзя было ввести явное указание — хз. А есть ещё move constructor (и хрен знает что ещё — не слежу за текущей ситуацией), который опять же объявляется соглашением.
Здравствуйте, Somescout, Вы писали:
S>Здравствуйте, rudzuk, Вы писали:
R>>
S>Типа это всё поклёп и C++ никогда не выдаёт таких ошибок?
Типа С++ тут не при чем, это свойство среды исполнения.
Нет песочницы — получайте такие ошибки. На любом языке. И паскаль, и Си, и всякие
новомодные Rust`ы могут быть языками, на которых потенциально будут написаны приложения, падающие таким образом.
А раз это свойство не является целиком и полностью присущим только С++,
то и записывать его в причины ненависти как-то не стоит.
Здравствуйте, bc_kaya, Вы писали:
_>Хотел бы поинтересоваться у знающих людей, за что весь мир недолюбливает плюсы.
Честно говоря я такого не замечал.
В интернете есть парочка статей с критикой и отзывы Торвальдса, критика эта разной степени адекватности.
Некоторые люди на форумах яро ругают ( можно сказать с пеной у рта ).
Но это разве весь мир?
По-моему нет.
За пределами интернета я очень и очень редко слышу негативные отзывы, общаюсь много с разработчиками из других организаций (и на других языках),
командировки бывают в разные совершенно места. Не видел тенденции негативной.
Я вообще не понимаю, чего ругать-то? Ну не подходит он если кому-то — ну возьмут они другой инструмент.
Появится для него адекватная замена в текущих нишах, ну заменят. Вон как в десктопной винды его выгнали.
Разве кто-то умер от этого?
Честное слово, посмотришь на этих ругателей — фанатики. Чего их слушать-то?
scf>- библиотеки и управление зависимостями. Для C/С++ есть всё, но найти, подключить и начать использовать чужие библиотеки — нетривиально.
Эт смотря какие. Qt работает из коробки. scf>- бедная стандартная библиотека. Хочется нормальную юникодную строку с поддержкой кодировок, регулярок и богатого набора операций. Хочется качественные многопоточные коллекции. Хочется нормальные функции для работы со временем с поддержкой часовых поясов. и т.д. и т.п.
В стандарте С++17 все это есть.
В стандарте С++14 не было только многопоточных контейнеров. scf>- феерическая сложность языка и сложность написания качественного (устойчивого к утечкам памяти и exception-safe) кода
Феерическая сложность ТОЛЬКО при ГЛУБОКОМ использовании шаблонов.
Без шаблонов С++ не сложнее паскаля. scf>- значительно меньшая терпимость программы к ошибкам программиста — где managed язык отделается exception-ом, программу на C++ лучше прибить. Это ограничивает применимость в серверных приложениях
да, писать на С++ — не для среднего программиста... scf>- типы ошибок, которых нет в managed языках: порча памяти, утечки памяти
Ну, сказть ничего не могу — не писал серьезных программ на других языках.
Но по опыту могу сказать, что в других языках — свои проблемы... scf>- менее развитый тулинг для отладки, логгирования и обнаружения проблем
Не понял? Мне так отладчик нужен ОЧЕНЬ редко... scf>- время компиляции
Зато время работы!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Somescout, Вы писали:
S>* Шаблоны, а точнее обработка ошибок компиляции с ними. Говорят что сейчас ситуация лучше, но прекрасно помню моё (мягко скажу) удивление, когда на забытую ";" после объявления класса в заголовочном файле, компилятор выдал больше 200 строк ошибок, показывающих что угодно, только не точку с запятой.
200 — ещё мало. Я четыре тысячи получал (и то, gcc сказал, что он урезал самые многословные куски).
boost::spirit, в semantic action, вписав функцию, забыл удалить прежнее простое выражение.
Дочитав до конца, я таки понял с точностью до строки, где случилась проблема, но не её суть
S>* CPPшники никогда не признают что в языке хреновая стандартная библиотека, но она всё-же хреновая.
Тут таки надо какое-то обоснование — чего именно не хватает или что не так сделано.
S>* Сам язык использующий указание значимых конструкция без ключевых слов, т.е. допустим copy constructor обозначается как (const type &var), пропустил "const" или "&" и внезапно у объекта нет копирующего конструктора, и компилятор это не смущает. Почему нельзя было ввести явное указание — хз. А есть ещё move constructor (и хрен знает что ещё — не слежу за текущей ситуацией), который опять же объявляется соглашением.
Согласен. Но начинать надо с отсутствия слов var и func.
Здравствуйте, scf, Вы писали:
scf>Мы все-таки в 21 веке живем. Всё уже есть — и симпатичные стектрейсы с символами, и дампы с возможностью поднять отладчик, и отправка отчетов на сервер разработчику.
И фиг они чем помогут в ситуации "структуры порушены несколько минут назад совершенно другим кодом, каким — ХЗ".
Здравствуйте, bc_kaya, Вы писали:
_>Хотел бы поинтересоваться у знающих людей, за что весь мир недолюбливает плюсы. Конкретно у меня данный язык вызывает симпатию (возможно потому, что это мой самый первый более менее освоенный язык программирования); _>Поделитесь впечатлением и опытом программирования с использованием языка С++? _>Холивары просьба не разводить, иначе уйдём не в ту степь обсуждения
1. Основная маса проблем C++ происходят из синтаксического наследия, а именно, синтаксиса объявлений, доставшегося из C, а там — по инерции из предшественников.
Когда пишешь "int i" вместо "var i: int" это удобно. Но немасштабируемо. Уже конструкции типа "int (*f)(void)" вызывают проблемы понимания и необходимость тренировки выворачивать парсер в мозгу. Усложнение этого хотя бы до уровня "функция, возвращающая указатель на функцию" доводит до того, что нормально пишется только с промежуточным typedef.
Когда из этого возникает most vexing parse, а затыкается мерами типа {} в инициализации (C++11); когда ты не знаешь заранее смысл синтаксической конструкции, написанной тобой (или такое с похожим результатом) и он может меняться от непредсказуемых заранее факторов...
Обратный сишному порядок объявлений (назовём его "паскалевским") многословнее, но принципиально полезнее для сложных конструкций.
2. Калечные эффекты с undefined behavior в местах, совершенно неожиданных для многих и особенно тех, кто не прошёл неплановые курсы "здесь водятся драконы". Арифметика
Самое тяжёлое то, что, да, такие степени свободы компилятора полезны для оптимизации, но само оно ускоряет с пользой дай бог чтобы 5% кода, а бороться с ними приходится и в оставшихся 95%. По-нормальному надо было бы регулировать все эти суперфичи контекстными опциями, с умолчанием на запрещение свободы компилятору.
3. Таки да, шаблоны, а именно — попытка их уложить в те же синтаксически ущербные рамки и "не вводить лишних сущностей", приводящая к фокусам типа std::enable_if.
4. Необходимость одновременно мыслить на нескольких разных уровнях — от высот рекурсивных шаблонов до укладки битов в памяти.
Всё сказанное выше — результат исторического развития методом "каждый раз шаг, полностью логичный из предыдущего состояния, но в новом направлении".
Здесь ещё обсуждаются следствия прямого управления памятью, но я их не включаю в этот набор — они будут неизбежны для любого языка с такими возможностями.